Hwc2Test.cpp revision 1cd789cd2b300427467586f4ec721a8123f118b7
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
5621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, hwc2_error_t* outErr)
5641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
5661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
5671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
5681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
5701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumTypes, outNumRequests));
5711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, bool* outHasChanges)
5751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
5791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumRequests, &err));
5801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err != HWC2_ERROR_HAS_CHANGES) {
5821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = false;
5831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
5841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        } else {
5851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = true;
5861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
5871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
5904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
5914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
5934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
5964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
5984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
6004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
6014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
6024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
6034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
6044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
6054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
6064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
607cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
608cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
609cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
610cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
611cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
612cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
613cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
614cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
615cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
616cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
617cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
618cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
619cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
620cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
621cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
622cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
623cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
624cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
625cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
626cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
627cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
628cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
629cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
630cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
631cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
632cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
633cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
634cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
635cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
636cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
637cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
638cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
639cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
640cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
641cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
642cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
643cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
644cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
645cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
646cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
647cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
648cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
6491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
6501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
6511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
6521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
6531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
6541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
6551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
6561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
6581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
6601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
6611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
6621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
6631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
6641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
6651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
6661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
6671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
6681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
6701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
6731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
6741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
6751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
6761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
6781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
6791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
680cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
681cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
682cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
683cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
684cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
685cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
686cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
687cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
688cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
689cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
690cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
691cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
692cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
693cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
694cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
695cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
696cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
697cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
698cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
699cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
700572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
701572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
702572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
703572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
704572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
705572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
706572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
707572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
708572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
709572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
710572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
711572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
712572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
713572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
714572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
715572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
716572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
717572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
718572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
719572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
720572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
721572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
722572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
723572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
724572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
725572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
7266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
7276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
7305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
732273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
733273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
734273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
735273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
7365a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
737273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
7386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
7396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
7406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
7416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
7425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
7436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
7456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
7466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
7476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
7486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* Is called after a display is powered on and all layer properties have
7501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * been set. It should be used to test functions such as validate, accepting
7511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * changes, present, etc. */
7521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
7531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            hwc2_display_t display, const std::vector<hwc2_layer_t>& layers);
7541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
7566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
7576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
758f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Advances properties of Hwc2TestLayers */
759f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
760f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
7646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
7656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
774600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
777600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
778600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
779600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
7866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
7956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
7966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
7976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
7986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
806600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
8076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
809600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
810600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
811600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
8126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
8166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
8186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
8196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
825273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
826273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
827273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
828273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
829273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
830f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            TestLayerPropertiesFunction function, AdvanceProperties advance)
831273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
832273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
833273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
834273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
835273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
836273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
837273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
838273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
839600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
840273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
841273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
842600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
843600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
844273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
845273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
846600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
847273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
848f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                do {
849f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    for (auto layer : layers) {
850f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
851f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                                &testLayers));
852f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    }
853f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                } while (advance(&testLayers));
854273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
855273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
856273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
857273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
858273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
859273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
8606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
8616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
8626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
8636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
8646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
8656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
8666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
8676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
8686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
8696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
877600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
8786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
881600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
882600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
883600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
8846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
8925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
8946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
8985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
8996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
9006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
9016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
9026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
9056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
9066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
9076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
9086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
9096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
9106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
9116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
9136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
9156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
9166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
9176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
9196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
9216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
9236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
9246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
9256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
9276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
9286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
9296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* For each active display it powers on the display, cycles through each
9321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * config and creates a set of layers with a certain amount of coverage.
9331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * For each active display, for each config and for each set of layers,
9341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * it calls the TestDisplayLayersFunction */
9351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
9361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            TestDisplayLayersFunction function)
9371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
9381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto display : mDisplays) {
9391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            std::vector<hwc2_config_t> configs;
9401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
9421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
9441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            for (auto config : configs) {
9461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Area displayArea;
9471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                std::vector<hwc2_layer_t> layers;
9481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
9501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
9511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
9531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
9541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                do {
9561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    bool skip;
9571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
9591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            &testLayers, &skip));
9601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    if (!skip)
9611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layers));
9621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                } while (testLayers.advance());
9641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
9661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        std::move(layers)));
9671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
9681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
9691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
9701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
9711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
9721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
973600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
974600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
975600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
976600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
977600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
978600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
979600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
980600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
981600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
982600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
983600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
984600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
985600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
986600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
987600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
988600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
989600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
990600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
991600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
9921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
9931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
9941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
9951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_composition_t composition;
9961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        buffer_handle_t handle = nullptr;
9971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        int32_t acquireFence;
9981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
9991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = true;
10001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (!testLayers->contains(layer))
10021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
10031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        composition = testLayers->getComposition(layer);
10051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        /* If the device cannot support a buffer format, then do not continue */
10071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if ((composition == HWC2_COMPOSITION_DEVICE
10081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                || composition == HWC2_COMPOSITION_CURSOR)
10091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
10101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
10111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
10131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                composition, &err));
10141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err == HWC2_ERROR_UNSUPPORTED)
10151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
10161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    && composition != HWC2_COMPOSITION_DEVICE);
10171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
10191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
10211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                acquireFence));
10221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
10231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getBlendMode(layer)));
10241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
10251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getColor(layer)));
10261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
10271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                cursor.top));
10281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
10291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDataspace(layer)));
10301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
10311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDisplayFrame(layer)));
10321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
10331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getPlaneAlpha(layer)));
10341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
10351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSourceCrop(layer)));
10361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
10371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSurfaceDamage(layer)));
10381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
10391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getTransform(layer)));
10401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
10411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getVisibleRegion(layer)));
10421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
10431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getZOrder(layer)));
10441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = false;
10461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
10471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display,
10491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            const std::vector<hwc2_layer_t>& layers,
10501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
10511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
10521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto layer : layers) {
10531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
10541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    testLayers, outSkip));
10551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            if (*outSkip)
10561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                return;
10571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
10581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
10591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
10604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
1061cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1062cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
1063cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
1064cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
1065cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
1066cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
1067cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1068cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
1069cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
1070cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1071cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
10721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
10731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
10741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
10751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
107603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
107703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
107803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
107903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
1080572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1081572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
1082572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
1083572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
1084572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
10854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
10864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1087cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1088cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
1089cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1090cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
1091cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1092cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
1093cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1094cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1095572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1096572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
1097572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1098572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
1099572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1100572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
1101572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1102572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1103ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1105ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1106ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
11075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
11085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
11095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
11105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
11125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
11135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
11145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
11155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
11165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
11175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
11185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
11195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
11205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
11215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
11225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
11235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
11245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
11255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
11265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
11275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
11285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
1129ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1130ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1131ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1133ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1134ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1135ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
1136ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
11375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
1138ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
11395a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
1140ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
11415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
1142ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1143ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
11446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
11466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
11475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
11486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
11496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
11516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
11526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
11536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
11546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
11556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
11566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
11586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
11596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
11606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
11616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
11626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
11636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
11646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
11665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
11672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
11682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
11692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
11702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
11715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
11722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
11732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
11742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
11752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1176b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1178b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1179b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
11805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1181b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1182b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1183600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1185600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1186600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
11875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1188600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1189600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
11902b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
11915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
11922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
11932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
11945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
11952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
11965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
11972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
11982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1199c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
12005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1201c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1202c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
12035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1204c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1205c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1206ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
12075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1208ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1209ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
12105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1211ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1212ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1213ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
12145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1215ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1216ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
12175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1218ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1219ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1220f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1221f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1222f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1223f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1224f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            testLayer->getVisibleRegion(), outErr));
1225f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1226f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1227273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
12285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1229273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1230273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
12315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1232273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1233273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1234ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1235ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1236ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1237ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1238ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
12395a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
12405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
12415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
12425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
12435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
12445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
12455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1246ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1247ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1248ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1249ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1250ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1251ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1252ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1253ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1254ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1255ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1256ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
12576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
12586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
12596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
12606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
12616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
12632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
12642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
12652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
12662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1267b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1268b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1269b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1270b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1271b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1272600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1273600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1274600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1275600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1276600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
12772b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
12782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
12792b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
12802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
12812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1282c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1283c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1284c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1285c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1286c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1287c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1288c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1289ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1290ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1291ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
1292ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
1293ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
1294ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1295ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1296ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1297ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1298ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1299ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1300ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1301f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1302f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1303f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return testLayers->advanceVisibleRegions();
1304f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1305f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
13064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
13074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
13084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
13094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
13104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
13114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
13124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
13134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
13144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
13154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
13164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
13174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
13184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
13194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
13204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
13214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
13224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
13234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
13244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
13254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
13264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
13274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
13284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
13294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
13304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
13314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
13324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
13334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
13344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
13354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
13364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
13374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
13384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
13394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
13404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
13414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
13424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
13434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
13444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
13454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
13464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
13474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
13484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
13494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
13504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
13514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
13524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
13534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
13544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
13554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
13564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
13574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
13584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
13594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
13604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
13614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
13624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
13634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
13644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
13654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
13664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
13674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
13684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
13694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
13704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
13714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
13724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
13734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
13744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
13754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
13764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
13774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
13784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1379a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1380a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1381a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1382a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1383a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1384a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1385a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1386a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1387a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1388a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1389a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1390a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1391a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1392a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1393a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1394a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1395a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1396a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1397a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1398a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1399a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1400a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1401a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1402a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1403a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1404a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1405a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1406a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1407a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1408a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1409a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1410a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1411a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1412a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1413a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1414a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1415a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1416a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1417a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1418a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1419a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1420a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1421cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1422cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1423cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1424cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1425cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1426cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1427cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1428cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1429cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1430cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1431cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1432cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1433cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1434cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1435cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1436cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1437cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1438cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1439cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1440cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1441cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1442cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1443cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1444cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1445cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1446cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1447cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
14481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
14501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
14511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
14521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
14531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
14541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
14561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
14581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
14591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
14601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
14621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
14631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
14641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
14651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
14661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
14671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
14691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
14711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
14721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
14731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
14751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
14761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
14771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
14781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
14791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
14811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
14821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
14841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
14861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
14871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
14881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
14901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
14911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
14921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
14931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
14951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
14961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
14971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
14981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
14991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
15011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
15021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
15041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
15061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
15071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
15091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
15101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
15111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
15131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
15141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
15151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
15161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
15171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
15181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
15201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
15231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
15261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
15291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
15321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
15351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
15371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
15401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
15421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
15431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
15441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1545cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1546cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1547cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1548cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1549cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1550cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1551cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1552cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1553cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1554cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1555cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1556cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1557cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1558cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1559cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1560cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1561cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1562cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1563cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1564cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1565cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1566cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1567cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1568cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1569cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1570cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1571cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1572cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1573cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1574cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1575cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1576cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1577cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1578cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1579cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1580cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1581cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1582cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1583cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1584cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1585cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1586cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1587cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1588cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1589cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1590cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1591cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1592cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1593cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1594cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1595cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1596cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1597cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1598cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1599cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1600cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1601cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1602cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1603cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1604cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1605cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1606cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1607cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1608cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1609cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1610cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1611cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1612cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1613cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1614cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1615cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1616cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1617cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1618cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1619cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1620cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1621cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1622cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1623cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1624cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1625cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1626cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1627cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1628cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1629cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1630cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1631cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1632cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1633cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1634cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1635cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1636cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1637cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1638cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1639cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1640cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1641cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1642cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1643cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1644cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1645cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1646cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1647cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1648cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1649cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1650cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1651cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1652cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1656cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1657cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1658cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1659cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1660cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1661cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1662cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1663cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1664cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1665cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1666cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1667cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1668cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1669cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1670cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1671cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1672cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1673cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1674cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1675cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1676cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1677cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1678cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1679cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1680cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1681cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1682cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1683cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1684cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1685cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1686cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1687cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1688cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1689cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1690cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1691cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1692cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1693cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1694cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1695cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1696cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1697cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1698cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1699cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1700cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1701cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1702cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1703cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1704cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1705cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1706cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1707cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
170893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
170993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
171093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
171193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
171293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
171393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
171493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
171593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
171693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
171793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
171893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
171993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
172093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
172193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
172293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
172393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
172493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
172593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
172693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
172793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
172893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
172993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
173093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
173193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
173293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
173393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
173493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
173593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
173693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
173793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
173893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
173993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
174093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
174193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
174293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
174393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
174493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
174593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
174693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
174793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
174893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
174993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
175093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
175193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
175293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
175393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
175493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
175593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
175693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
175793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
175893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
175993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
176093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
176193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
176293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
176393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
176493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
176593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
176693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
176793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
176893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
176993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
177093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
177193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
177293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
177393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
177493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
177593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
177693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
177793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
177893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
177993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
178093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
178193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
178293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
178393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
178493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
178593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
178693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
178793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
178893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
178993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
179093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
179193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
179293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
179393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
179493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
179593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
179693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
179793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
179893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
179993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
180093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
180193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
180293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
180393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
180493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
180593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
180693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
180793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
180893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
180903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
181003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
181103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
181203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
181303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
181403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
181503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
181603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
181703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
181803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
181903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
182003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
182103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
182203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
182303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
182403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
182503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
182603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
182703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
182803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
182903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
183003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
183103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
183203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
183303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
183403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
183503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
183603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
183703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
183803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
183903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
184003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
184103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
184203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
184303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
184403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
184503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
184603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
184703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
184803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
184903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
185003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
185103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
185203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
185303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
185403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
185503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
185603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
185703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
185803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
185903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
186003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
186103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
186203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
186303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
186403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
186503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
186603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
186703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
186803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
186903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
187003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
187103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
187203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
187303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
187403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
187503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
187603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
187703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
187803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
187903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
188003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
188103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
188203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
188303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
188403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
188503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
188603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
188703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
188803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
188903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
189003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
189103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
189203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
189303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
189403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
189503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
189603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
189703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
189803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
189903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
190003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
190103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
190203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
190303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
190403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
190503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
190603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
190703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
190803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
190903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
191003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
191103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
191203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
191303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
191403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
191503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
191603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
191703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
191803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
191903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
192003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
192103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
192203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
192303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
192403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
192503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
192603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
192703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
192803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
192903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
193003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
193103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
193203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
193303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
193403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
193503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
193603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
193703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
193803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
193903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
194003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
194103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
194203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
194303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
194403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
194503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
194603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
194703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
194803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
194903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1950572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1951572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1952572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1953572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1954572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1955572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1956572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1957572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1958572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1959572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1960572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1961572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1962572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1963572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1964572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1965572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1966572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1967572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1968572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1969572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1970572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1971572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1972572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1973572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1974572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1975572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1976572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1977572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1978572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1979572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1980572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1981572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1982572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1983572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1984572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1985572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1986572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1987572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1988572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1989572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1990572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1991572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1992572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1993572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1994572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1995572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1996572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1997572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1998572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1999572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2000572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
2001572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2002572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2003572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2004572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2005572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2006572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
2007572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2008572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2009572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2010572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2011572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2012572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2013572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2014572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2015572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2016572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2017572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2018572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2019572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2020572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2021572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2022572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2023572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2024572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2025572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2026572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2027572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2028572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2029572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
2030572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2031572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2032572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2033572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2034572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2035572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2036572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2037572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
2038572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2039572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2040572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2041572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2042572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2043572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2044572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2045572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2046572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2047572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2048572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2049572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2050572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2051572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2052572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2053572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2054572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2055572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2056572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2057572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2058572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2059572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2060572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2061572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2062572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
2063572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2064572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2065572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2066572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2067572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2068572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2069572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2070572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2071572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2072572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2073572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2074572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2075572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2076572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2077572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
2078572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2079572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2080572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2081572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2082572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2083572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2084572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2085572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2086572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2087572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2088572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2089572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2090572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2091572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2092572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2093572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2094dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2095dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2096dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
2097dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2098dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
2099dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
2100dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2101dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2102dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
2103dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
2104dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2105dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2106dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
2107dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2108dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2109dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
2110dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
2111dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2112dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2113dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2114dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2115dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2116dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2117dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
21186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
21196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
21206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
21216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
21226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
21236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
21246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
21256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
21266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
21276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
21286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
21296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
21306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
21316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
21326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
21336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
21346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
21356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
21366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
21376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
21386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
21396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
21406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
21416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
21426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
21436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
21446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
21456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
21466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
21476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
21486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
21496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
21506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
21516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
21526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2153ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
21542a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
21552a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
21562a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
21572a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
21582a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
21592a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
21602a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21612a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
21622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
21632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
21642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
21652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
21662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
21672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
21692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
21702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
21712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
21722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
21732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
21745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
21752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
21772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
21782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
21792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
21802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
21822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
21832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
21852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
21862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
21872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
21882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
21892a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
21902a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
21912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
21922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
21942a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21952a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
21962a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
21972a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
21982a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
21992a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
22002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
22012a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
22022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
22032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
22045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
22052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
22065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
22072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
22082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
22092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
22102a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
22112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
22122a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
22132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2214ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2215ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2216ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2217ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2218ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2219ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2220ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2221ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2222ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2223ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2224ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2225ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2226ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2227ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2228ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2229ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2230ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2231ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2232ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2233ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2234ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2235ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2236ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2237ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2238ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2239ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2240ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2241ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2242ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2243ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2244ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2245ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2246ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2247b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
22485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
22495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
22505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
22515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
22525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
22535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
22545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
22565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
22575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
22585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
22595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
22605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
22615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22625a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
22635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
22645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
22655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
22665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
22675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
22685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22695a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
22705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
22715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
22735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
22745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
22755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
22765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
22775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
22785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
22805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
22815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
22825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
22835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
22845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
22865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
22875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
22885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
22895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
22905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
22915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
22935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
22945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
22955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
22965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
22975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
22985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
22995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
23005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
2301ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2302ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
2303ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2304ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2305ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2306ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2307ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2308ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2309ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2310ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2311ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2312ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2313ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2314ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2315ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2316ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2317ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2318ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2319ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2320ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
23215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2322ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2323ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
23245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2325ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
2326ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2327ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
2328ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2329ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2330ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2331ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2332ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2333ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2334ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
23355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2336ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2337ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
23385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2339ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
2340ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
2341ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2342ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2343b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2344b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2345b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2346b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2347b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2348b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2349b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2350b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2351b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2352b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2353b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2354b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2355b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2356b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2357b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2358b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2359b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2360b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2361b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
2362b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
23632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2364600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2365600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2366600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2367600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2368600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2369600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2370600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2371600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2372600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2373600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2374600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2375600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2376600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2377600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2378600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2379600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2380600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2381600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2382600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
2383600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2384600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
23852b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
23862b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
23872b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
23882b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
23892b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
23902b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
23912b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
23922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
23932b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
23942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
23952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
23962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
23972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
23982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
23992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
24002b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
24012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
24022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
24032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
24045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
24052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
24062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
24075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
24082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
24092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
24102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2411ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2412c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2413c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2414c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2415c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2416c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2417c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2418c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2419c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2420c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2421c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2422c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2423c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2424c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2425c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2426c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2427c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2428c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2429c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2430c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2431c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2432c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2433ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2434ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2435ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2436ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2437ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2438ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2439ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2440ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2441ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2442ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2443ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2444ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2445ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2446ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2447ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2448ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2449ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2450ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2451ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
2452ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2453ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2454ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2455ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2456ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2457ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2458ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2459ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2460ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2461ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2462ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2463ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2464ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2465ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2466ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2467ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2468ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2469ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2470ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2471ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2472ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2473ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2474273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2475f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2476f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2477f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2478f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2479f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2480f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    Hwc2TestLayers* testLayers) {
2481f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2482f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2483f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        layer, testLayers->getVisibleRegion(layer)));
2484f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2485f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2486f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            advanceVisibleRegions));
2487f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2488f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2489f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2490f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2491f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2492f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2493f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            setVisibleRegion));
2494f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2495f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2496273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2497273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2498273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2499273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2500273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
25015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
2502273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2503273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
25045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
2505f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2506f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2507f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            /* TestLayer z orders are set during the construction of TestLayers
2508f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * and cannot be updated. There is no need (or ability) to cycle
2509f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * through additional z order configurations. */
2510f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2TestLayers* /*testLayers*/) {
2511f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                return false;
2512273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2513273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2514273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2515273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2516273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2517273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2518273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2519273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2520273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2521273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2522273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2523273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2524273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
2525273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
2526273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2527273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2528273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2529273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
2530273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
2531273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2532273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2533273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2534273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2535273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2536273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
2537273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2538273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2539273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2540273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2541273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
2542273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
2543273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2544273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2545273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2546273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2547273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2548273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2549273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
2550273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
25511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display a layer with basic property
25531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * coverage */
25541cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
25551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
25561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
25571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
25581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    const std::vector<hwc2_layer_t>& layers) {
25591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
25611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
25621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
25641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
25651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
25661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
25671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
25681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
25691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
25701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
25711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
25731cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
25741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
25751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
25761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
25771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    const std::vector<hwc2_layer_t>& layers) {
25781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
25801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
25811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
25831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
25841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
25851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
25861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
25871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
25881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
25891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
25901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
25921cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
25931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
25941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_display_t display;
25951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    uint32_t numTypes, numRequests;
25961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
25971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
25981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
25991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
26001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
26011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            &err));
26021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
26031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
2604