Hwc2Test.cpp revision 563030b4402f4b9aa08cece732f2a4a756a0f72c
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>
19563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall#include <unordered_map>
204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h>
214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h>
225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#include <android-base/unique_fd.h>
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
24563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall#include <sync/sync.h>
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h"
33273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
34f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall#include "Hwc2TestClientTarget.h"
356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
36cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
37cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
38572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
39572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
40cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
57cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
58cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
97a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
98a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
99a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
100a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
128cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
129cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
130cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
131cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
216cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
217cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
218cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
25093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
25193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
29003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
29103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
29203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
29303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
315572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
316572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
317572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
318572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
344dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
345dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
346dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
347dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
3662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
3672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    {
3682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
3692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
3702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
3722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
3732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                y));
3742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        if (outErr) {
3752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            *outErr = err;
3762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        } else {
3772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
3782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        }
3792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    }
3802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
381ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
382ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
383ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
384ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
385ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
386ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
387ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
388ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
389ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
390ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
391ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
392ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
393ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
394ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
395ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
396ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
397ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
3985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
3995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            buffer_handle_t buffer, int32_t acquireFence,
4005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            hwc2_error_t* outErr = nullptr)
4015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    {
4025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
4035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
4045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
4065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer, acquireFence));
4085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        if (outErr) {
4095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            *outErr = err;
4105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        } else {
4115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
4125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        }
4135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    }
4145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
415ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
416ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
417ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
418ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
419ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
420ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
421ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
422ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
423ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
424ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
425ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
426ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
427ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
428ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
429ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
430ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
431b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
432b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
433b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
434b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
435b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
436b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
437b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
438b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
439b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
440b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
441b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
442b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
443b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
444b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
445b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
446b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
447600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
448600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
449600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
450600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
451600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
452600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
453600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
454600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
455600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
456600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
457600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
458600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
459600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
460600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
461600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
462600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
463600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4642b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4662b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4682b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4692b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4702b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4712b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4752b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4792b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
481c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
482c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
483c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
484c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
485c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
486c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
487c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
488c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
489c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
490c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
491c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
492c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
493c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
494c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
495c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
496c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
497ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
498ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
499ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {
500ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
501ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
502ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
503ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
504ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
505ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                surfaceDamage));
506ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (outErr) {
507ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            *outErr = err;
508ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        } else {
509ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
510ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                    " damage";
511ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        }
512ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
513ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
514ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
515ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
516ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
517ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
518ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
519ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
520ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
521ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
522ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
523ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
524ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
525ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
526ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
527ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
528ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
529ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
530ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
531f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
532f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
533f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    {
534f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
535f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
536f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
537f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
538f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
539f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                visibleRegion));
540f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        if (outErr) {
541f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            *outErr = err;
542f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        } else {
543f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
544f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    " region";
545f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        }
546f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
547f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
548273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
549273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
550273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
551273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
552273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
553273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
554273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
555273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
556273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
557273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
558273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
559273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
560273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
561273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
562273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
563273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
564273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, hwc2_error_t* outErr)
5671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
5691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
5701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
5711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
5731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumTypes, outNumRequests));
5741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, bool* outHasChanges)
5781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
5821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumRequests, &err));
5831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err != HWC2_ERROR_HAS_CHANGES) {
5851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = false;
5861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
5871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        } else {
5881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = true;
5891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
5901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
592706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void getDisplayRequests(hwc2_display_t display,
593706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_request_t* outDisplayRequests,
594706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
595706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_request_t>* outLayerRequests,
596706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
597706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
598706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
599706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
600706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
601706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
602706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        uint32_t numElements = 0;
603706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
604706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
605706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
606706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                nullptr, nullptr));
607706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
608706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (err == HWC2_ERROR_NONE && numElements > 0) {
609706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayers->resize(numElements);
610706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayerRequests->resize(numElements);
611706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
612706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
613706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
614706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<uint64_t*>(outLayers->data()),
615706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outLayerRequests->data())));
616706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
617706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
618706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
619706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
620706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
621706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
622706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
623706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
624706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
625706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void handleRequests(hwc2_display_t display,
626706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
627706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::set<hwc2_layer_t>* outClearLayers = nullptr,
628706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool* outFlipClientTarget = nullptr)
629706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
630706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        hwc2_display_request_t displayRequest =
631706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                static_cast<hwc2_display_request_t>(0);
632706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_t> requestedLayers;
633706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_request_t> requests;
634706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
635706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
636706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &requestedLayers, &requests));
637706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
638706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        EXPECT_EQ(numRequests, requests.size()) << "validate returned "
639706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << numRequests << " requests and get display requests returned "
640706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << requests.size() << " requests";
641706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
642706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (size_t i = 0; i < requests.size(); i++) {
643706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_layer_t requestedLayer = requestedLayers.at(i);
644706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_layer_request_t request = requests.at(i);
645706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
646706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
647706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    0) << "get display requests returned an unknown layer";
648706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NE(request, 0) << "returned empty request for layer "
649706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    << requestedLayer;
650706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
651706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            if (outClearLayers && request
652706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
653706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                outClearLayers->insert(requestedLayer);
654706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
655706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
656706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outFlipClientTarget)
657706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outFlipClientTarget = displayRequest
658706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
659706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
660706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
661706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void getChangedCompositionTypes(hwc2_display_t display,
662706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
663706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_composition_t>* outTypes,
664706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
665706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
666706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
667706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
668706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
669706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
670706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        uint32_t numElements = 0;
671706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
672706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
673706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &numElements, nullptr, nullptr));
674706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
675706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (err == HWC2_ERROR_NONE && numElements > 0) {
676706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayers->resize(numElements);
677706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outTypes->resize(numElements);
678706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
679706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
680706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
681706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outTypes->data())));
682706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
683706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
684706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
685706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
686706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
687706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
688706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    " composition types";
689706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
690706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
691706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
692706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void handleCompositionChanges(hwc2_display_t display,
693706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const Hwc2TestLayers& testLayers,
694706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
695706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::set<hwc2_layer_t>* outClientLayers = nullptr)
696706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
697706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_t> changedLayers;
698706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_composition_t> types;
699706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
700706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
701706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &changedLayers, &types));
702706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
703706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        EXPECT_EQ(numTypes, types.size()) << "validate returned "
704706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << numTypes << " types and get changed composition types"
705706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                " returned " << types.size() << " types";
706706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
707706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (size_t i = 0; i < types.size(); i++) {
708706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
709706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            auto layer = std::find(layers.begin(), layers.end(),
710706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    changedLayers.at(i));
711706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
712706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
713706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    << "get changed composition types returned an unknown layer";
714706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
715706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_composition_t requestedType = testLayers.getComposition(*layer);
716706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_composition_t returnedType = types.at(i);
717706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
718706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
719706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    " composition types returned invalid composition";
720706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
721706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            switch (requestedType) {
722706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_CLIENT:
723706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(false) << getCompositionName(returnedType)
724706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " cannot be changed";
725706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
726706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_DEVICE:
727706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_SOLID_COLOR:
728706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
729706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "composition of type "
730706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType)
731706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " can only be changed to "
732706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_CLIENT);
733706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
734706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_CURSOR:
735706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_SIDEBAND:
736706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
737706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        || returnedType == HWC2_COMPOSITION_DEVICE)
738706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "composition of type "
739706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType)
740706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " can only be changed to "
741706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
742706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_DEVICE);
743706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
744706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            default:
745706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(false) << "unknown type "
746706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType);
747706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
748706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
749706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
750706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            if (outClientLayers)
751706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (returnedType == HWC2_COMPOSITION_CLIENT)
752706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    outClientLayers->insert(*layer);
753706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
754706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
755706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outClientLayers) {
756706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
757706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
758706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    outClientLayers->insert(layer);
759706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
760706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
761706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
762706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
763706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void acceptDisplayChanges(hwc2_display_t display,
764706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
765706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
766706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
767706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
768706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
769706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
770706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
771706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
772706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
773706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
774706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
775706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
776706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
777706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
778f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getClientTargetSupport(hwc2_display_t display, int32_t width,
779f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            int32_t height, android_pixel_format_t format,
780f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
781f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
782f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
783f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
784f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
785f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
786f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
787f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                height, format, dataspace));
788f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (outErr) {
789f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            *outErr = err;
790f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
791f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
792f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    " support";
793f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
794f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
795f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
796f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
797f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            int32_t acquireFence, android_dataspace_t dataspace,
798f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc_region_t damage, hwc2_error_t* outErr = nullptr)
799f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
800f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
801f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
802f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
803f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
804f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
805f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                acquireFence, dataspace, damage));
806f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (outErr) {
807f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            *outErr = err;
808f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
809f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
810f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
811f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
812f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
813563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
814563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            hwc2_error_t* outErr = nullptr)
815563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
816563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
817563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
818563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
819563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
820563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
821563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                outPresentFence));
822563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outErr) {
823563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outErr = err;
824563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        } else {
825563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
826563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
827563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
828563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
829563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void getReleaseFences(hwc2_display_t display,
830563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
831563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
832563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
833563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
834563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
835563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
836563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
837563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        uint32_t numElements = 0;
838563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
839563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
840563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                &numElements, nullptr, nullptr));
841563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
842563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (err == HWC2_ERROR_NONE) {
843563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            outLayers->resize(numElements);
844563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            outFences->resize(numElements);
845563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
846563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
847563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    &numElements, outLayers->data(), outFences->data()));
848563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
849563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
850563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outErr) {
851563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outErr = err;
852563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        } else {
853563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
854563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
855563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
856563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
857f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
858f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
859f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
860f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (mDisplays.count(display) == 0) {
861f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                *outDisplay = display;
862f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                return;
863f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
864f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
865f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
866f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                " are registered. This should never happen.";
867f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
868f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
869563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
870563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            int64_t* outTimestamp = nullptr)
871563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
872563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
873563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
874563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
875563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                " vsync callback";
876563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outDisplay)
877563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outDisplay = mVsyncDisplay;
878563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outTimestamp)
879563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outTimestamp = mVsyncTimestamp;
880563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
881563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
882563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void enableVsync(hwc2_display_t display)
883563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
884563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
885563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
886563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                hwc2TestVsyncCallback)));
887563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
888563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
889563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
890563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void disableVsync(hwc2_display_t display)
891563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
892563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
893563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
894563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
8954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
8964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
8974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
8984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
8994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
9004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
9024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
9034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
9044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
9064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
9084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
9094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
9104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
9114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
9124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
913cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
914cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
915cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
916cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
917cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
918cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
919cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
920cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
921cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
922cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
923cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
924cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
925cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
926cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
927cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
928cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
929cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
930cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
931cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
932cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
933cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
934cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
935cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
936cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
937cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
938cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
939cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
940cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
941cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
942cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
9431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
9441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
9451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
9461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
9471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
9481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
9491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
9501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
9511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
9521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
9531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
9541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
9551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
9561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
9571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
9581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
9591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
9601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
9611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
9621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
9631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
9641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
9651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
9661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
9671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
9681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
9691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
9701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
9711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
9721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
9731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
974cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
975cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
976cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
977cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
978cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
979cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
980cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
981cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
982cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
983cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
984cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
985cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
986cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
987cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
988cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
989cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
990cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
991cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
992cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
993cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
9946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
9956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
9966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
9976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
9985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
9996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1000273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
1001273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1002273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1003273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
10045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
1005273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
10066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
10076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
10086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
10096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
10105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
10116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
10136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
10146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
10156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
10166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* Is called after a display is powered on and all layer properties have
10181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * been set. It should be used to test functions such as validate, accepting
10191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * changes, present, etc. */
10201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
1021706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
1022563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            Hwc2TestLayers* testLayers);
1023706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1024706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* It is called on an non validated display */
1025706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1026706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
10271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1028f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Tests client target support on a particular display and config */
1029f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1030f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc2_display_t display,
1031f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            const Hwc2TestClientTargetSupport& testClientTargetSupport);
1032f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
10336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
10346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
10356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1036f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Advances properties of Hwc2TestLayers */
1037f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1038f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1039f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Advances properties of Hwc2TestClientTargetSupport */
1040f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using AdvanceClientTargetSupport = bool (*)(
1041f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTargetSupport* testClientTargetSupport);
1042f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
10436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
10446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
10456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
10466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
10476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
10486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
10496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
10506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
10516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
10536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
10556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1056600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
10576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1059600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1060600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1061600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
10626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
10646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
10656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
10675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
10686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
10706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
10716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
10726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
10736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
10746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
10766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
10776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
10786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
10796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
10806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
10816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
10826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
10836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
10856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
10876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1088600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
10896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1091600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1092600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1093600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
10946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
10966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
10976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
10986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
10995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
11006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
11016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
11046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
11056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
11066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1107273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
1108273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
1109273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
1110273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
1111273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
1112f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            TestLayerPropertiesFunction function, AdvanceProperties advance)
1113273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
1114273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
1115273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
1116273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1117273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1118273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1119273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
1120273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
1121600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
1122273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1123273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1124600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1125600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1126273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1127273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1128600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
1129273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1130f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                do {
1131f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    for (auto layer : layers) {
1132f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1133f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                                &testLayers));
1134f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    }
1135f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                } while (advance(&testLayers));
1136273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1137273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1138273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1139273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
1140273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
1141273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
11426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
11436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
11446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
11456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
11466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
11476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
11486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
11496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
11506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
11516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
11526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
11536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
11546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
11566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
11586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
1159600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
11606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
11616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1163600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1164600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1165600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
11666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
11685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
11696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
11745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
11756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
11805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
11816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
11826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
11836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
11846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
11856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
11876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
11886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
11896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
11906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
11916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
11926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
11936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
11956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
11976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
11986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
11996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
12016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
12056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
12066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
12076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
12106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
12116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
12126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* For each active display it powers on the display, cycles through each
12141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * config and creates a set of layers with a certain amount of coverage.
12151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * For each active display, for each config and for each set of layers,
12161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * it calls the TestDisplayLayersFunction */
12171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
12181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            TestDisplayLayersFunction function)
12191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
12201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto display : mDisplays) {
12211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            std::vector<hwc2_config_t> configs;
12221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
12241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
12261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            for (auto config : configs) {
12281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Area displayArea;
12291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                std::vector<hwc2_layer_t> layers;
12301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
12321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
12331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
12351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
12361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                do {
12381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    bool skip;
12391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
12411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            &testLayers, &skip));
12421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    if (!skip)
1243706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
1244563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                                &testLayers));
12451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                } while (testLayers.advance());
12471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
12491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        std::move(layers)));
12501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
12511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
12521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
12531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
12541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
12551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1256706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* For each active display, it calls the
1257706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1258706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * layer combinations */
1259706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void displayNonValidatedLayers(size_t layerCnt,
1260706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            TestDisplayNonValidatedLayersFunction function)
1261706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
1262706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (auto display : mDisplays) {
1263706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            uint32_t numTypes, numRequests;
1264706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t> layers;
1265706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool hasChanges;
1266706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1267706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1268706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1269706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1270706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1271706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1272706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1273706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1274706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1275706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1276706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1277706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_CLIENT));
1278706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1279706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1280706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1281706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1282706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1283706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numRequests, &hasChanges));
1284706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1285706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1286706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1287706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_DEVICE));
1288706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1289706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1290706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1291706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1292706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1293706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1294706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1295706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1296706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1297706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
1298706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
1299706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1300f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Test client target support on each config on each active display */
1301f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTargetSupport(Hwc2TestCoverage coverage,
1302f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            TestClientTargetSupportFunction function,
1303f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            AdvanceClientTargetSupport advance)
1304f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
1305f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto display : mDisplays) {
1306f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_config_t> configs;
1307f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1308f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1309f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1310f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            for (auto config : configs) {
1311f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Area displayArea;
1312f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1313f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1314f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1315f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &displayArea));
1316f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1317f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        displayArea);
1318f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1319f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                do {
1320f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display,
1321f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            testClientTargetSupport));
1322f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1323f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                } while (advance(&testClientTargetSupport));
1324f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
1325f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
1326f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
1327f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1328600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
1329600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
1330600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1331600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
1332600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1333600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1334600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
1335600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
1336600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
1337600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1338600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1339600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1340600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1341600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1342600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1343600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1344600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1345600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1346600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1347563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void closeFences(hwc2_display_t display, int32_t presentFence)
1348563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1349563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::vector<hwc2_layer_t> layers;
1350563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::vector<int32_t> fences;
1351563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        const int msWait = 3000;
1352563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1353563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (presentFence >= 0) {
1354563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_GE(sync_wait(presentFence, msWait), 0);
1355563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            close(presentFence);
1356563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1357563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1358563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1359563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        EXPECT_EQ(layers.size(), fences.size());
1360563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1361563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        for (int32_t fence : fences) {
1362563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            EXPECT_GE(sync_wait(fence, msWait), 0);
1363563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            if (fence >= 0)
1364563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                close(fence);
1365563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1366563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1367563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
13681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
13691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
13701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
13711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_composition_t composition;
13721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        buffer_handle_t handle = nullptr;
13731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        int32_t acquireFence;
13741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
13751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = true;
13761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (!testLayers->contains(layer))
13781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
13791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        composition = testLayers->getComposition(layer);
13811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        /* If the device cannot support a buffer format, then do not continue */
13831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if ((composition == HWC2_COMPOSITION_DEVICE
13841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                || composition == HWC2_COMPOSITION_CURSOR)
13851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
13861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
13871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
13891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                composition, &err));
13901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err == HWC2_ERROR_UNSUPPORTED)
13911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
13921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    && composition != HWC2_COMPOSITION_DEVICE);
13931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
13951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
13971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                acquireFence));
13981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
13991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getBlendMode(layer)));
14001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
14011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getColor(layer)));
14021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
14031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                cursor.top));
14041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
14051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDataspace(layer)));
14061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
14071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDisplayFrame(layer)));
14081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
14091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getPlaneAlpha(layer)));
14101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
14111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSourceCrop(layer)));
14121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
14131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSurfaceDamage(layer)));
14141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
14151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getTransform(layer)));
14161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
14171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getVisibleRegion(layer)));
14181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
14191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getZOrder(layer)));
14201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = false;
14221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
14231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display,
14251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            const std::vector<hwc2_layer_t>& layers,
14261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
14271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
14281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto layer : layers) {
14291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
14301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    testLayers, outSkip));
14311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            if (*outSkip)
14321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                return;
14331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
14341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
14351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1436563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void setClientTarget(hwc2_display_t display,
1437563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            Hwc2TestClientTarget* testClientTarget,
1438563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const Hwc2TestLayers& testLayers,
1439563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::set<hwc2_layer_t>& clientLayers,
1440563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1441563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const Area& displayArea)
1442563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1443563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1444563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        hwc_region_t damage = { };
1445563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        buffer_handle_t handle;
1446563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        int32_t acquireFence;
1447563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1448563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1449563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                clearLayers, flipClientTarget, displayArea, &handle,
1450563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                &acquireFence), 0);
1451563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1452563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                dataspace, damage));
1453563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1454563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1455563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1456563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1457563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            coverageExceptions, bool optimize)
1458563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1459563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        for (auto display : mDisplays) {
1460563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<hwc2_config_t> configs;
1461563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1462563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1463563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1464563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1465563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1466563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1467563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            for (auto config : configs) {
1468563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Area displayArea;
1469563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::vector<hwc2_layer_t> layers;
1470563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1471563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1472563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1473563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        &displayArea));
1474563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1475563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1476563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea,
1477563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        coverageExceptions);
1478563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1479563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                if (optimize && !testLayers.optimizeLayouts())
1480563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    continue;
1481563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1482563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::set<hwc2_layer_t> clientLayers;
1483563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::set<hwc2_layer_t> clearLayers;
1484563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Hwc2TestClientTarget testClientTarget;
1485563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1486563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                do {
1487563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    uint32_t numTypes, numRequests;
1488563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    bool hasChanges, skip;
1489563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    bool flipClientTarget;
1490563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    int32_t presentFence;
1491563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1492563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1493563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &testLayers, &skip));
1494563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    if (skip)
1495563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        continue;
1496563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1497563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1498563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &numRequests, &hasChanges));
1499563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    if (hasChanges)
1500563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1501563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                                << "wrong number of requests";
1502563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1503563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1504563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            testLayers, layers, numTypes, &clientLayers));
1505563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1506563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            numRequests, &clearLayers, &flipClientTarget));
1507563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1508563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &testClientTarget, testLayers, clientLayers,
1509563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            clearLayers, flipClientTarget, displayArea));
1510563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1511563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1512563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(waitForVsync());
1513563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1514563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1515563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &presentFence));
1516563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1517563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1518563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1519563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                } while (testLayers.advance());
1520563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1521563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1522563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        std::move(layers)));
1523563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            }
1524563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1525563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1526563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1527563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1528563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1529563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
15304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
1531cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1532cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
1533cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
1534cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
1535cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
1536cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
1537cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1538cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
1539cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
1540cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1541cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
15421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
15431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
15441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
15451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
154603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
154703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
154803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
154903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
1550572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1551572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
1552572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
1553572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
1554572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
15554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
15564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1557cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1558cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
1559cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1560cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
1561cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1562cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
1563cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1564cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1565572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1566572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
1567572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1568572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
1569572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1570572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
1571572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1572572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1573ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1575ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1576ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
15775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
15785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
15795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
15805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
15815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
15825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
15835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
15845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
15855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
15865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
15875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
15885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
15895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
15905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
15915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
15925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
15935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
15945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
15955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
15965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
15975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
15985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
1599ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1600ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1601ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1603ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1604ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1605ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
1606ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
16075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
1608ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
16095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
1610ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
16115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
1612ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1613ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
16146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
16166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
16175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
16186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
16196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
16206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
16216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
16226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
16236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
16246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
16256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
16266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
16276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
16286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
16296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
16306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
16316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
16326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
16336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
16346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
16352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
16365a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
16372a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
16382a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
16392a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
16402a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
16415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
16422a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
16432a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
16442a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
16452a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1646b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1648b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1649b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
16505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1651b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1652b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1653600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1655600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1656600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
16575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1658600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1659600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
16602b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
16622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
16632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
16645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
16652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
16665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
16672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
16682b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1669c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1671c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1672c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
16735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1674c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1675c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1676ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1678ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1679ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
16805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1681ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1682ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1683ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1685ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1686ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
16875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1688ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1689ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1690f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1691f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1692f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1693f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1694f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            testLayer->getVisibleRegion(), outErr));
1695f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1696f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1697273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
16985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1699273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1700273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
17015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1702273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1703273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1704ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1705ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1706ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1707ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1708ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
17095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
17105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
17115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
17125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
17135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
17145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
17155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1716ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1717ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1718ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1719ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1720ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1721ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1722ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1723ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1724ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1725ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1726ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
17276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
17286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
17296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
17306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
17316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
17322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
17332a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
17342a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
17352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
17362a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1737b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1738b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1739b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1740b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1741b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1742600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1743600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1744600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1745600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1746600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
17472b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
17482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
17492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
17502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
17512b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1752c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1753c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1754c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1755c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1756c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1757c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1758c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1759ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1760ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1761ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
1762ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
1763ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
1764ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1765ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1766ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1767ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1768ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1769ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1770ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1771f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool advanceVisibleRegions(Hwc2TestLayers* testLayers)
1772f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1773f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return testLayers->advanceVisibleRegions();
1774f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1775f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1776f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool advanceClientTargetSupport(
1777f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        Hwc2TestClientTargetSupport* testClientTargetSupport)
1778f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
1779f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return testClientTargetSupport->advance();
1780f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
17814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
17824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
17834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
17844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
17854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
17864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
17874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
17884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
17894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
17904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
17914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
17924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
17934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
17944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
17954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
17964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
17974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
17984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
17994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
18004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
18014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
18024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
18034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
18044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
18054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
18064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
18074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
18084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
18094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
18104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
18114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
18124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
18134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
18144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
18154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
18164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
18174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
18184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
18194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
18204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
18214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
18224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
18234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
18244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
18254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
18264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
18274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
18284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
18294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
18304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
18314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
18324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
18334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
18344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
18354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
18364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
18374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
18384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
18394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
18404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
18414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
18424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
18434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
18444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
18454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
18464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
18474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
18484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
18494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
18504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
18514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
18524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
18534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1854a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1855a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1856a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1857a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1858a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1859a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1860a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1861a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1862a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1863a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1864a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1865a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1866a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1867a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1868a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1869a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1870a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1871a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1872a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1873a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1874a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1875a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1876a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1877a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1878a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1879a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1880a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1881a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1882a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1883a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1884a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1885a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1886a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1887a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1888a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1889a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1890a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1891a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1892a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1893a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1894a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1895a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1896cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1897cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1898cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1899cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1900cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1901cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1902cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1903cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1904cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1905cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1906cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1907cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1908cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1909cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1910cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1911cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1912cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1913cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1914cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1915cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1916cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1917cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1918cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1919cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1920cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1921cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1922cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
19231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
19251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
19261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
19271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
19281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
19291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
19311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
19331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
19341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
19351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
19371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
19381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
19391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
19401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
19411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
19421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
19441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
19461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
19471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
19481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
19501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
19511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
19521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
19531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
19541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
19561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
19571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
19591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
19611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
19621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
19631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
19651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
19661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
19671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
19681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
19701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
19721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
19731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
19741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
19761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
19771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
19791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
19811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
19821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
19841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
19851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
19861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
19881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
19891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
19901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
19911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
19921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
19931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
19951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
19961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
19971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
19981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
19991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
20011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
20021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
20041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
20051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
20071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
20081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
20101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
20121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
20131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
20151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
20161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
20171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
20181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
20191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
2020cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2021cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2022cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
2023cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
2024cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
2025cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2026cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2027cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
2028cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
2029cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
2030cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
2031cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2032cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2033cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
2034cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2035cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2036cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2037cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2038cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2039cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2040cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2041cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
2042cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
2043cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2044cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
2045cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2046cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
2047cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
2048cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
2049cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
2050cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
2051cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
2052cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2053cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
2054cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
2055cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2056cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2057cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2058cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2059cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2060cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
2061cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2062cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2063cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2064cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2065cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2066cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2067cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2068cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2069cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2070cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
2071cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
2072cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
2073cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2074cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2075cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2076cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2077cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
2078cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2079cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2080cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2081cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2082cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2083cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2084cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2085cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
2086cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
2087cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
2088cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2089cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2090cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2091cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2092cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
2093cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2094cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
2095cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2096cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2097cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2098cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
2099cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2100cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
2101cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2102cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2103cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2104cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2105cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2106cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2107cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2108cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2109cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
2110cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
2111cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2112cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2113cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2114cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2115cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
2116cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2117cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2118cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2119cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2120cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2121cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
2122cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2123cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2124cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2125cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2126cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2127cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2128cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2129cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2130cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2131cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2132cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2133cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2134cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2135cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2136cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2137cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2138cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2139cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2140cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2141cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2142cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
2143cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
2144cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2145cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2146cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2147cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2148cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2149cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2150cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2151cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2152cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2153cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2154cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
2156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
2160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
2166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
2179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
2181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
218393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
218493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
218593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
218693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
218793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
218893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
218993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
219093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
219193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
219293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
219393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
219493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
219593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
219693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
219793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
219893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
219993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
220093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
220193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
220293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
220393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
220493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
220593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
220693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
220793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
220893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
220993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
221093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
221193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
221293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
221393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
221493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
221593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
221693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
221793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
221893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
221993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
222093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
222193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
222293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
222393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
222493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
222593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
222693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
222793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
222893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
222993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
223093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
223193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
223293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
223393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
223493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
223593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
223693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
223793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
223893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
223993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
224093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
224193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
224293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
224393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
224493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
224593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
224693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
224793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
224893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
224993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
225093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
225193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
225293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
225393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
225493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
225593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
225693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
225793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
225893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
225993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
226093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
226193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
226293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
226393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
226493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
226593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
226693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
226793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
226893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
226993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
227093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
227193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
227293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
227393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
227493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
227593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
227693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
227793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
227893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
227993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
228093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
228193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
228293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
228393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
228403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
228503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
228603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
228703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
228803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
228903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
229003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
229103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
229203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
229303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
229403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
229503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
229603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
229703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
229803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
229903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
230003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
230103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
230203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
230303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
230403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
230503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
230603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
230703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
230803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
230903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
231003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
231103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
231203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
231303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
231403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
231503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
231603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
231703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
231803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
231903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
232003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
232103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
232203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
232303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
232403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
232503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
232603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
232703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
232803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
232903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
233003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
233103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
233203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
233303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
233403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
233503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
233603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
233703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
233803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
233903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
234003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
234103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
234203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
234303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
234403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
234503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
234603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
234703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
234803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
234903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
235003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
235103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
235203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
235303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
235403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
235503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
235603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
235703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
235803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
235903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
236003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
236103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
236203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
236303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
236403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
236503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
236603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
236703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
236803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
236903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
237003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
237103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
237203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
237303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
237403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
237503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
237603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
237703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
237803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
237903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
238003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
238103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
238203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
238303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
238403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
238503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
238603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
238703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
238803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
238903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
239003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
239103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
239203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
239303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
239403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
239503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
239603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
239703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
239803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
239903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
240003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
240103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
240203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
240303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
240403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
240503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
240603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
240703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
240803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
240903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
241003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
241103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
241203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
241303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
241403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
241503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
241603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
241703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
241803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
241903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
242003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
242103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
242203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
242303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
242403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
2425572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2426572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2427572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
2428572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2429572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2430572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2431572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2432572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2433572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2434572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2435572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2436572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2437572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2438572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2439572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2440572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2441572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2442572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2443572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2444572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2445572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2446572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2447572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2448572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2449572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2450572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2451572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
2452572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
2453572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2454572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2455572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2456572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2457572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2458572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2459572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
2460572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2461572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2462572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2463572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2464572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2465572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2466572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2467572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2468572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2469572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2470572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2471572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2472572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2473572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
2474572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2475572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
2476572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2477572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2478572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2479572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2480572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2481572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
2482572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2483572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2484572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2485572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2486572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2487572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2488572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2489572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2490572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2491572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2492572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2493572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2494572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2495572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2496572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2497572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2498572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2499572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2500572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2501572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2502572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2503572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2504572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
2505572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2506572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2507572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2508572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2509572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2510572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2511572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2512572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
2513572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2514572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2515572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2516572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2517572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2518572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2519572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2520572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2521572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2522572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2523572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2524572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2525572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2526572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2527572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2528572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2529572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2530572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2531572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2532572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2533572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2534572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2535572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2536572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2537572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
2538572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2539572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2540572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2541572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2542572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2543572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2544572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2545572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2546572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2547572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2548572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2549572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2550572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2551572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2552572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
2553572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2554572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2555572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2556572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2557572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2558572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2559572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2560572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2561572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2562572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2563572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2564572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2565572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2566572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2567572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2568572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2569dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2570dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2571dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
2572dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2573dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
2574dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
2575dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2576dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2577dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
2578dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
2579dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2580dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2581dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
2582dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2583dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2584dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
2585dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
2586dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2587dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2588dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2589dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2590dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2591dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2592dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
25936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
25946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
25956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
25966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
25976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
25986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
25996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
26006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
26016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
26026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
26036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
26046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
26056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
26066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
26076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
26086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
26096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
26106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
26116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
26126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
26136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
26146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
26156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
26166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
26176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
26186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
26196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
26206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
26216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
26226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
26236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
26246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
26256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
26266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
26276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2628ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
26292a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
26302a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
26312a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
26322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
26332a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
26342a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
26352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26362a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
26372a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
26382a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
26392a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
26402a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
26412a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
26422a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26432a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
26442a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
26452a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
26462a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
26472a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
26482a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
26495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
26502a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
26522a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
26532a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
26542a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
26552a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26562a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
26572a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
26582a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26592a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
26602a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
26612a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
26622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
26632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
26642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
26652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
26662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
26672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
26692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
26712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
26722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
26732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
26752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
26762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
26772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
26782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
26795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
26802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
26815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
26822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
26832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
26842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
26852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
26862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
26872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
26882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2689ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2690ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2691ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2692ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2693ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2694ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2695ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2696ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2697ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2698ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2699ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2700ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2701ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2702ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2703ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2704ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2705ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2706ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2707ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2708ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2709ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2710ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2711ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2712ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2713ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2714ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2715ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2716ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2717ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2718ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2719ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2720ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2721ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2722b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
27235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
27245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
27255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
27265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
27275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
27285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
27295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
27315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
27325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
27335a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
27345a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
27355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
27365a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
27385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
27395a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
27405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
27415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
27425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
27435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
27455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
27465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
27485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
27495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
27505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
27515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
27525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
27535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
27555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
27565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
27575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
27585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
27595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
27615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
27625a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
27635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
27645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
27655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
27665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
27685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
27695a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
27705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
27715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
27725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
27735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
27745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
27755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
2776ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
2777ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
2778ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2779ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2780ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2781ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2782ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2783ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
2784ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
2785ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2786ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2787ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
2788ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2789ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2790ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
2791ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
2792ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
2793ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2794ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
2795ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
27965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2797ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2798ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
27995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2800ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
2801ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2802ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
2803ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2804ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2805ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
2806ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
2807ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
2808ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2809ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
28105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
2811ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2812ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
28135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
2814ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
2815ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
2816ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
2817ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2818b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
2819b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
2820b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2821b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2822b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2823b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2824b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2825b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
2826b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
2827b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2828b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2829b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
2830b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
2831b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
2832b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
2833b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
2834b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
2835b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2836b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
2837b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
28382b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2839600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
2840600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
2841600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2842600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2843600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2844600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2845600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2846600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
2847600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
2848600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2849600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2850600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
2851600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2852600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
2853600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
2854600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
2855600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
2856600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2857600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
2858600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
2859600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
28602b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
28612b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
28622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
28632b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28642b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
28652b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
28662b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
28672b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
28682b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
28692b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
28702b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
28712b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
28722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
28732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
28742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
28752b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
28762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
28772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
28782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
28795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
28802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
28812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
28825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
28832b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
28842b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
28852b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2886ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2887c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2888c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2889c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2890c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2891c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2892c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2893c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2894c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2895c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2896c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2897c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2898c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2899c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2900c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2901c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2902c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2903c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2904c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2905c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2906c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2907c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2908ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
2909ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
2910ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2911ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2912ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2913ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2914ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2915ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
2916ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
2917ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2918ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2919ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
2920ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2921ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2922ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
2923ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
2924ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2925ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2926ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
2927ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2928ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2929ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2930ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2931ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2932ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2933ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2934ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2935ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2936ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2937ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2938ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2939ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2940ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2941ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2942ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2943ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2944ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2945ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2946ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2947ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2948ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2949273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2950f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
2951f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
2952f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2953f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
2954f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2955f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    Hwc2TestLayers* testLayers) {
2956f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2957f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
2958f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        layer, testLayers->getVisibleRegion(layer)));
2959f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2960f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2961f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            advanceVisibleRegions));
2962f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2963f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2964f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
2965f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
2966f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2967f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2968f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            setVisibleRegion));
2969f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2970f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2971273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2972273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2973273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2974273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2975273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
29765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
2977273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2978273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
29795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
2980f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
2981f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2982f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            /* TestLayer z orders are set during the construction of TestLayers
2983f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * and cannot be updated. There is no need (or ability) to cycle
2984f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * through additional z order configurations. */
2985f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2TestLayers* /*testLayers*/) {
2986f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                return false;
2987273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2988273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2989273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2990273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2991273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2992273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2993273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2994273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2995273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2996273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2997273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2998273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2999273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
3000273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
3001273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3002273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3003273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3004273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
3005273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
3006273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3007273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3008273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3009273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3010273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3011273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
3012273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3013273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
3014273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3015273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3016273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
3017273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
3018273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
3019273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3020273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3021273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3022273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3023273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3024273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
3025273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
30261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display a layer with basic property
30281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * coverage */
30291cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
30301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
30311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
30321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3033706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3034563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
30351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
30371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
30381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
30401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
30411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
30421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
30431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
30441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
30451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
30461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
30471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
30491cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
30501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
30511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
30521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3053706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3054563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
30551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
30571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
30581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
30601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
30611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
30621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
30631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
30641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
30651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
30661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
30671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
30691cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
30701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
30711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_display_t display;
30721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    uint32_t numTypes, numRequests;
30731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
30741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
30761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
30771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
30781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            &err));
30791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
30801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
3081706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3082706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3083706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3084706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3085706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3086706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3087706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3088706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3089563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
3090706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3091706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3092706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3093706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3094706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3095706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3096706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3097706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3098706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3099706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3100706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3101706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        numRequests));
3102706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3103706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3104706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3105706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3106706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3107706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3108706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3109706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3110706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_request_t displayRequests;
3111706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3112706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_request_t> layerRequests;
3113706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3114706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3115706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3116706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3117706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3118706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &layers, &layerRequests, &err));
3119706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3120706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3121706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3122706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3123706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3124706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3125706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3126706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3127706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3128706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3129706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3130706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_display_request_t displayRequests;
3131706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_layer_request_t> layerRequests;
3132706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3133706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3134706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3135706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &displayRequests, layers, &layerRequests, &err));
3136706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3137706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3138706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3139706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3140706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3141706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3142706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get changed composition types after
3143706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validating a basic layer. */
3144706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3145706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3146706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3147706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3148706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3149563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* testLayers) {
3150706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3151706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3152706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3153706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3154706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3155706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3156706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3157706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3158706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3159706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3160706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3161563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        *testLayers, layers, numTypes));
3162706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3163706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3164706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3165706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3166706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3167706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3168706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3169706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3170706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3171706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3172706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_composition_t> types;
3173706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3174706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3175706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3176706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3177706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3178706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &types, &err));
3179706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3180706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3181706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3182706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3183706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3184706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3185706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3186706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3187706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3188706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3189706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3190706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_composition_t> types;
3191706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3192706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3193706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3194706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        display, layers, &types, &err));
3195706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3196706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3197706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3198706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3199706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3200706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3201706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3202706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3203706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3204706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3205706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3206706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3207706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3208563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* testLayers) {
3209706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3210706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3211706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3212706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3213706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3214706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3215706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3216706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3217706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3218706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3219706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3220563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        *testLayers, layers, numTypes));
3221706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3222706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3223706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3224706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3225706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3226706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3227706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3228706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3229706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3230706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3231706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3232706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3233706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3234706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3235706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3236706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3237706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3238706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3239706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3240706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3241706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3242706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3243706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3244706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3245706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3246706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* /*layers*/) {
3247706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3248706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3249706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3250706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3251706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3252706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3253706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3254706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3255706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3256f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3257f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 supports client target with required values */
3258f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3259f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3260f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3261f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3262f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3263f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3264f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3265f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3266f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3267f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3268f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3269f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace()));
3270f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3271f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3272f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3273f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3274f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3275f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3276f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * display. */
3277f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3278f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3279f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3280f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t /*display*/,
3281f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3282f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3283f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3284f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3285f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_display_t badDisplay;
3286f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3287f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3288f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3289f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3290f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3291f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3292f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3293f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3294f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3295f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3296f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3297f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3298f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3299f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3300f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * for a variety of client target values. */
3301f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3302f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3303f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3304f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3305f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3306f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3307f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3308f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3309f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3310f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3311f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3312f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3313f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3314f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_TRUE(err == HWC2_ERROR_NONE
3315f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        || err == HWC2_ERROR_UNSUPPORTED)
3316f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        << "returned wrong error code";
3317f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3318f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3319f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3320f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3321f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3322f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3323f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * layer. */
3324f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3325f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3326f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3327f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3328f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const size_t layerCnt = 1;
3329f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3330f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto display : mDisplays) {
3331f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        std::vector<hwc2_config_t> configs;
3332f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3333f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3334f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3335f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3336f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3337f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto config : configs) {
3338f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Area displayArea;
3339f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_layer_t> layers;
3340f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3341f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3342f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3343f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3344f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3345f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3346f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    displayArea);
3347f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3348f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (!testLayers.optimizeLayouts())
3349f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                continue;
3350f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3351f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTarget testClientTarget;
3352f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3353f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            do {
3354f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clientLayers;
3355f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clearLayers;
3356f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                uint32_t numTypes, numRequests;
3357f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool hasChanges, skip;
3358f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool flipClientTarget;
3359f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                buffer_handle_t handle;
3360f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                int32_t acquireFence;
3361f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3362f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3363f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &testLayers, &skip));
3364f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (skip)
3365f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    continue;
3366f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3367f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3368f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &numRequests, &hasChanges));
3369f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (hasChanges)
3370f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3371f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            << "wrong number of requests";
3372f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3373f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3374f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testLayers, layers, numTypes, &clientLayers));
3375f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3376f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        numRequests, &clearLayers, &flipClientTarget));
3377f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3378f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        clearLayers, flipClientTarget, displayArea, &handle,
3379f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &acquireFence), 0);
3380f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3381f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        acquireFence, dataspace, damage));
3382f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3383f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (acquireFence >= 0)
3384f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    close(acquireFence);
3385f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3386f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            } while (testLayers.advance());
3387f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3388f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3389f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
3390f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3391f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3392f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
3393f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3394f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3395f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3396f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3397f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3398f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_display_t display;
3399f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::vector<hwc2_layer_t> layers;
3400f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const Area displayArea = {0, 0};
3401f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3402f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> clientLayers;
3403f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> flipClientTargetLayers;
3404f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool flipClientTarget = true;
3405f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3406f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3407f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    buffer_handle_t handle;
3408f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    int32_t acquireFence;
3409f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3410f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3411f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3412f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3413f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestClientTarget testClientTarget;
3414f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3415f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3416f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3417f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            &acquireFence), 0);
3418f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3419f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3420f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            dataspace, damage, &err));
3421f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3422f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (acquireFence >= 0)
3423f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        close(acquireFence);
3424f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3425f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3426f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3427563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3428563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3429563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3430563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3431563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3432563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3433563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3434563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3435563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3436563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3437563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3438563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3439563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3440563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3441563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3442563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3443563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3444563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3445563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3446563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3447563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3448563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3449563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3450563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3451563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3452563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3453563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3454563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3455563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 3;
3456563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3457563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3458563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3459563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3460563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3461563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3462563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3463563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3464563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3465563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3466563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3467563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 4;
3468563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3469563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3470563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3471563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3472563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3473563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3474563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3475563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3476563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3477563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3478563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3479563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 5;
3480563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3481563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3482563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3483563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3484563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3485563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3486563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3487563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3488563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3489563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3490563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3491563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 6;
3492563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3493563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3494563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3495563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3496563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3497563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3498563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3499563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3500563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3501563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * blend mode. */
3502563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3503563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3504563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3505563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3506563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3507563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3508563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3509563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3510563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3511563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3512563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3513563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3514563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3515563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3516563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3517563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * blend mode. */
3518563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3519563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3520563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3521563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3522563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3523563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3524563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3525563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3526563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3527563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3528563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3529563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3530563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3531563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3532563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * buffer. */
3533563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3534563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3535563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3536563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3537563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3538563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3539563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3540563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3541563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3542563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3543563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3544563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3545563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3546563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * color. */
3547563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3548563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3549563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3550563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3551563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3552563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3553563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3554563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3555563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3556563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3557563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3558563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3559563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3560563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3561563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * color. */
3562563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3563563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3564563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3565563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3566563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3567563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3568563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3569563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3570563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3571563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3572563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3573563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3574563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3575563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3576563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3577563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3578563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * composition. */
3579563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3580563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3581563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3582563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3583563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3584563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3585563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3586563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3587563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3588563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3589563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3590563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3591563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3592563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * cursor. */
3593563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3594563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3595563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3596563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3597563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3598563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3599563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3600563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3601563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3602563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3603563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3604563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3605563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3606563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3607563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * cursor. */
3608563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3609563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3610563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3611563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3612563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3613563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3614563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3615563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3616563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3617563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3618563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3619563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3620563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3621563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3622563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3623563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * dataspace. */
3624563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3625563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3626563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3627563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3628563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3629563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3630563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3631563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3632563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3633563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3634563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3635563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3636563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3637563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3638563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3639563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3640563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3641563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3642563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3643563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3644563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3645563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3646563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3647563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3648563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3649563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3650563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3651563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3652563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3653563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3654563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3655563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3656563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3657563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3658563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3659563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3660563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3661563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3662563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3663563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3664563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3665563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3666563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3667563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3668563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 3;
3669563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3670563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3671563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3672563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3673563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3674563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3675563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3676563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3677563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3678563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3679563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3680563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3681563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3682563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 4;
3683563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3684563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3685563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3686563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3687563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3688563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3689563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3690563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3691563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3692563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3693563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * plane alpha. */
3694563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3695563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3696563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3697563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3698563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3699563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3700563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3701563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3702563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3703563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3704563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3705563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3706563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3707563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3708563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * plane alpha. */
3709563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3710563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3711563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3712563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3713563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3714563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3715563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3716563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3717563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3718563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3719563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3720563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3721563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3722563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3723563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * source crop. */
3724563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3725563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3726563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3727563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3728563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3729563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3730563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3731563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3732563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3733563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3734563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3735563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3736563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3737563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3738563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * source crop. */
3739563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3740563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3741563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3742563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3743563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3744563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3745563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3746563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3747563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3748563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3749563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3750563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3751563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3752563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3753563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3754563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * surface damage. */
3755563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
3756563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3757563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3758563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3759563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3760563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
3761563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3762563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3763563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3764563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3765563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3766563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3767563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3768563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * transform. */
3769563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
3770563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3771563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3772563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3773563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3774563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
3775563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3776563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3777563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3778563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3779563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3780563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3781563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3782563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * transform. */
3783563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
3784563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3785563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3786563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3787563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3788563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
3789563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3790563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3791563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3792563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3793563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3794563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3795563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3796563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3797563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * basic. */
3798563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
3799563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3800563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3801563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
3802563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3803563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3804563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3805563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3806563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3807563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3808563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3809563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot present a bad display.  */
3810563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
3811563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3812563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_display_t display;
3813563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    int32_t presentFence;
3814563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3815563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3816563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3817563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3818563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
3819563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3820563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3821563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3822563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
3823563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
3824563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3825563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
3826563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3827563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    const std::vector<hwc2_layer_t>& /*layers*/,
3828563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
3829563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3830563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                int32_t presentFence;
3831563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3832563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3833563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
3834563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        HWC2_POWER_MODE_ON));
3835563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
3836563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3837563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
3838563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3839563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
3840563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        &presentFence, &err));
3841563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3842563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        << "returned wrong error code";
3843563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3844563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
3845563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
3846563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        HWC2_POWER_MODE_OFF));
3847563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            }
3848563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ));
3849563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3850563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3851563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
3852563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
3853563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3854563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_display_t display;
3855563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::vector<hwc2_layer_t> layers;
3856563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::vector<int32_t> fences;
3857563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3858563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3859563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3860563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3861563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
3862563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3863563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3864