Hwc2Test.cpp revision f18cfb0a780c69f12439457ccc3f5272db767fdd
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"
32f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall#include "Hwc2TestClientTarget.h"
336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
34cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
35cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
36572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
37572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
38cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
55cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
56cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
97a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
98a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
128cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
129cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
216cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
29003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
29103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
315572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
316572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
344dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
345dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
3642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
3652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    {
3662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
3672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
3682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
3702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
3712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                y));
3722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        if (outErr) {
3732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            *outErr = err;
3742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        } else {
3752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
3762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        }
3772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    }
3782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
379ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
380ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
381ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
382ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
383ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
384ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
385ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
386ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
387ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
388ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
389ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
390ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
391ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
392ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
393ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
394ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
395ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
3965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
3975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            buffer_handle_t buffer, int32_t acquireFence,
3985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            hwc2_error_t* outErr = nullptr)
3995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    {
4005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
4015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
4025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
4045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer, acquireFence));
4065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        if (outErr) {
4075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            *outErr = err;
4085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        } else {
4095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
4105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        }
4115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    }
4125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
413ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
414ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
415ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
416ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
417ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
418ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
419ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
420ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
421ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
422ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
423ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
424ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
425ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
426ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
427ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
428ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
429b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
430b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
431b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
432b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
433b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
434b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
435b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
436b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
437b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
438b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
439b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
440b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
441b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
442b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
443b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
444b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
445600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
446600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
447600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
448600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
449600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
450600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
451600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
452600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
453600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
454600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
455600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
456600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
457600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
458600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
459600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
460600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
461600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4642b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4662b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4682b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4692b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4702b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4712b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4752b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
479c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
480c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
481c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
482c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
483c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
484c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
485c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
486c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
487c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
488c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
489c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
490c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
491c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
492c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
493c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
494c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
495ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
496ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
497ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {
498ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
499ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
500ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
501ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
502ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
503ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                surfaceDamage));
504ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (outErr) {
505ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            *outErr = err;
506ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        } else {
507ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
508ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                    " damage";
509ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        }
510ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
511ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
512ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
513ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
514ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
515ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
516ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
517ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
518ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
519ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
520ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
521ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
522ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
523ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
524ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
525ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
526ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
527ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
528ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
529f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
530f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
531f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    {
532f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
533f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
534f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
535f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
536f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
537f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                visibleRegion));
538f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        if (outErr) {
539f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            *outErr = err;
540f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        } else {
541f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
542f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    " region";
543f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        }
544f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
545f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
546273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
547273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
548273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
549273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
550273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
551273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
552273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
553273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
554273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
555273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
556273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
557273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
558273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
559273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
560273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
561273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
562273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, hwc2_error_t* outErr)
5651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
5671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
5681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
5691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
5711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumTypes, outNumRequests));
5721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, bool* outHasChanges)
5761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
5801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumRequests, &err));
5811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err != HWC2_ERROR_HAS_CHANGES) {
5831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = false;
5841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
5851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        } else {
5861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = true;
5871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
5881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
590706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void getDisplayRequests(hwc2_display_t display,
591706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_request_t* outDisplayRequests,
592706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
593706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_request_t>* outLayerRequests,
594706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
595706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
596706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
597706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
598706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
599706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
600706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        uint32_t numElements = 0;
601706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
602706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
603706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
604706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                nullptr, nullptr));
605706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
606706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (err == HWC2_ERROR_NONE && numElements > 0) {
607706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayers->resize(numElements);
608706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayerRequests->resize(numElements);
609706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
610706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
611706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
612706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<uint64_t*>(outLayers->data()),
613706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outLayerRequests->data())));
614706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
615706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
616706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
617706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
618706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
619706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
620706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
621706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
622706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
623706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void handleRequests(hwc2_display_t display,
624706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
625706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::set<hwc2_layer_t>* outClearLayers = nullptr,
626706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool* outFlipClientTarget = nullptr)
627706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
628706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        hwc2_display_request_t displayRequest =
629706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                static_cast<hwc2_display_request_t>(0);
630706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_t> requestedLayers;
631706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_request_t> requests;
632706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
633706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
634706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &requestedLayers, &requests));
635706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
636706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        EXPECT_EQ(numRequests, requests.size()) << "validate returned "
637706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << numRequests << " requests and get display requests returned "
638706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << requests.size() << " requests";
639706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
640706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (size_t i = 0; i < requests.size(); i++) {
641706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_layer_t requestedLayer = requestedLayers.at(i);
642706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_layer_request_t request = requests.at(i);
643706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
644706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
645706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    0) << "get display requests returned an unknown layer";
646706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NE(request, 0) << "returned empty request for layer "
647706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    << requestedLayer;
648706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
649706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            if (outClearLayers && request
650706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
651706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                outClearLayers->insert(requestedLayer);
652706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
653706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
654706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outFlipClientTarget)
655706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outFlipClientTarget = displayRequest
656706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
657706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
658706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
659706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void getChangedCompositionTypes(hwc2_display_t display,
660706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
661706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_composition_t>* outTypes,
662706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
663706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
664706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
665706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
666706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
667706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
668706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        uint32_t numElements = 0;
669706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
670706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
671706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &numElements, nullptr, nullptr));
672706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
673706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (err == HWC2_ERROR_NONE && numElements > 0) {
674706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayers->resize(numElements);
675706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outTypes->resize(numElements);
676706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
677706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
678706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
679706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outTypes->data())));
680706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
681706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
682706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
683706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
684706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
685706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
686706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    " composition types";
687706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
688706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
689706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
690706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void handleCompositionChanges(hwc2_display_t display,
691706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const Hwc2TestLayers& testLayers,
692706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
693706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::set<hwc2_layer_t>* outClientLayers = nullptr)
694706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
695706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_t> changedLayers;
696706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_composition_t> types;
697706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
698706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
699706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &changedLayers, &types));
700706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
701706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        EXPECT_EQ(numTypes, types.size()) << "validate returned "
702706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << numTypes << " types and get changed composition types"
703706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                " returned " << types.size() << " types";
704706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
705706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (size_t i = 0; i < types.size(); i++) {
706706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
707706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            auto layer = std::find(layers.begin(), layers.end(),
708706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    changedLayers.at(i));
709706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
710706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
711706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    << "get changed composition types returned an unknown layer";
712706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
713706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_composition_t requestedType = testLayers.getComposition(*layer);
714706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_composition_t returnedType = types.at(i);
715706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
716706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
717706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    " composition types returned invalid composition";
718706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
719706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            switch (requestedType) {
720706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_CLIENT:
721706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(false) << getCompositionName(returnedType)
722706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " cannot be changed";
723706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
724706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_DEVICE:
725706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_SOLID_COLOR:
726706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
727706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "composition of type "
728706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType)
729706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " can only be changed to "
730706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_CLIENT);
731706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
732706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_CURSOR:
733706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_SIDEBAND:
734706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
735706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        || returnedType == HWC2_COMPOSITION_DEVICE)
736706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "composition of type "
737706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType)
738706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " can only be changed to "
739706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
740706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_DEVICE);
741706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
742706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            default:
743706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(false) << "unknown type "
744706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType);
745706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
746706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
747706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
748706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            if (outClientLayers)
749706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (returnedType == HWC2_COMPOSITION_CLIENT)
750706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    outClientLayers->insert(*layer);
751706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
752706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
753706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outClientLayers) {
754706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
755706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
756706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    outClientLayers->insert(layer);
757706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
758706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
759706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
760706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
761706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void acceptDisplayChanges(hwc2_display_t display,
762706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
763706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
764706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
765706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
766706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
767706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
768706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
769706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
770706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
771706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
772706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
773706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
774706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
775706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
776f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getClientTargetSupport(hwc2_display_t display, int32_t width,
777f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            int32_t height, android_pixel_format_t format,
778f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
779f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
780f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
781f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
782f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
783f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
784f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
785f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                height, format, dataspace));
786f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (outErr) {
787f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            *outErr = err;
788f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
789f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
790f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    " support";
791f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
792f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
793f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
794f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
795f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            int32_t acquireFence, android_dataspace_t dataspace,
796f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc_region_t damage, hwc2_error_t* outErr = nullptr)
797f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
798f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
799f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
800f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
801f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
802f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
803f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                acquireFence, dataspace, damage));
804f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (outErr) {
805f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            *outErr = err;
806f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
807f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
808f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
809f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
810f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
811f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
812f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
813f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
814f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (mDisplays.count(display) == 0) {
815f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                *outDisplay = display;
816f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                return;
817f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
818f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
819f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
820f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                " are registered. This should never happen.";
821f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
822f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
8234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
8244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
8254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
8264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
8274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
8284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
8294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
8304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
8314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
8324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
8334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
8344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
8354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
8364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
8374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
8384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
8394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
8404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
841cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
842cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
843cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
844cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
845cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
846cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
847cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
848cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
849cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
850cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
851cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
852cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
853cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
854cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
855cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
856cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
857cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
858cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
859cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
860cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
861cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
862cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
863cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
864cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
865cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
866cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
867cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
868cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
869cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
870cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
8711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
8721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
8731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
8741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
8751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
8761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
8771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
8781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
8801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
8821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
8831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
8841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
8851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
8861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
8871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
8881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
8891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
8901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
8921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
8931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
8951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
8961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
8971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
8981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
9001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
9011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
902cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
903cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
904cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
905cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
906cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
907cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
908cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
909cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
910cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
911cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
912cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
913cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
914cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
915cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
916cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
917cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
918cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
919cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
920cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
921cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
922572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
923572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
924572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
925572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
926572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
927572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
928572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
929572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
930572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
931572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
932572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
933572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
934572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
935572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
936572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
937572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
938572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
939572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
940572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
941572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
942572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
943572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
944572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
945572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
946572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
947572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
9486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
9496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
9506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
9516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
9525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
9536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
954273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
955273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
956273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
957273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
9585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
959273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
9606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
9616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
9626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
9636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
9645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
9656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
9676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
9686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
9696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
9706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* Is called after a display is powered on and all layer properties have
9721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * been set. It should be used to test functions such as validate, accepting
9731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * changes, present, etc. */
9741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
975706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
976706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const Hwc2TestLayers& testLayers);
977706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
978706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* It is called on an non validated display */
979706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
980706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
9811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
982f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Tests client target support on a particular display and config */
983f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
984f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc2_display_t display,
985f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            const Hwc2TestClientTargetSupport& testClientTargetSupport);
986f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
9876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
9886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
9896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
990f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Advances properties of Hwc2TestLayers */
991f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
992f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
993f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Advances properties of Hwc2TestClientTargetSupport */
994f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using AdvanceClientTargetSupport = bool (*)(
995f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTargetSupport* testClientTargetSupport);
996f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
9976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
9986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
9996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
10006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
10016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
10026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
10036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
10046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
10056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
10076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
10096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1010600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
10116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1013600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1014600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1015600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
10166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
10186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
10196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
10215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
10226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
10246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
10256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
10266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
10276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
10286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
10306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
10316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
10326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
10336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
10346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
10356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
10366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
10376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
10396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
10416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1042600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
10436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1045600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1046600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1047600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
10486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
10506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
10526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
10535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
10546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
10556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
10576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
10586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
10596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
10606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1061273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
1062273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
1063273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
1064273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
1065273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
1066f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            TestLayerPropertiesFunction function, AdvanceProperties advance)
1067273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
1068273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
1069273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
1070273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1071273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1072273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1073273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
1074273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
1075600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
1076273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1077273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1078600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1079600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1080273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1081273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1082600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
1083273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1084f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                do {
1085f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    for (auto layer : layers) {
1086f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1087f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                                &testLayers));
1088f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    }
1089f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                } while (advance(&testLayers));
1090273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1091273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1092273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1093273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
1094273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
1095273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
10966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
10976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
10986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
10996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
11006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
11016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
11026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
11036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
11046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
11056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
11066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
11076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
11086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
11106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
11126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
1113600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
11146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
11156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1117600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1118600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1119600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
11206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
11225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
11236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
11285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
11296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
11345a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
11356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
11376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
11386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
11396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
11416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
11426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
11436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
11446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
11456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
11466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
11476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
11496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
11516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
11526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
11536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
11556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
11596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
11606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
11616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
11646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
11656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
11666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* For each active display it powers on the display, cycles through each
11681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * config and creates a set of layers with a certain amount of coverage.
11691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * For each active display, for each config and for each set of layers,
11701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * it calls the TestDisplayLayersFunction */
11711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
11721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            TestDisplayLayersFunction function)
11731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
11741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto display : mDisplays) {
11751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            std::vector<hwc2_config_t> configs;
11761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
11781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
11801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            for (auto config : configs) {
11821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Area displayArea;
11831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                std::vector<hwc2_layer_t> layers;
11841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
11861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
11871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
11891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
11901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                do {
11921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    bool skip;
11931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
11941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
11951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            &testLayers, &skip));
11961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    if (!skip)
1197706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
1198706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                                testLayers));
11991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                } while (testLayers.advance());
12011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
12031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        std::move(layers)));
12041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
12051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
12071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
12081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
12091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1210706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* For each active display, it calls the
1211706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1212706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * layer combinations */
1213706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void displayNonValidatedLayers(size_t layerCnt,
1214706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            TestDisplayNonValidatedLayersFunction function)
1215706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
1216706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (auto display : mDisplays) {
1217706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            uint32_t numTypes, numRequests;
1218706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t> layers;
1219706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool hasChanges;
1220706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1221706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1222706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1223706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1224706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1225706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1226706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1227706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1228706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1229706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1230706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1231706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_CLIENT));
1232706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1233706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1234706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1235706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1236706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1237706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numRequests, &hasChanges));
1238706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1239706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1240706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1241706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_DEVICE));
1242706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1243706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1244706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1245706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1246706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1247706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1248706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1249706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1250706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1251706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
1252706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
1253706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1254f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Test client target support on each config on each active display */
1255f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTargetSupport(Hwc2TestCoverage coverage,
1256f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            TestClientTargetSupportFunction function,
1257f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            AdvanceClientTargetSupport advance)
1258f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
1259f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto display : mDisplays) {
1260f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_config_t> configs;
1261f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1262f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1263f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1264f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            for (auto config : configs) {
1265f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Area displayArea;
1266f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1267f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1268f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1269f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &displayArea));
1270f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1271f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        displayArea);
1272f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1273f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                do {
1274f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display,
1275f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            testClientTargetSupport));
1276f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1277f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                } while (advance(&testClientTargetSupport));
1278f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
1279f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
1280f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
1281f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1282600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
1283600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
1284600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1285600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
1286600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1287600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1288600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
1289600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
1290600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
1291600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1292600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1293600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1294600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1295600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1296600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1297600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1298600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1299600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1300600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
13011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
13021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
13031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
13041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_composition_t composition;
13051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        buffer_handle_t handle = nullptr;
13061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        int32_t acquireFence;
13071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
13081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = true;
13091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (!testLayers->contains(layer))
13111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
13121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        composition = testLayers->getComposition(layer);
13141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        /* If the device cannot support a buffer format, then do not continue */
13161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if ((composition == HWC2_COMPOSITION_DEVICE
13171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                || composition == HWC2_COMPOSITION_CURSOR)
13181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
13191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
13201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
13221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                composition, &err));
13231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err == HWC2_ERROR_UNSUPPORTED)
13241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
13251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    && composition != HWC2_COMPOSITION_DEVICE);
13261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
13281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
13301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                acquireFence));
13311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
13321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getBlendMode(layer)));
13331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
13341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getColor(layer)));
13351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
13361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                cursor.top));
13371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
13381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDataspace(layer)));
13391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
13401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDisplayFrame(layer)));
13411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
13421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getPlaneAlpha(layer)));
13431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
13441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSourceCrop(layer)));
13451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
13461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSurfaceDamage(layer)));
13471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
13481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getTransform(layer)));
13491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
13501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getVisibleRegion(layer)));
13511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
13521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getZOrder(layer)));
13531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = false;
13551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
13561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display,
13581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            const std::vector<hwc2_layer_t>& layers,
13591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
13601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
13611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto layer : layers) {
13621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
13631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    testLayers, outSkip));
13641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            if (*outSkip)
13651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                return;
13661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
13671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
13681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
1370cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1371cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
1372cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
1373cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
1374cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
1375cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
1376cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1377cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
1378cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
1379cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1380cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
13811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
13821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
13831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
13841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
138503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
138603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
138703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
138803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
1389572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1390572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
1391572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
1392572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
1393572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
13944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
13954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1396cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1397cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
1398cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1399cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
1400cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1401cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
1402cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1403cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1404572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1405572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
1406572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1407572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
1408572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1409572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
1410572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1411572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1412ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
14135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1414ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1415ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
14165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
14175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
14185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
14195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
14205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
14215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
14225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
14235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
14245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
14255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
14265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
14275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
14285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
14295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
14305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
14315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
14325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
14335a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
14345a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
14355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
14365a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
14375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
1438ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1439ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1440ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
14415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1442ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1443ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1444ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
1445ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
14465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
1447ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
14485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
1449ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
14505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
1451ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1452ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
14536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
14545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
14556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
14565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
14576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
14586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
14596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
14606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
14616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
14626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
14636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
14646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
14656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
14666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
14676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
14686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
14696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
14706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
14716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
14726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
14736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
14742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
14755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
14762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
14772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
14782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
14792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
14805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
14812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
14822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
14832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
14842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1485b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
14865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1487b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1488b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
14895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1490b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1491b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1492600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
14935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1494600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1495600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
14965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1497600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1498600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
14992b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
15012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
15022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
15035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
15042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
15055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
15062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
15072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1508c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1510c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1511c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
15125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1513c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1514c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1515ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1517ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1518ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
15195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1520ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1521ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1522ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1524ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1525ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
15265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1527ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1528ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1529f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1530f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1531f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1532f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1533f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            testLayer->getVisibleRegion(), outErr));
1534f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1535f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1536273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1538273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1539273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
15405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1541273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1542273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1543ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1544ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1545ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1546ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1547ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
15485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
15495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
15505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
15515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
15525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
15535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
15545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1555ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1556ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1557ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1558ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1559ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1560ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1561ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1562ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1563ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1564ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1565ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
15666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
15676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
15686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
15696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
15706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
15712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
15722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
15732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
15742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
15752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1576b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1577b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1578b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1579b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1580b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1581600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1582600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1583600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1584600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1585600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
15862b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
15872b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
15882b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
15892b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
15902b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1591c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1592c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1593c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1594c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1595c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1596c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1597c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1598ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1599ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1600ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
1601ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
1602ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
1603ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1604ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1605ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1606ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1607ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1608ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1609ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1610f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1611f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1612f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return testLayers->advanceVisibleRegions();
1613f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1614f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1615f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool advanceClientTargetSupport(
1616f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        Hwc2TestClientTargetSupport* testClientTargetSupport)
1617f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
1618f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return testClientTargetSupport->advance();
1619f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
16204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
16214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
16224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
16234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
16244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
16254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
16264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
16274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
16284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
16294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
16304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
16314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
16324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
16334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
16344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
16354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
16364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
16374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
16384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
16394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
16404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
16414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
16424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
16434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
16444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
16454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
16464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
16474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
16484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
16494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
16504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
16514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
16524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
16534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
16544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
16554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
16564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
16574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
16584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
16594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
16604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
16614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
16624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
16634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
16644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
16654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
16664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
16674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
16684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
16694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
16704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
16714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
16724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
16734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
16744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
16754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
16764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
16774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
16784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
16794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
16804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
16814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
16824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
16834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
16844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
16854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
16864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
16874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
16884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
16894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
16904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
16914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
16924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1693a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1694a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1695a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1696a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1697a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1698a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1699a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1700a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1701a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1702a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1703a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1704a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1705a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1706a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1707a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1708a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1709a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1710a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1711a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1712a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1713a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1714a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1715a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1716a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1717a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1718a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1719a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1720a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1721a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1722a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1723a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1724a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1725a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1726a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1727a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1728a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1729a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1730a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1731a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1732a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1733a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1734a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1735cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1736cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1737cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1738cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1739cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1740cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1741cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1742cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1743cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1744cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1745cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1746cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1747cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1748cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1749cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1750cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1751cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1752cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1753cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1754cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1755cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1756cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1757cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1758cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1759cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1760cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1761cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
17621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
17641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
17651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
17661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
17671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
17681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
17701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
17721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
17731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
17741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
17761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
17771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
17781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
17791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
17801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
17811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
17831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
17851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
17861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
17871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
17891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
17901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
17911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
17921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
17931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
17951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
17961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
17981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
18001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
18011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
18021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
18041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
18051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
18061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
18071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
18091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
18111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
18121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
18131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
18151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
18161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
18181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
18201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
18211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
18231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
18241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
18251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
18271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
18281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
18291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
18301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
18311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
18321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
18341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
18371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
18401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
18431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
18461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
18491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
18511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
18541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
18551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
18561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
18571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
18581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1859cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1860cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1861cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1862cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1863cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1864cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1865cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1866cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1867cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1868cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1869cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1870cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1871cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1872cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1873cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1874cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1875cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1876cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1877cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1878cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1879cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1880cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1881cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1882cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1883cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1884cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1885cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1886cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1887cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1888cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1889cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1890cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1891cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1892cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1893cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1894cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1895cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1896cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1897cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1898cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1899cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1900cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1901cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1902cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1903cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1904cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1905cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1906cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1907cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1908cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1909cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1910cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1911cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1912cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1913cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1914cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1915cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1916cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1917cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1918cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1919cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1920cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1921cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1922cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1923cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1924cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1925cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1926cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1927cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1928cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1929cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1930cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1931cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1932cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1933cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1934cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1935cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1936cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1937cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1938cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1939cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1940cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1941cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1942cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1943cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1944cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1945cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1946cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1947cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1948cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1949cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1950cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1951cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1952cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1953cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1954cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1955cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1956cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1957cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1958cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1959cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1960cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1961cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1962cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1963cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1964cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1965cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1966cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1967cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1968cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1969cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1970cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1971cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1972cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1973cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1974cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1975cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1976cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1977cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1978cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1979cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1980cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1981cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1982cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1983cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1984cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1985cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1986cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1987cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1988cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1989cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1990cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1991cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1992cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1993cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1994cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1995cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1996cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1997cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1998cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1999cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2000cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2001cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2002cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2003cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2004cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
2005cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2006cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2007cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2008cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2009cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2010cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2011cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2012cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2013cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2014cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2015cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2016cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2017cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
2018cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2019cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
2020cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2021cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
202293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
202393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
202493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
202593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
202693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
202793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
202893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
202993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
203093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
203193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
203293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
203393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
203493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
203593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
203693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
203793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
203893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
203993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
204093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
204193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
204293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
204393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
204493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
204593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
204693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
204793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
204893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
204993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
205093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
205193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
205293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
205393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
205493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
205593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
205693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
205793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
205893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
205993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
206093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
206193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
206293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
206393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
206493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
206593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
206693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
206793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
206893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
206993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
207093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
207193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
207293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
207393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
207493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
207593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
207693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
207793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
207893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
207993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
208093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
208193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
208293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
208393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
208493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
208593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
208693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
208793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
208893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
208993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
209093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
209193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
209293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
209393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
209493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
209593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
209693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
209793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
209893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
209993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
210093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
210193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
210293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
210393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
210493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
210593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
210693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
210793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
210893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
210993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
211093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
211193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
211293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
211393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
211493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
211593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
211693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
211793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
211893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
211993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
212093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
212193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
212293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
212303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
212403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
212503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
212603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
212703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
212803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
212903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
213003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
213103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
213203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
213303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
213403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
213503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
213603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
213703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
213803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
213903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
214003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
214103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
214203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
214303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
214403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
214503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
214603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
214703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
214803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
214903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
215003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
215103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
215203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
215303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
215403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
215503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
215603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
215703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
215803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
215903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
216003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
216103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
216203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
216303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
216403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
216503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
216603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
216703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
216803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
216903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
217003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
217103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
217203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
217303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
217403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
217503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
217603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
217703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
217803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
217903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
218003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
218103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
218203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
218303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
218403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
218503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
218603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
218703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
218803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
218903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
219003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
219103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
219203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
219303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
219403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
219503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
219603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
219703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
219803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
219903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
220003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
220103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
220203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
220303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
220403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
220503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
220603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
220703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
220803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
220903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
221003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
221103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
221203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
221303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
221403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
221503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
221603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
221703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
221803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
221903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
222003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
222103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
222203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
222303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
222403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
222503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
222603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
222703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
222803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
222903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
223003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
223103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
223203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
223303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
223403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
223503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
223603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
223703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
223803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
223903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
224003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
224103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
224203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
224303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
224403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
224503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
224603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
224703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
224803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
224903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
225003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
225103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
225203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
225303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
225403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
225503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
225603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
225703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
225803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
225903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
226003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
226103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
226203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
226303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
2264572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2265572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2266572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
2267572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2268572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2269572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2270572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2271572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2272572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2273572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2274572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2275572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2276572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2277572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2278572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2279572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2280572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2281572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2282572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2283572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2284572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2285572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2286572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2287572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2288572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2289572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
2291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
2292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
2299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
2313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
2315572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2316572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2317572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2318572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2319572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2320572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
2321572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2322572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2323572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2324572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2325572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2326572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2327572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2328572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2329572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2330572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2331572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2332572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2333572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2334572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2335572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2336572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2337572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2338572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2339572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2340572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2341572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2342572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2343572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
2344572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2345572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2346572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2347572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2348572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2349572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2350572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2351572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
2352572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2353572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2354572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2355572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2356572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2357572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2358572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2359572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2360572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2361572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2362572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2363572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2364572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2365572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2366572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2367572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2368572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2369572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2370572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2371572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2372572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2373572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2374572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2375572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2376572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
2377572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2378572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2379572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2380572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2381572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2382572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2383572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2384572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2385572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2386572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2387572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2388572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2389572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2390572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2391572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
2392572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2393572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2394572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2395572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2396572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2397572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2398572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2399572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2400572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2401572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2402572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2403572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2404572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2405572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2406572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2407572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2408dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2409dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2410dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
2411dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2412dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
2413dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
2414dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2415dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2416dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
2417dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
2418dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2419dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2420dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
2421dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2422dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2423dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
2424dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
2425dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2426dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2427dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2428dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2429dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2430dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2431dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
24326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
24336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
24346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
24356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
24366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
24376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
24386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
24396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
24406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
24416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
24426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
24436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
24446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
24456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
24466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
24476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
24486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
24496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
24506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
24516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
24526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
24536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
24546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
24556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
24566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
24576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
24586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
24596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
24606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
24616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
24626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
24636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
24646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
24656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
24666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2467ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
24682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
24692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
24702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
24712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
24722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
24732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
24742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
24752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
24762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
24772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
24782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
24792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
24802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
24812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
24822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
24832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
24842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
24852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
24862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
24872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
24885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
24892a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
24905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
24912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
24922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
24932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
24942a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
24952a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
24962a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
24972a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
24982a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
24992a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
25002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
25012a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
25022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
25032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
25042a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
25052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
25062a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
25072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
25082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
25092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
25102a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
25112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
25122a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
25132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
25142a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
25152a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
25162a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
25172a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
25185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
25192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
25205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
25212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
25222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
25232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
25242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
25252a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
25262a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
25272a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2528ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2529ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2530ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2531ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2532ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2533ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2534ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2535ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2536ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2537ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2538ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2539ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2540ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2541ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2542ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2543ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2544ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2545ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2546ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2547ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2548ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2549ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2550ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2551ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2552ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2553ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2554ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2555ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2556ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2557ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2558ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2559ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2560ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2561b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
25625a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
25635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
25645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
25655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
25665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
25675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
25685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
25695a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
25705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
25715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
25725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
25735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
25745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
25755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
25765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
25775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
25785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
25795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
25805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
25815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
25825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
25835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
25845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
25855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
25865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
25875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
25885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
25895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
25905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
25915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
25925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
25935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
25945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
25955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
25965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
25975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
25985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
25995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
26005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
26015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
26025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
26035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
26045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
26055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
26065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
26075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
26085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
26095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
26105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
26115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
26125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
26135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
26145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
2615ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2616ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
2617ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2618ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2619ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2620ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2621ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2622ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2623ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2624ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2625ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2626ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2627ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2628ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2629ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2630ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2631ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2632ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2633ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2634ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
26355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2636ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2637ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
26385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2639ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
2640ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2641ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
2642ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2643ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2644ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2645ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2646ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2647ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2648ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
26495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2650ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2651ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
26525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2653ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
2654ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
2655ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2656ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2657b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2658b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2659b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2660b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2661b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2662b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2663b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2664b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2665b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2666b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2667b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2668b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2669b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2670b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2671b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2672b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2673b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2674b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2675b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
2676b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
26772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2678600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2679600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2680600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2681600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2682600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2683600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2684600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2685600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2686600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2687600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2688600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2689600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2690600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2691600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2692600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2693600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2694600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2695600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2696600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
2697600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2698600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
26992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
27002b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
27012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
27022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
27032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
27042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
27052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
27062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
27072b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
27082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
27092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
27102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
27112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
27122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
27132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
27142b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
27152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
27162b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
27172b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
27185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
27192b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
27202b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
27215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
27222b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
27232b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
27242b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2725ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2726c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2727c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2728c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2729c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2730c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2731c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2732c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2733c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2734c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2735c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2736c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2737c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2738c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2739c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2740c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2741c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2742c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2743c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2744c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2745c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2746c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2747ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2748ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2749ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2750ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2751ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2752ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2753ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2754ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2755ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2756ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2757ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2758ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2759ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2760ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2761ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2762ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2763ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2764ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2765ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
2766ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2767ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2768ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2769ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2770ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2771ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2772ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2773ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2774ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2775ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2776ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2777ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2778ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2779ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2780ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2781ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2782ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2783ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2784ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2785ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2786ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2787ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2788273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2789f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2790f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2791f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2792f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2793f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2794f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    Hwc2TestLayers* testLayers) {
2795f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2796f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2797f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        layer, testLayers->getVisibleRegion(layer)));
2798f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2799f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2800f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            advanceVisibleRegions));
2801f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2802f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2803f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2804f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2805f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2806f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2807f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            setVisibleRegion));
2808f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2809f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2810273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2811273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2812273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2813273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2814273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
28155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
2816273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2817273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
28185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
2819f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2820f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2821f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            /* TestLayer z orders are set during the construction of TestLayers
2822f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * and cannot be updated. There is no need (or ability) to cycle
2823f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * through additional z order configurations. */
2824f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2TestLayers* /*testLayers*/) {
2825f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                return false;
2826273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2827273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2828273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2829273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2830273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2831273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2832273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2833273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2834273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2835273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2836273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2837273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2838273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
2839273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
2840273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2841273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2842273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2843273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
2844273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
2845273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2846273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2847273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2848273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2849273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2850273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
2851273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2852273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2853273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2854273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2855273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
2856273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
2857273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2858273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2859273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2860273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2861273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2862273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2863273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
2864273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
28651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
28661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display a layer with basic property
28671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * coverage */
28681cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
28691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
28701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
28711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
2872706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
2873706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const Hwc2TestLayers& /*testLayers*/) {
28741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
28751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
28761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
28771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
28781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
28791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
28801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
28811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
28821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
28831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
28841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
28851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
28861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
28871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
28881cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
28891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
28901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
28911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
2892706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
2893706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const Hwc2TestLayers& /*testLayers*/) {
28941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
28951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
28961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
28971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
28981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
28991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
29001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
29011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
29021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
29031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
29041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
29051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
29061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
29071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
29081cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
29091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
29101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_display_t display;
29111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    uint32_t numTypes, numRequests;
29121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
29131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
29141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
29151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
29161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
29171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            &err));
29181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
29191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
2920706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2921706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get display requests after validating a
2922706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
2923706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
2924706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
2925706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2926706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
2927706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
2928706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const Hwc2TestLayers& /*testLayers*/) {
2929706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2930706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
2931706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
2932706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2933706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2934706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
2935706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
2936706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
2937706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
2938706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2939706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
2940706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        numRequests));
2941706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
2942706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
2943706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
2944706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2945706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
2946706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
2947706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
2948706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
2949706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_request_t displayRequests;
2950706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
2951706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_request_t> layerRequests;
2952706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2953706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2954706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2955706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2956706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
2957706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &layers, &layerRequests, &err));
2958706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2959706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
2960706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2961706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
2962706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
2963706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
2964706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
2965706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
2966706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
2967706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
2968706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2969706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_display_request_t displayRequests;
2970706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_layer_request_t> layerRequests;
2971706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
2972706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2973706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
2974706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &displayRequests, layers, &layerRequests, &err));
2975706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
2976706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
2977706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
2978706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
2979706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
2980706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2981706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get changed composition types after
2982706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validating a basic layer. */
2983706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
2984706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
2985706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
2986706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
2987706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
2988706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const Hwc2TestLayers& testLayers) {
2989706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2990706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
2991706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
2992706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2993706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
2994706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
2995706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
2996706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
2997706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
2998706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
2999706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3000706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        testLayers, layers, numTypes));
3001706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3002706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3003706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3004706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3005706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3006706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3007706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3008706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3009706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3010706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3011706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_composition_t> types;
3012706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3013706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3014706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3015706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3016706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3017706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &types, &err));
3018706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3019706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3020706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3021706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3022706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3023706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3024706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3025706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3026706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3027706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3028706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3029706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_composition_t> types;
3030706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3031706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3032706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3033706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        display, layers, &types, &err));
3034706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3035706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3036706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3037706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3038706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3039706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3040706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3041706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3042706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3043706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3044706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3045706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3046706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3047706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const Hwc2TestLayers& testLayers) {
3048706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3049706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3050706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3051706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3052706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3053706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3054706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3055706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3056706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3057706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3058706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3059706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        testLayers, layers, numTypes));
3060706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3061706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3062706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3063706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3064706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3065706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3066706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3067706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3068706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3069706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3070706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3071706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3072706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3073706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3074706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3075706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3076706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3077706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3078706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3079706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3080706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3081706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3082706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3083706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3084706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3085706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* /*layers*/) {
3086706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3087706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3088706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3089706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3090706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3091706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3092706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3093706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3094706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3095f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3096f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 supports client target with required values */
3097f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3098f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3099f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3100f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3101f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3102f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3103f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3104f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3105f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3106f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3107f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3108f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace()));
3109f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3110f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3111f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3112f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3113f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3114f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3115f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * display. */
3116f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3117f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3118f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3119f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t /*display*/,
3120f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3121f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3122f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3123f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3124f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_display_t badDisplay;
3125f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3126f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3127f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3128f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3129f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3130f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3131f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3132f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3133f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3134f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3135f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3136f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3137f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3138f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3139f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * for a variety of client target values. */
3140f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3141f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3142f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3143f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3144f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3145f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3146f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3147f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3148f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3149f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3150f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3151f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3152f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3153f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_TRUE(err == HWC2_ERROR_NONE
3154f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        || err == HWC2_ERROR_UNSUPPORTED)
3155f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        << "returned wrong error code";
3156f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3157f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3158f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3159f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3160f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3161f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3162f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * layer. */
3163f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3164f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3165f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3166f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3167f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const size_t layerCnt = 1;
3168f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3169f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto display : mDisplays) {
3170f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        std::vector<hwc2_config_t> configs;
3171f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3172f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3173f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3174f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3175f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3176f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto config : configs) {
3177f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Area displayArea;
3178f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_layer_t> layers;
3179f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3180f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3181f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3182f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3183f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3184f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3185f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    displayArea);
3186f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3187f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (!testLayers.optimizeLayouts())
3188f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                continue;
3189f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3190f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTarget testClientTarget;
3191f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3192f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            do {
3193f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clientLayers;
3194f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clearLayers;
3195f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                uint32_t numTypes, numRequests;
3196f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool hasChanges, skip;
3197f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool flipClientTarget;
3198f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                buffer_handle_t handle;
3199f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                int32_t acquireFence;
3200f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3201f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3202f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &testLayers, &skip));
3203f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (skip)
3204f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    continue;
3205f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3206f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3207f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &numRequests, &hasChanges));
3208f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (hasChanges)
3209f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3210f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            << "wrong number of requests";
3211f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3212f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3213f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testLayers, layers, numTypes, &clientLayers));
3214f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3215f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        numRequests, &clearLayers, &flipClientTarget));
3216f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3217f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        clearLayers, flipClientTarget, displayArea, &handle,
3218f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &acquireFence), 0);
3219f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3220f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        acquireFence, dataspace, damage));
3221f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3222f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (acquireFence >= 0)
3223f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    close(acquireFence);
3224f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3225f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            } while (testLayers.advance());
3226f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3227f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3228f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
3229f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3230f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3231f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
3232f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3233f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3234f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3235f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3236f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3237f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_display_t display;
3238f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::vector<hwc2_layer_t> layers;
3239f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const Area displayArea = {0, 0};
3240f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3241f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> clientLayers;
3242f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> flipClientTargetLayers;
3243f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool flipClientTarget = true;
3244f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3245f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3246f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    buffer_handle_t handle;
3247f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    int32_t acquireFence;
3248f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3249f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3250f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3251f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3252f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestClientTarget testClientTarget;
3253f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3254f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3255f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3256f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            &acquireFence), 0);
3257f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3258f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3259f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            dataspace, damage, &err));
3260f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3261f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (acquireFence >= 0)
3262f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        close(acquireFence);
3263f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3264f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3265f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3266