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"
35bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall#include "Hwc2TestVirtualDisplay.h"
366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
37cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
38cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
39572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
40572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
41cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
58cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
59cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
8003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
81bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        for (auto itr = mVirtualDisplays.begin(); itr != mVirtualDisplays.end();) {
82bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_display_t display = *itr;
83bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            itr++;
84bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            /* Destroys virtual displays */
85bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            destroyVirtualDisplay(display);
86bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        }
87bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
97a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
98a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
99a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
100a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
101a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
102a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
103a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
104a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
105a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
106a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
107a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
108a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
128cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
129cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
130cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
131cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
132cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
133cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
134cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
135cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
136cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
137cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
138cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
139cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
216cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
217cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
218cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
219cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
220cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
221cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
222cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
223cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
224cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
225cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
226cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
24893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
24993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
25193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
25293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
25393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
25493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
25593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
25693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
25793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
25893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
25993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
29003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
29103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
29203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
29303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
29403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
29503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
29603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
29703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
29803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
29903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
30003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
30103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
315572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
316572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
317572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
318572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
319572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
320572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
321572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
322572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
323572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
324572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
325572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
326572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
344dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
345dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
346dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
347dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
348dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
349dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
350dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
351dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
352dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
353dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
354dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
355dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    void setCursorPosition(hwc2_display_t display, hwc2_layer_t layer,
3742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            int32_t x, int32_t y, hwc2_error_t* outErr = nullptr)
3752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    {
3762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CURSOR_POSITION>(
3772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                getFunction(HWC2_FUNCTION_SET_CURSOR_POSITION));
3782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
3802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, x,
3812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                y));
3822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        if (outErr) {
3832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            *outErr = err;
3842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        } else {
3852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set cursor position";
3862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall        }
3872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    }
3882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
389ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
390ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
391ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
392ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
393ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
394ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
395ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
396ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
397ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
398ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
399ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
400ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
401ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
402ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
403ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
404ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
405ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
4065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    void setLayerBuffer(hwc2_display_t display, hwc2_layer_t layer,
4075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            buffer_handle_t buffer, int32_t acquireFence,
4085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            hwc2_error_t* outErr = nullptr)
4095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    {
4105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BUFFER>(
4115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BUFFER));
4125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
4145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer, acquireFence));
4165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        if (outErr) {
4175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            *outErr = err;
4185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        } else {
4195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer buffer";
4205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        }
4215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    }
4225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
423ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
424ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
425ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
426ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
427ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
428ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
429ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
430ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
431ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
432ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
433ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
434ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
435ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
436ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
437ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
438ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
439b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
440b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
441b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
442b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
443b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
444b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
445b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
446b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
447b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
448b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
449b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
450b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
451b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
452b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
453b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
454b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
455600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
456600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
457600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
458600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
459600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
460600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
461600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
462600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
463600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
464600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
465600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
466600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
467600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
468600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
469600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
470600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
471600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4722b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4732b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4742b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4752b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4762b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4772b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4782b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4792b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4822b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4832b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4842b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4852b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4862b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4872b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4882b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
489c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
490c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
491c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
492c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
493c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
494c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
495c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
496c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
497c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
498c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
499c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
500c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
501c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
502c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
503c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
504c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
505ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    void setLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer,
506ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            const hwc_region_t& surfaceDamage, hwc2_error_t* outErr = nullptr)
507ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {
508ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(
509ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE));
510ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
511ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
512ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
513ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                surfaceDamage));
514ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (outErr) {
515ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            *outErr = err;
516ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        } else {
517ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer surface"
518ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                    " damage";
519ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        }
520ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
521ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
522ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
523ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
524ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
525ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
526ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
527ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
528ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
529ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
530ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
531ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
532ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
533ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
534ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
535ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
536ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
537ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
538ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
539f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    void setLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer,
540f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            const hwc_region_t& visibleRegion, hwc2_error_t* outErr = nullptr)
541f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    {
542f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(
543f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION));
544f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
545f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
546f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
547f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                visibleRegion));
548f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        if (outErr) {
549f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            *outErr = err;
550f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        } else {
551f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer visible"
552f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    " region";
553f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        }
554f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
555f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
556273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
557273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
558273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
559273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
560273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
561273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
562273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
563273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
564273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
565273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
566273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
567273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
568273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
569273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
570273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
571273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
572273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
5731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, hwc2_error_t* outErr)
5751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_VALIDATE_DISPLAY>(
5771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                getFunction(HWC2_FUNCTION_VALIDATE_DISPLAY));
5781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
5791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outErr = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
5811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumTypes, outNumRequests));
5821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void validateDisplay(hwc2_display_t display, uint32_t* outNumTypes,
5851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            uint32_t* outNumRequests, bool* outHasChanges)
5861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
5871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(validateDisplay(display, outNumTypes,
5901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                outNumRequests, &err));
5911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
5921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err != HWC2_ERROR_HAS_CHANGES) {
5931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = false;
5941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_NONE) << "failed to validate display";
5951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        } else {
5961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            *outHasChanges = true;
5971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
5981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
5991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
600706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void getDisplayRequests(hwc2_display_t display,
601706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_request_t* outDisplayRequests,
602706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
603706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_request_t>* outLayerRequests,
604706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
605706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
606706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_REQUESTS>(
607706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_REQUESTS));
608706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
609706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
610706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        uint32_t numElements = 0;
611706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
612706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
613706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
614706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                nullptr, nullptr));
615706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
616706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (err == HWC2_ERROR_NONE && numElements > 0) {
617706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayers->resize(numElements);
618706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayerRequests->resize(numElements);
619706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
620706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
621706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outDisplayRequests), &numElements,
622706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<uint64_t*>(outLayers->data()),
623706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outLayerRequests->data())));
624706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
625706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
626706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
627706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
628706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
629706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display requests";
630706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
631706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
632706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
633706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void handleRequests(hwc2_display_t display,
634706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const std::vector<hwc2_layer_t>& layers, uint32_t numRequests,
635706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::set<hwc2_layer_t>* outClearLayers = nullptr,
636706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool* outFlipClientTarget = nullptr)
637706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
638706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        hwc2_display_request_t displayRequest =
639706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                static_cast<hwc2_display_request_t>(0);
640706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_t> requestedLayers;
641706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_request_t> requests;
642706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
643706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequest,
644706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &requestedLayers, &requests));
645706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
646706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        EXPECT_EQ(numRequests, requests.size()) << "validate returned "
647706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << numRequests << " requests and get display requests returned "
648706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << requests.size() << " requests";
649706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
650706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (size_t i = 0; i < requests.size(); i++) {
651706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_layer_t requestedLayer = requestedLayers.at(i);
652706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_layer_request_t request = requests.at(i);
653706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
654706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_EQ(std::count(layers.begin(), layers.end(), requestedLayer),
655706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    0) << "get display requests returned an unknown layer";
656706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NE(request, 0) << "returned empty request for layer "
657706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    << requestedLayer;
658706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
659706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            if (outClearLayers && request
660706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    == HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET)
661706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                outClearLayers->insert(requestedLayer);
662706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
663706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
664706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outFlipClientTarget)
665706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outFlipClientTarget = displayRequest
666706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    & HWC2_DISPLAY_REQUEST_FLIP_CLIENT_TARGET;
667706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
668706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
669706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void getChangedCompositionTypes(hwc2_display_t display,
670706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
671706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_composition_t>* outTypes,
672706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
673706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
674706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(
675706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES));
676706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
677706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
678706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        uint32_t numElements = 0;
679706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
680706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
681706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &numElements, nullptr, nullptr));
682706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
683706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (err == HWC2_ERROR_NONE && numElements > 0) {
684706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outLayers->resize(numElements);
685706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            outTypes->resize(numElements);
686706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
687706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
688706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numElements, reinterpret_cast<uint64_t*>(outLayers->data()),
689706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    reinterpret_cast<int32_t*>(outTypes->data())));
690706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
691706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
692706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
693706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
694706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
695706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get changed"
696706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    " composition types";
697706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
698706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
699706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
700706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void handleCompositionChanges(hwc2_display_t display,
701706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const Hwc2TestLayers& testLayers,
702706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            const std::vector<hwc2_layer_t>& layers, uint32_t numTypes,
703706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::set<hwc2_layer_t>* outClientLayers = nullptr)
704706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
705706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_layer_t> changedLayers;
706706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        std::vector<hwc2_composition_t> types;
707706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
708706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_NO_FATAL_FAILURE(getChangedCompositionTypes(display,
709706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                &changedLayers, &types));
710706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
711706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        EXPECT_EQ(numTypes, types.size()) << "validate returned "
712706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                << numTypes << " types and get changed composition types"
713706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                " returned " << types.size() << " types";
714706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
715706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (size_t i = 0; i < types.size(); i++) {
716706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
717706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            auto layer = std::find(layers.begin(), layers.end(),
718706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    changedLayers.at(i));
719706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
720706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_TRUE(layer != layers.end() || !testLayers.contains(*layer))
721706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    << "get changed composition types returned an unknown layer";
722706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
723706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_composition_t requestedType = testLayers.getComposition(*layer);
724706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_composition_t returnedType = types.at(i);
725706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
726706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NE(returnedType, HWC2_COMPOSITION_INVALID) << "get changed"
727706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    " composition types returned invalid composition";
728706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
729706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            switch (requestedType) {
730706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_CLIENT:
731706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(false) << getCompositionName(returnedType)
732706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " cannot be changed";
733706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
734706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_DEVICE:
735706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_SOLID_COLOR:
736706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(returnedType, HWC2_COMPOSITION_CLIENT)
737706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "composition of type "
738706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType)
739706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " can only be changed to "
740706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_CLIENT);
741706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
742706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_CURSOR:
743706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            case HWC2_COMPOSITION_SIDEBAND:
744706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(returnedType == HWC2_COMPOSITION_CLIENT
745706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        || returnedType == HWC2_COMPOSITION_DEVICE)
746706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "composition of type "
747706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType)
748706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << " can only be changed to "
749706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_CLIENT) << " or "
750706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(HWC2_COMPOSITION_DEVICE);
751706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
752706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            default:
753706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_TRUE(false) << "unknown type "
754706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << getCompositionName(requestedType);
755706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                break;
756706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
757706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
758706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            if (outClientLayers)
759706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (returnedType == HWC2_COMPOSITION_CLIENT)
760706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    outClientLayers->insert(*layer);
761706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
762706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
763706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outClientLayers) {
764706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
765706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (testLayers.getComposition(layer) == HWC2_COMPOSITION_CLIENT)
766706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    outClientLayers->insert(layer);
767706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
768706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
769706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
770706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
771706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void acceptDisplayChanges(hwc2_display_t display,
772706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_error_t* outErr = nullptr)
773706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
774706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(
775706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                getFunction(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES));
776706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
777706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
778706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
779706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        if (outErr) {
780706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            *outErr = err;
781706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        } else {
782706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to accept display changes";
783706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
784706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
785706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
786f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getClientTargetSupport(hwc2_display_t display, int32_t width,
787f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            int32_t height, android_pixel_format_t format,
788f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
789f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
790f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(
791f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                getFunction(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT));
792f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
793f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
794f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, width,
795f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                height, format, dataspace));
796f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (outErr) {
797f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            *outErr = err;
798f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
799f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get client target"
800f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    " support";
801f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
802f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
803f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
804f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTarget(hwc2_display_t display, buffer_handle_t handle,
805f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            int32_t acquireFence, android_dataspace_t dataspace,
806f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc_region_t damage, hwc2_error_t* outErr = nullptr)
807f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
808f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_CLIENT_TARGET>(
809f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                getFunction(HWC2_FUNCTION_SET_CLIENT_TARGET));
810f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
811f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
812f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, handle,
813f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                acquireFence, dataspace, damage));
814f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (outErr) {
815f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            *outErr = err;
816f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        } else {
817f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set client target";
818f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
819f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
820f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
821563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void presentDisplay(hwc2_display_t display, int32_t* outPresentFence,
822563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            hwc2_error_t* outErr = nullptr)
823563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
824563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_PRESENT_DISPLAY>(
825563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                getFunction(HWC2_FUNCTION_PRESENT_DISPLAY));
826563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
827563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
828563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
829563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                outPresentFence));
830563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outErr) {
831563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outErr = err;
832563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        } else {
833563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to present display";
834563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
835563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
836563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
837563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void getReleaseFences(hwc2_display_t display,
838563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<hwc2_layer_t>* outLayers,
839563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<int32_t>* outFences, hwc2_error_t* outErr = nullptr)
840563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
841563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_RELEASE_FENCES>(
842563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                getFunction(HWC2_FUNCTION_GET_RELEASE_FENCES));
843563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
844563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
845563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        uint32_t numElements = 0;
846563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
847563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
848563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                &numElements, nullptr, nullptr));
849563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
850563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (err == HWC2_ERROR_NONE) {
851563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            outLayers->resize(numElements);
852563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            outFences->resize(numElements);
853563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
854563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
855563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    &numElements, outLayers->data(), outFences->data()));
856563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
857563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
858563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outErr) {
859563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outErr = err;
860563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        } else {
861563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get release fences";
862563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
863563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
864563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
86535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    void getColorModes(hwc2_display_t display,
86635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            std::vector<android_color_mode_t>* outColorModes,
86735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            hwc2_error_t* outErr = nullptr)
86835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {
86935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_COLOR_MODES>(
87035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                getFunction(HWC2_FUNCTION_GET_COLOR_MODES));
87135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
87235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
87335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        uint32_t numColorModes = 0;
87435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
87535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
87635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                &numColorModes, nullptr));
87735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        if (err == HWC2_ERROR_NONE) {
87835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            outColorModes->resize(numColorModes);
87935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
88035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
88135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    &numColorModes,
88235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    reinterpret_cast<int32_t*>(outColorModes->data())));
88335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
88435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
88535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        if (outErr) {
88635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            *outErr = err;
88735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        } else {
88835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get color modes for"
88935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    " display " << display;
89035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
89135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    }
89235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
89335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    void setColorMode(hwc2_display_t display, android_color_mode_t colorMode,
89435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            hwc2_error_t* outErr = nullptr)
89535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {
89635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_MODE>(
89735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                getFunction(HWC2_FUNCTION_SET_COLOR_MODE));
89835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
89935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
90035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
90135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                static_cast<int32_t>(colorMode)));
90235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        if (outErr) {
90335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            *outErr = err;
90435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        } else {
90535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color mode "
90635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    << colorMode;
90735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
90835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    }
90935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
91035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    void getHdrCapabilities(hwc2_display_t display,
91135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            std::vector<android_hdr_t>* outTypes, float* outMaxLuminance,
91235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            float* outMaxAverageLuminance, float* outMinLuminance,
91335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            hwc2_error_t* outErr = nullptr)
91435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {
91535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_HDR_CAPABILITIES>(
91635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                getFunction(HWC2_FUNCTION_GET_HDR_CAPABILITIES));
91735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
91835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
91935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        uint32_t numTypes = 0;
92035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
92135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
92235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                &numTypes, nullptr, outMaxLuminance, outMaxAverageLuminance,
92335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                outMinLuminance));
92435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
92535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        if (err == HWC2_ERROR_NONE) {
92635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            outTypes->resize(numTypes);
92735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
92835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &numTypes,
92935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    reinterpret_cast<int32_t*>(outTypes->data()), outMaxLuminance,
93035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    outMaxAverageLuminance, outMinLuminance));
93135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
93235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
93335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        if (outErr) {
93435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            *outErr = err;
93535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        } else {
93635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get hdr capabilities"
93735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    " for display " << display;
93835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
93935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    }
94035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
94135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    void setColorTransform(hwc2_display_t display,
94235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            const std::array<float, 16>& matrix, android_color_transform_t hint,
94335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            hwc2_error_t* outErr = nullptr)
94435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {
94535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_COLOR_TRANSFORM>(
94635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                getFunction(HWC2_FUNCTION_SET_COLOR_TRANSFORM));
94735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
94835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
94935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
95035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                matrix.data(), hint));
95135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
95235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        if (outErr) {
95335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            *outErr = err;
95435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        } else {
95535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set color transform "
95635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    << hint;
95735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
95835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    }
95935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
960bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    void createVirtualDisplay(uint32_t width, uint32_t height,
961bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            android_pixel_format_t* outFormat, hwc2_display_t* outDisplay,
962bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_error_t* outErr = nullptr)
963bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {
964bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(
965bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY));
966bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
967bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
968bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, width, height,
969bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                reinterpret_cast<int32_t*>(outFormat), outDisplay));
970bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
971bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (err == HWC2_ERROR_NONE)
972bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            mVirtualDisplays.insert(*outDisplay);
973bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
974bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (outErr) {
975bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            *outErr = err;
976bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } else {
977bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create virtual display";
978bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        }
979bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
980bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
981bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    void destroyVirtualDisplay(hwc2_display_t display,
982bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_error_t* outErr = nullptr)
983bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {
984bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(
985bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY));
986bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
987bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
988bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display));
989bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
990bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (err == HWC2_ERROR_NONE)
991bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            mVirtualDisplays.erase(display);
992bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
993bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (outErr) {
994bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            *outErr = err;
995bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } else {
996bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy virtual display";
997bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        }
998bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
999bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1000bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    void getMaxVirtualDisplayCount(uint32_t* outMaxCnt)
1001bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {
1002bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(
1003bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                getFunction(HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT));
1004bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1005bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1006bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        *outMaxCnt = pfn(mHwc2Device);
1007bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
1008bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1009bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    void setOutputBuffer(hwc2_display_t display, buffer_handle_t buffer,
1010bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            int32_t releaseFence, hwc2_error_t* outErr = nullptr)
1011bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {
1012bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_OUTPUT_BUFFER>(
1013bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                getFunction(HWC2_FUNCTION_SET_OUTPUT_BUFFER));
1014bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1015bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1016bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, buffer,
1017bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                releaseFence));
1018bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (outErr) {
1019bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            *outErr = err;
1020bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } else {
1021bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set output buffer";
1022bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        }
1023bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
1024bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1025ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall    void dump(std::string* outBuffer)
1026ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall    {
1027ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DUMP>(
1028ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall                getFunction(HWC2_FUNCTION_DUMP));
1029ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1030ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
1031ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        uint32_t size = 0;
1032ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
1033ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        pfn(mHwc2Device, &size, nullptr);
1034ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
1035ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        std::vector<char> buffer(size);
1036ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
1037ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        pfn(mHwc2Device, &size, buffer.data());
1038ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
1039ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall        outBuffer->assign(buffer.data());
1040ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall    }
1041ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
1042f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
1043f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
1044f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
1045f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (mDisplays.count(display) == 0) {
1046f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                *outDisplay = display;
1047f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                return;
1048f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
1049f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
1050f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
1051f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                " are registered. This should never happen.";
1052f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
1053f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1054563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
1055563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            int64_t* outTimestamp = nullptr)
1056563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1057563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
1058563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
1059563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
1060563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                " vsync callback";
1061563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outDisplay)
1062563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outDisplay = mVsyncDisplay;
1063563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outTimestamp)
1064563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outTimestamp = mVsyncTimestamp;
1065563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1066563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1067563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void enableVsync(hwc2_display_t display)
1068563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1069563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
1070563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
1071563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                hwc2TestVsyncCallback)));
1072563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1073563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1074563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1075563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void disableVsync(hwc2_display_t display)
1076563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1077563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1078563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1079563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
10804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
10814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
10824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
10834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
10844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
10854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
10874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
10884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
10894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
10914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
10934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
10954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
10964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
10974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1098cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
1099cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
1100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
1101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
1102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
1103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
1104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
1105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
1107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
1108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
1109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
1110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
1112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
1113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
1114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
1115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
1116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
1118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
1119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
1120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
1122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
1123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
1125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
1126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
11281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
11291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
11301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
11311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
11321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
11331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
11341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
11351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
11371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
11391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
11401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
11411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
11421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
11431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
11441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
11451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
11461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
11471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
11491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
11521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
11531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
11541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
11551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
11571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
1160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
1161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
1166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
1168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
1169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
1172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
1173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
1174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
1177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
11796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
11806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
11816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
11826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
11835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
11846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1185273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
1186273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1187273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1188273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
11895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
1190273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
11916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
11926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
11936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
11946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
11955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
11966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
11986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
11996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
12006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
12016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* Is called after a display is powered on and all layer properties have
12031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * been set. It should be used to test functions such as validate, accepting
12041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * changes, present, etc. */
12051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
1206706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
1207563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            Hwc2TestLayers* testLayers);
1208706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1209706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* It is called on an non validated display */
1210706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1211706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
12121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1213f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Tests client target support on a particular display and config */
1214f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1215f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc2_display_t display,
1216f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            const Hwc2TestClientTargetSupport& testClientTargetSupport);
1217f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
121835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Tests a particular active display config */
121935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
122035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            hwc2_display_t display);
122135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
1222bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    /* Tests a newly created virtual display */
1223bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    using TestCreateVirtualDisplayFunction = void (*)(Hwc2Test* test,
1224bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_display_t display, Hwc2TestVirtualDisplay* testVirtualDisplay);
1225bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
12266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
12276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
12286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1229f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Advances properties of Hwc2TestLayers */
1230f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1231f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1232f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Advances properties of Hwc2TestClientTargetSupport */
1233f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using AdvanceClientTargetSupport = bool (*)(
1234f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTargetSupport* testClientTargetSupport);
1235f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
12366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
12376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
12386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
12396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
12406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
12416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
12426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
12436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
12446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
12466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
12486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1249600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
12506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1252600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1253600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1254600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
12556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
12576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
12605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
12616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
12646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
12656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
12666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
12676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
12696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
12706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
12716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
12726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
12736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
12746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
12756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
12766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
12786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
12806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1281600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
12826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1284600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1285600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1286600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
12876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
12916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
12925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
12936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
12946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
12976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
12986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
12996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1300273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
1301273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
1302273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
1303273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
1304273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
1305f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            TestLayerPropertiesFunction function, AdvanceProperties advance)
1306273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
1307273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
1308273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
1309273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1310273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1311273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1312273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
1313273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
1314600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
1315273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1316273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1317600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1318600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1319273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1320273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1321600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
1322273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1323f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                do {
1324f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    for (auto layer : layers) {
1325f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1326f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                                &testLayers));
1327f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    }
1328f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                } while (advance(&testLayers));
1329273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1330273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1331273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1332273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
1333273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
1334273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
13356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
13366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
13376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
13386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
13396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
13406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
13416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
13426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
13436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
13446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
13456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
13466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
13476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
13496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
13516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
1352600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
13536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
13546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1356600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1357600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1358600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
13596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
13615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
13626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
13675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
13686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
13735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
13746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
13766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
13776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
13786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
13806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
13816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
13826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
13836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
13846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
13856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
13866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
13886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
13906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
13916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
13926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
13946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
13986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
13996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
14006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
14016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
14026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
14036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
14046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
14056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
14061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* For each active display it powers on the display, cycles through each
14071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * config and creates a set of layers with a certain amount of coverage.
14081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * For each active display, for each config and for each set of layers,
14091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * it calls the TestDisplayLayersFunction */
14101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
14111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            TestDisplayLayersFunction function)
14121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
14131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto display : mDisplays) {
14141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            std::vector<hwc2_config_t> configs;
14151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
14171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
14191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            for (auto config : configs) {
14211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Area displayArea;
14221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                std::vector<hwc2_layer_t> layers;
14231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
14251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
14261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
14281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
14291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                do {
14311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    bool skip;
14321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
14341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            &testLayers, &skip));
14351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    if (!skip)
1436706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
1437563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                                &testLayers));
14381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                } while (testLayers.advance());
14401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
14421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        std::move(layers)));
14431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
14441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
14461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
14471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
14481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1449706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* For each active display, it calls the
1450706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1451706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * layer combinations */
1452706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void displayNonValidatedLayers(size_t layerCnt,
1453706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            TestDisplayNonValidatedLayersFunction function)
1454706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
1455706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (auto display : mDisplays) {
1456706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            uint32_t numTypes, numRequests;
1457706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t> layers;
1458706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool hasChanges;
1459706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1460706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1461706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1462706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1463706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1464706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1465706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1466706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1467706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1468706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1469706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1470706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_CLIENT));
1471706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1472706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1473706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1474706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1475706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1476706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numRequests, &hasChanges));
1477706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1478706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1479706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1480706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_DEVICE));
1481706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1482706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1483706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1484706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1485706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1486706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1487706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1488706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1489706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1490706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
1491706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
1492706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1493f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Test client target support on each config on each active display */
1494f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTargetSupport(Hwc2TestCoverage coverage,
1495f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            TestClientTargetSupportFunction function,
1496f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            AdvanceClientTargetSupport advance)
1497f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
1498f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto display : mDisplays) {
1499f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_config_t> configs;
1500f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1501f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1502f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1503f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            for (auto config : configs) {
1504f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Area displayArea;
1505f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1506f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1507f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1508f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &displayArea));
1509f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1510f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        displayArea);
1511f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1512f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                do {
1513f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display,
1514f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            testClientTargetSupport));
1515f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1516f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                } while (advance(&testClientTargetSupport));
1517f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
1518f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
1519f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
1520f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
152135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Cycles through each config on each active display and calls
152235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall     * a TestActiveDisplayConfigFunction */
152335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
152435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {
152535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        for (auto display : mDisplays) {
152635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            std::vector<hwc2_config_t> configs;
152735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
152835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
152935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
153035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            for (auto config : configs) {
153135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
153235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
153335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(function(this, display));
153435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
153535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
153635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    }
153735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
1538bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    /* Creates a virtual display for testing */
1539bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    void createVirtualDisplay(Hwc2TestCoverage coverage,
1540bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            TestCreateVirtualDisplayFunction function)
1541bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {
1542bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1543bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1544bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        do {
1545bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_display_t display;
1546bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1547bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1548bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            const UnsignedArea& dimension =
1549bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    testVirtualDisplay.getDisplayDimension();
1550bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1551bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1552bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1553bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    dimension.height, &desiredFormat, &display, &err));
1554bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1555bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
1556bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    || err == HWC2_ERROR_UNSUPPORTED)
1557bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    << "returned wrong error code";
1558bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_GE(desiredFormat, 0) << "invalid format";
1559bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1560bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            if (err != HWC2_ERROR_NONE)
1561bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                continue;
1562bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1563bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display,
1564bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    &testVirtualDisplay));
1565bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1566bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1567bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1568bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } while (testVirtualDisplay.advance());
1569bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
1570bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1571bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1572600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
1573600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
1574600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1575600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
1576600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1577600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1578600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
1579600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
1580600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
1581600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1582600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1583600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1584600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1585600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1586600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1587600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1588600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1589600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1590600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1591563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void closeFences(hwc2_display_t display, int32_t presentFence)
1592563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1593563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::vector<hwc2_layer_t> layers;
1594563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::vector<int32_t> fences;
1595563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        const int msWait = 3000;
1596563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1597563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (presentFence >= 0) {
1598563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_GE(sync_wait(presentFence, msWait), 0);
1599563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            close(presentFence);
1600563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1601563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1602563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1603563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        EXPECT_EQ(layers.size(), fences.size());
1604563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1605563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        for (int32_t fence : fences) {
1606563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            EXPECT_GE(sync_wait(fence, msWait), 0);
1607563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            if (fence >= 0)
1608563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                close(fence);
1609563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1610563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1611563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
16121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
16131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
16141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
16151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_composition_t composition;
16161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        buffer_handle_t handle = nullptr;
16171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        int32_t acquireFence;
16181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
16191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = true;
16201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (!testLayers->contains(layer))
16221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
16231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        composition = testLayers->getComposition(layer);
16251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        /* If the device cannot support a buffer format, then do not continue */
16271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if ((composition == HWC2_COMPOSITION_DEVICE
16281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                || composition == HWC2_COMPOSITION_CURSOR)
16291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
16301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
16311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
16331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                composition, &err));
16341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err == HWC2_ERROR_UNSUPPORTED)
16351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
16361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    && composition != HWC2_COMPOSITION_DEVICE);
16371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
16391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
16411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                acquireFence));
16421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
16431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getBlendMode(layer)));
16441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
16451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getColor(layer)));
16461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
16471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                cursor.top));
16481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
16491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDataspace(layer)));
16501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
16511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDisplayFrame(layer)));
16521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
16531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getPlaneAlpha(layer)));
16541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
16551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSourceCrop(layer)));
16561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
16571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSurfaceDamage(layer)));
16581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
16591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getTransform(layer)));
16601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
16611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getVisibleRegion(layer)));
16621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
16631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getZOrder(layer)));
16641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = false;
16661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
16671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display,
16691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            const std::vector<hwc2_layer_t>& layers,
16701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
16711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
16721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto layer : layers) {
16731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
16741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    testLayers, outSkip));
16751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            if (*outSkip)
16761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                return;
16771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
16781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
16791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1680563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void setClientTarget(hwc2_display_t display,
1681563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            Hwc2TestClientTarget* testClientTarget,
1682563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const Hwc2TestLayers& testLayers,
1683563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::set<hwc2_layer_t>& clientLayers,
1684563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1685563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const Area& displayArea)
1686563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1687563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1688563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        hwc_region_t damage = { };
1689563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        buffer_handle_t handle;
1690563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        int32_t acquireFence;
1691563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1692563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1693563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                clearLayers, flipClientTarget, displayArea, &handle,
1694563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                &acquireFence), 0);
1695563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1696563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                dataspace, damage));
1697563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1698563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1699563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1700563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1701563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            coverageExceptions, bool optimize)
1702563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1703563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        for (auto display : mDisplays) {
1704563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<hwc2_config_t> configs;
1705563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1706563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1707563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1708563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1709563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1710563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1711563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            for (auto config : configs) {
1712563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Area displayArea;
1713563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::vector<hwc2_layer_t> layers;
1714563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1715563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1716563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1717563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        &displayArea));
1718563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1719563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1720563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea,
1721563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        coverageExceptions);
1722563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1723563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                if (optimize && !testLayers.optimizeLayouts())
1724563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    continue;
1725563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1726563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::set<hwc2_layer_t> clientLayers;
1727563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::set<hwc2_layer_t> clearLayers;
1728563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Hwc2TestClientTarget testClientTarget;
1729563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1730563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                do {
1731563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    uint32_t numTypes, numRequests;
1732563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    bool hasChanges, skip;
1733563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    bool flipClientTarget;
1734563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    int32_t presentFence;
1735563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1736563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1737563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &testLayers, &skip));
1738563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    if (skip)
1739563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        continue;
1740563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1741563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1742563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &numRequests, &hasChanges));
1743563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    if (hasChanges)
1744563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1745563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                                << "wrong number of requests";
1746563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1747563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1748563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            testLayers, layers, numTypes, &clientLayers));
1749563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1750563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            numRequests, &clearLayers, &flipClientTarget));
1751563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1752563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &testClientTarget, testLayers, clientLayers,
1753563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            clearLayers, flipClientTarget, displayArea));
1754563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1755563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1756563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(waitForVsync());
1757563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1758563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1759563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &presentFence));
1760563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1761563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1762563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1763563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                } while (testLayers.advance());
1764563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1765563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1766563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        std::move(layers)));
1767563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            }
1768563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1769563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1770563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1771563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1772563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1773563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
17744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
1775cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1776cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
1777cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
1778cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
1779cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
1780cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
1781cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1782cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
1783cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
1784cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1785cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
17861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
17881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
17891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
179003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
179103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
179203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
179303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
1794572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1795bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    /* Store all created virtual displays that have not been destroyed. If an
1796bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall     * ASSERT_* fails, then destroy the virtual displays on exit */
1797bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::set<hwc2_display_t> mVirtualDisplays;
1798bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
1800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
1801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
1802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
18034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
18044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1805cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1806cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
1807cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1808cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
1809cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1810cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
1811cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1812cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1813572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1814572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
1815572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1816572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
1817572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1818572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
1819572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1820572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1821ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1823ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1824ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
18255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
18265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
18275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
18305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
18315a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
18325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
18335a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
18345a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
18365a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
18375a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
18385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
18395a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
18415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
18425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
18445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
18455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
18465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
1847ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1848ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1849ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1851ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1852ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1853ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
1854ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
18555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
1856ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
18575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
1858ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
18595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
1860ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1861ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
18626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
18646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
18666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
18676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
18696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
18706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
18716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
18726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
18736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
18746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
18766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
18776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
18786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
18796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
18806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
18816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
18845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
18852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
18862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
18872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
18882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
18895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
18902a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
18912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
18922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
18932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1894b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1896b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1897b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
18985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1899b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1900b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1901600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1903600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1904600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
19055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1906600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1907600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
19082b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
19102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
19112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
19125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
19132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
19145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
19152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
19162b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1917c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1919c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1920c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
19215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1922c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1923c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1924ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1926ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1927ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
19285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1929ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1930ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1931ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1933ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1934ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
19355a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1936ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1937ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1938f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1939f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1940f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1941f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1942f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            testLayer->getVisibleRegion(), outErr));
1943f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1944f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1945273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1947273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1948273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
19495a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1950273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1951273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1952ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1953ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1954ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1955ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1956ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
19575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
19585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
19595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
19605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
19615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
19625a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
19635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1964ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1965ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1966ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1967ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1968ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1969ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1970ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1971ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1972ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1973ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1974ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
19756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
19766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
19786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
19812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
19832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1985b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1986b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1987b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1988b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1989b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1990600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1991600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1992600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1993600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1994600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
19952b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
19962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
19972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
19982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
19992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
2000c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
2001c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2002c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
2003c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
2004c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
2005c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2006c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2007ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
2008ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
2009ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
2010ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
2011ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
2012ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
2013ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
2014ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
2015ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2016ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
2017ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2018ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2019f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool advanceVisibleRegions(Hwc2TestLayers* testLayers)
2020f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2021f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return testLayers->advanceVisibleRegions();
2022f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2023f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2024f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool advanceClientTargetSupport(
2025f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        Hwc2TestClientTargetSupport* testClientTargetSupport)
2026f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
2027f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return testClientTargetSupport->advance();
2028f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
20294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
20314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
20324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
20334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
20344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
20354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
20364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
20374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
20384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
20394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
20404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
20414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
20424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
20434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
20444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
20454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
20464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
20474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
20484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
20494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
20504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
20514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
20524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
20534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
20544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
20554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
20564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
20574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
20584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
20594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
20604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
20614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
20624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
20634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
20644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
20654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
20664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
20674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
20684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
20694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
20704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
20714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
20724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
20734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
20744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
20764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
20774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
20784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
20794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
20804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
20814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
20824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
20834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
20844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
20864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
20874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
20884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
20894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
20904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
20914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
20934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
20944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
20954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
20964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
20984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
21004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
21014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
2102a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2103a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
2104a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
2105a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
2106a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
2107a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
2108a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2109a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
2110a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
2111a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
2112a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
2113a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2114a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
2115a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2116a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
2117a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2118a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
2119a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
2120a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
2121a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2122a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
2123a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
2124a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
2125a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2126a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
2127a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2128a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2129a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
2130a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
2131a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2132a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
2133a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2134a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2135a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2136a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
2137a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
2138a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2139a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
2140a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2141a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
2142a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
2143a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
2144cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2145cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2146cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
2147cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2148cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
2149cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
2150cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
2151cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2152cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2153cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2154cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
2155cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
2156cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
2157cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2158cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2159cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
2160cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2161cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
2162cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
2163cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
2164cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2165cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2166cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2167cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2168cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2169cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2170cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
21711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
21731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
21741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
21751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
21761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
21771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
21791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
21811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
21821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
21831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
21851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
21861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
21871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
21881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
21891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
21901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
21921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
21941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
21951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
21961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
21981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
21991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
22001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
22011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
22021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
22041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
22051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
22071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
22091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
22101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
22111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
22131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
22141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
22151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
22161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
22181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
22201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
22211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
22221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
22241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
22251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
22271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
22291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
22301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
22321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
22331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
22341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
22361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
22371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
22381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
22391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
22401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
22411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
22431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
22461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
22491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
22521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
22551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
22581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
22601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
22631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
22651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
22671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
2268cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2269cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2270cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
2271cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
2272cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
2273cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2274cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2275cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
2276cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
2277cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
2278cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
2279cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2280cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2281cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
2282cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2283cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2284cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2285cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2286cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2287cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2288cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2289cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
2290cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
2291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2292cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
2293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
2295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
2296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
2297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
2298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
2299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
2300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
2302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
2303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
2309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2313cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2314cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2315cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2316cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2317cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2318cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
2319cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
2320cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
2321cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2322cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2323cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2324cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2325cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
2326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
2334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
2335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
2336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
2341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
2343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2346cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
2347cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2348cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
2349cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2350cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2351cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2352cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2353cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2354cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2355cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2356cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2357cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
2358cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
2359cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2360cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2361cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2362cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2363cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
2364cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2365cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2366cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2367cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2368cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2369cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
2370cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2371cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2372cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2373cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2374cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2375cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2376cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2377cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2378cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2379cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2380cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2381cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2382cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2383cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2384cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2385cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2386cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2387cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2388cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2389cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2390cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
2391cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
2392cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2393cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2394cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2395cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2396cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2397cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2398cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2399cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2400cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2401cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2402cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
2404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
2408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
2414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2422cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2423cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2424cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2425cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2426cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
2427cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2428cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
2429cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2430cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
243193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
243293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
243393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
243493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
243593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
243693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
243793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
243893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
243993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
244193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
244293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
244493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
244593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
244793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
244893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
244993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
245093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
245193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
245293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
245393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
245493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
245593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
245693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
245793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
245893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
245993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
246093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
246193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
246293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
246393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
246493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
246593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
246693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
246793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
246893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
246993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
247093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
247193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
247293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
247393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
247493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
247593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
247693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
247793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
247893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
247993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
248093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
248193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
248293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
248393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
248493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
248593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
248693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
248793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
248893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
248993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
249093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
249193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
249293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
249393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
249493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
249593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
249693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
249793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
249893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
249993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
250093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
250193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
250293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
250393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
250493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
250593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
250693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
250793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
250893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
250993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
251093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
251193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
251293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
251393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
251493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
251593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
251693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
251793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
251893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
251993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
252093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
252193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
252293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
252393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
252493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
252593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
252693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
252793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
252893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
252993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
253093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
253193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
253203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
253303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
253403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
253503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
253603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
253703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
253803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
253903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
254003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
254103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
254203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
254303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
254403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
254503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
254603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
254703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
254803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
254903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
255003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
255103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
255203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
255303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
255403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
255503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
255603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
255703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
255803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
255903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
256003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
256103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
256203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
256303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
256403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
256503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
256603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
256703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
256803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
256903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
257003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
257103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
257203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
257303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
257403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
257503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
257603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
257703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
257803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
257903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
258003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
258103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
258203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
258303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
258403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
258503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
258603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
258703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
258803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
258903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
259003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
259103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
259203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
259303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
259403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
259503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
259603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
259703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
259803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
259903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
260003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
260103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
260203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
260303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
260403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
260503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
260603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
260703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
260803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
260903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
261003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
261103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
261203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
261303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
261403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
261503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
261603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
261703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
261803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
261903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
262003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
262103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
262203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
262303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
262403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
262503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
262603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
262703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
262803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
262903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
263003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
263103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
263203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
263303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
263403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
263503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
263603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
263703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
263803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
263903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
264003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
264103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
264203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
264303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
264403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
264503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
264603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
264703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
264803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
264903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
265003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
265103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
265203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
265303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
265403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
265503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
265603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
265703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
265803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
265903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
266003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
266103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
266203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
266303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
266403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
266503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
266603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
266703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
266803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
266903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
267003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
267103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
267203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
2673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
2676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2678572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2679572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2680572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2681572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2682572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2683572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2684572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2685572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2686572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2687572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2688572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2689572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2690572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2691572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2692572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2693572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2694572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2695572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2696572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2697572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2698572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2699572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
2700572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
2701572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2702572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2703572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2704572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2705572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2706572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2707572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
2708572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2709572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2710572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2711572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2712572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2713572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2714572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2715572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2716572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2717572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2718572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2719572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2720572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2721572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
2722572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2723572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
2724572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2725572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2726572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2727572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2728572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2729572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
2730572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2731572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2732572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2733572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2734572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2735572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2736572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2737572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2738572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2739572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2740572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2741572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2742572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2743572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2744572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2745572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2746572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2747572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2748572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2749572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2750572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2751572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2752572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
2753572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2754572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2755572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2756572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2757572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2758572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2759572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2760572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
2761572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2762572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2763572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2764572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2765572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2766572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2767572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2768572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2769572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2770572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2771572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2772572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2773572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2774572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2775572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2776572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2777572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2778572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2779572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2780572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2781572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2782572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2783572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
2786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2789572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2790572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2791572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2792572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2793572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2794572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2795572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2796572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2797572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2798572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
2801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2804572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2805572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2806572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2807572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2808572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2809572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2810572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2811572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2812572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2813572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2814572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2815572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2816572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2817dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2818dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2819dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
2820dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2821dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
2822dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
2823dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2824dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2825dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
2826dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
2827dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2828dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2829dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
2830dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2831dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2832dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
2833dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
2834dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2835dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2836dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2837dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2838dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2839dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2840dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
28416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
28436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
28446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
28476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
28486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
28506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
28516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
28526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
28546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
28556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
28566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
28586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
28596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
28616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
28626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
28636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
28656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
28666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
28686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
28696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
28706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
28726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
28736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
28746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
28756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2876ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
28772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
28782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
28792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28802a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
28822a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
28832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
28852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
28862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
28882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
28892a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
28902a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
28922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
28932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
28942a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28952a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28962a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
28975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
28982a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
29002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
29012a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
29022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
29032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29042a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
29052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
29062a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
29082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
29092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
29102a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
29112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
29122a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
29132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
29142a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
29152a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29162a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
29172a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29182a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
29192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
29202a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
29212a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29222a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
29232a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
29242a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
29252a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
29262a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
29275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
29282a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
29302a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
29312a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
29322a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
29332a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
29342a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
29352a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
29362a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2937ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2938ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2939ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2940ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2941ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2942ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2943ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2944ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2945ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2946ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2947ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2948ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2949ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2950ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2951ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2952ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2953ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2954ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2955ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2956ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2957ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2958ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2959ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2960ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2961ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2962ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2963ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2964ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2965ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2966ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2967ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2968ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2969ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2970b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
29715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
29725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
29735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
29755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
29765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
29775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
29795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
29805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
29825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
29835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
29845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
29865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
29875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
29895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
29905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
29915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
29935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
29945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
29965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
29975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
29985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
29995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
30005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
30015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
30025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
30035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
30045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
30055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
30065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
30075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
30085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
30095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
30105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
30115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
30125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
30135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
30145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
30155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
30165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
30175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
30185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
30195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
30205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
30215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
30225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
30235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
3024ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
3025ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
3026ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3027ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3028ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
3029ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3030ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3031ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
3032ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
3033ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3034ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3035ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
3036ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3037ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3038ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
3039ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
3040ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
3041ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3042ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
3043ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
30445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
3045ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3046ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
30475a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
3048ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
3049ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3050ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
3051ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3052ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3053ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
3054ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
3055ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3056ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3057ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
30585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
3059ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3060ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
30615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
3062ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
3063ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
3064ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3065ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3066b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
3067b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
3068b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
3069b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3070b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
3071b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
3072b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
3073b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
3074b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
3075b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
3076b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3077b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
3078b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
3079b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
3080b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
3081b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
3082b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
3083b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3084b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
3085b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
30862b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
3087600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
3088600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
3089600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
3090600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3091600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
3092600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
3093600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
3094600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
3095600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
3096600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
3097600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3098600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
3099600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
3100600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
3101600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
3102600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
3103600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
3104600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3105600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
3106600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
3107600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
31082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
31092b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
31102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
31112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
31122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
31132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
31142b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
31152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
31162b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
31172b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
31182b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
31192b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
31202b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
31212b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
31222b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
31232b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
31242b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
31252b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
31262b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
31275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
31282b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
31292b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
31305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
31312b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
31322b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
31332b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
3134ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
3135c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3136c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3137c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
3138c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3139c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
3140c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
3141c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
3142c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3143c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3144c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
3145c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3146c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
3147c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
3148c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
3149c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3150c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3151c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
3152c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3153c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
3154c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
3155c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
3156ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3157ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3158ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
3159ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3160ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
3161ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
3162ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
3163ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3164ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3165ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
3166ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3167ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
3168ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
3169ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
3170ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3171ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3172ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
3173ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3174ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
3175ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
3176ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
3177ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3178ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3179ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
3180ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3181ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
3182ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
3183ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
3184ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3185ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3186ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
3187ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3188ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
3189ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
3190ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
3191ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3192ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3193ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
3194ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3195ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
3196ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
3197273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3198f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3199f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3200f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
3201f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3202f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3203f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    Hwc2TestLayers* testLayers) {
3204f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3205f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3206f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        layer, testLayers->getVisibleRegion(layer)));
3207f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
3208f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3209f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            advanceVisibleRegions));
3210f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
3211f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3212f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3213f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3214f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
3215f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3216f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            setVisibleRegion));
3217f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
3218f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3219273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3220273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3221273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3222273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3223273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
32245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
3225273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3226273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
32275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
3228f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
3229f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3230f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            /* TestLayer z orders are set during the construction of TestLayers
3231f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * and cannot be updated. There is no need (or ability) to cycle
3232f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * through additional z order configurations. */
3233f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2TestLayers* /*testLayers*/) {
3234f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                return false;
3235273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
3236273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
3237273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
3238273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3239273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3240273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3241273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3242273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3243273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3244273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
3245273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
3246273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3247273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
3248273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
3249273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3250273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3251273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3252273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
3253273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
3254273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3255273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3256273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3257273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3258273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3259273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
3260273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3261273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
3262273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3263273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3264273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
3265273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
3266273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
3267273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3268273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3269273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3270273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3271273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3272273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
3273273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
32741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display a layer with basic property
32761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * coverage */
32771cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
32781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
32791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
32801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3281706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3282563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
32831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32841cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
32851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
32861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
32881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
32891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
32901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
32911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
32921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
32931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
32941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
32951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
32971cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
32981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
32991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
33001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3301706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3302563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
33031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
33051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
33061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
33081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
33091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
33101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
33111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
33121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
33131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
33141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
33151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
33171cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
33181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
33191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_display_t display;
33201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    uint32_t numTypes, numRequests;
33211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
33221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
33241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
33261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            &err));
33271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
33281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
3329706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3330706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3331706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3332706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3333706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3334706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3335706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3336706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3337563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
3338706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3339706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3340706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3341706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3342706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3343706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3344706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3345706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3346706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3347706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3348706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3349706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        numRequests));
3350706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3351706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3352706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3353706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3354706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3355706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3356706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3357706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3358706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_request_t displayRequests;
3359706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3360706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_request_t> layerRequests;
3361706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3362706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3363706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3364706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3365706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3366706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &layers, &layerRequests, &err));
3367706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3368706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3369706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3370706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3371706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3372706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3373706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3374706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3375706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3376706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3377706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3378706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_display_request_t displayRequests;
3379706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_layer_request_t> layerRequests;
3380706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3381706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3382706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3383706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &displayRequests, layers, &layerRequests, &err));
3384706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3385706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3386706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3387706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3388706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3389706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3390706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get changed composition types after
3391706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validating a basic layer. */
3392706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3393706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3394706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3395706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3396706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3397563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* testLayers) {
3398706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3399706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3400706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3401706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3402706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3403706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3404706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3405706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3406706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3407706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3408706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3409563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        *testLayers, layers, numTypes));
3410706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3411706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3412706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3413706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3414706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3415706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3416706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3417706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3418706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3419706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3420706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_composition_t> types;
3421706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3422706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3423706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3424706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3425706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3426706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &types, &err));
3427706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3428706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3429706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3430706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3431706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3432706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3433706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3434706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3435706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3436706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3437706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3438706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_composition_t> types;
3439706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3440706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3441706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3442706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        display, layers, &types, &err));
3443706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3444706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3445706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3446706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3447706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3448706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3449706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3450706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3451706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3452706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3453706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3454706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3455706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3456563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* testLayers) {
3457706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3458706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3459706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3460706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3461706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3462706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3463706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3464706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3465706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3466706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3467706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3468563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        *testLayers, layers, numTypes));
3469706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3470706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3471706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3472706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3473706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3474706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3475706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3476706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3477706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3478706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3479706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3480706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3481706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3482706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3483706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3484706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3485706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3486706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3487706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3488706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3489706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3490706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3491706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3492706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3493706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3494706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* /*layers*/) {
3495706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3496706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3497706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3498706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3499706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3500706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3501706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3502706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3503706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3504f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3505f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 supports client target with required values */
3506f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3507f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3508f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3509f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3510f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3511f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3512f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3513f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3514f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3515f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3516f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3517f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace()));
3518f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3519f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3520f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3521f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3522f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3523f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3524f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * display. */
3525f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3526f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3527f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3528f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t /*display*/,
3529f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3530f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3531f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3532f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3533f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_display_t badDisplay;
3534f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3535f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3536f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3537f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3538f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3539f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3540f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3541f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3542f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3543f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3544f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3545f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3546f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3547f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3548f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * for a variety of client target values. */
3549f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3550f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3551f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3552f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3553f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3554f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3555f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3556f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3557f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3558f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3559f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3560f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3561f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3562f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_TRUE(err == HWC2_ERROR_NONE
3563f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        || err == HWC2_ERROR_UNSUPPORTED)
3564f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        << "returned wrong error code";
3565f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3566f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3567f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3568f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3569f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3570f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3571f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * layer. */
3572f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3573f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3574f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3575f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3576f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const size_t layerCnt = 1;
3577f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3578f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto display : mDisplays) {
3579f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        std::vector<hwc2_config_t> configs;
3580f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3581f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3582f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3583f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3584f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3585f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto config : configs) {
3586f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Area displayArea;
3587f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_layer_t> layers;
3588f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3589f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3590f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3591f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3592f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3593f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3594f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    displayArea);
3595f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3596f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (!testLayers.optimizeLayouts())
3597f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                continue;
3598f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3599f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTarget testClientTarget;
3600f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3601f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            do {
3602f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clientLayers;
3603f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clearLayers;
3604f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                uint32_t numTypes, numRequests;
3605f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool hasChanges, skip;
3606f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool flipClientTarget;
3607f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                buffer_handle_t handle;
3608f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                int32_t acquireFence;
3609f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3610f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3611f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &testLayers, &skip));
3612f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (skip)
3613f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    continue;
3614f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3615f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3616f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &numRequests, &hasChanges));
3617f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (hasChanges)
3618f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3619f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            << "wrong number of requests";
3620f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3621f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3622f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testLayers, layers, numTypes, &clientLayers));
3623f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3624f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        numRequests, &clearLayers, &flipClientTarget));
3625f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3626f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        clearLayers, flipClientTarget, displayArea, &handle,
3627f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &acquireFence), 0);
3628f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3629f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        acquireFence, dataspace, damage));
3630f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3631f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (acquireFence >= 0)
3632f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    close(acquireFence);
3633f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3634f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            } while (testLayers.advance());
3635f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3636f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3637f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
3638f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3639f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3640f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
3641f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3642f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3643f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3644f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3645f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3646f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_display_t display;
3647f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::vector<hwc2_layer_t> layers;
3648f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const Area displayArea = {0, 0};
3649f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3650f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> clientLayers;
3651f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> flipClientTargetLayers;
3652f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool flipClientTarget = true;
3653f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3654f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3655f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    buffer_handle_t handle;
3656f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    int32_t acquireFence;
3657f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3658f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3659f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3660f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3661f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestClientTarget testClientTarget;
3662f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3663f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3664f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3665f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            &acquireFence), 0);
3666f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3667f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3668f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            dataspace, damage, &err));
3669f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3670f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (acquireFence >= 0)
3671f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        close(acquireFence);
3672f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3673f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3674f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3675563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3676563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3677563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3678563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3679563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3680563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3681563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3682563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3683563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3684563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3685563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3686563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3687563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3688563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3689563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3690563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3691563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3692563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3693563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3694563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3695563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3696563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3697563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3698563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3699563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3700563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3701563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3702563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3703563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 3;
3704563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3705563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3706563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3707563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3708563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3709563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3710563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3711563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3712563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3713563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3714563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3715563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 4;
3716563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3717563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3718563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3719563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3720563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3721563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3722563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3723563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3724563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3725563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3726563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3727563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 5;
3728563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3729563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3730563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3731563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3732563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3733563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3734563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3735563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3736563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3737563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3738563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3739563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 6;
3740563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3741563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3742563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3743563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3744563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3745563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3746563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3747563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3748563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3749563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * blend mode. */
3750563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3751563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3752563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3753563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3754563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3755563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3756563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3757563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3758563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3759563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3760563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3761563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3762563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3763563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3764563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3765563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * blend mode. */
3766563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3767563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3768563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3769563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3770563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3771563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3772563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3773563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3774563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3775563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3776563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3777563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3778563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3779563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3780563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * buffer. */
3781563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3782563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3783563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3784563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3785563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3786563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3787563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3788563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3789563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3790563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3791563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3792563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3793563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3794563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * color. */
3795563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3796563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3797563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3798563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3799563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3800563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3801563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3802563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3803563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3804563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3805563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3806563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3807563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3808563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3809563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * color. */
3810563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3811563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3812563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3813563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3814563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3815563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3816563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3817563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3818563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
3819563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3820563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3821563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3822563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3823563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3824563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3825563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3826563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * composition. */
3827563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3828563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3829563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3830563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3831563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3832563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3833563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3834563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3835563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3836563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3837563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3838563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3839563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3840563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * cursor. */
3841563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3842563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3843563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3844563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3845563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3846563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3847563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3848563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3849563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3850563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3851563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3852563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3853563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3854563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3855563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * cursor. */
3856563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3857563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3858563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3859563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3860563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3861563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3862563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3863563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3864563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3865563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3866563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3867563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3868563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3869563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3870563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3871563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * dataspace. */
3872563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3873563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3874563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3875563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3876563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3877563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3878563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3879563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3880563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3881563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3882563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3883563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3884563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3885563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3886563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3887563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3888563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3889563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3890563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3891563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3892563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3893563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3894563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3895563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3896563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3897563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3898563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3899563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3900563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3901563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3902563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3903563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3904563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3905563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3906563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3907563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3908563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3909563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3910563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3911563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3912563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3913563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3914563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3915563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3916563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 3;
3917563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3918563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3919563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3920563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3921563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3922563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3923563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3924563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3925563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3926563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3927563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3928563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3929563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3930563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 4;
3931563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3932563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3933563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3934563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3935563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3936563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3937563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3938563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3939563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3940563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3941563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * plane alpha. */
3942563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3943563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3944563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3945563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3946563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3947563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3948563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3949563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3950563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3951563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3952563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3953563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3954563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3955563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3956563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * plane alpha. */
3957563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3958563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3959563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3960563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3961563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3962563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3963563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3964563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3965563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3966563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3967563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3968563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3969563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3970563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3971563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * source crop. */
3972563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3973563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3974563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3975563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3976563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3977563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3978563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3979563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3980563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3981563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3982563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3983563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3984563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3985563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3986563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * source crop. */
3987563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3988563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3989563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3990563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3991563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3992563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3993563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3994563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3995563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3996563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3997563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3998563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3999563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4000563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4001563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4002563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * surface damage. */
4003563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
4004563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4005563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
4006563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4007563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4008563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
4009563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4010563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4011563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4012563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4013563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4014563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4015563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4016563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * transform. */
4017563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
4018563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4019563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
4020563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4021563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4022563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
4023563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4024563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4025563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4026563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4027563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4028563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4029563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4030563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * transform. */
4031563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
4032563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4033563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
4034563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4035563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4036563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
4037563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4038563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4039563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4040563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4041563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4042563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4043563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4044563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4045563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * basic. */
4046563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
4047563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4048563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
4049563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4050563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
4051563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4052563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4053563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4054563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4055563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4056563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4057563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot present a bad display.  */
4058563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
4059563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4060563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_display_t display;
4061563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    int32_t presentFence;
4062563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4063563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4064563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4065563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4066563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
4067563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4068563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4069563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4070563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
4071563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
4072563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4073563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
4074563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
4075563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    const std::vector<hwc2_layer_t>& /*layers*/,
4076563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
4077563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4078563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                int32_t presentFence;
4079563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
4080563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4081563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4082563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        HWC2_POWER_MODE_ON));
4083563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
4084563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4085563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
4086563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4087563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
4088563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        &presentFence, &err));
4089563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
4090563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        << "returned wrong error code";
4091563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4092563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
4093563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4094563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        HWC2_POWER_MODE_OFF));
4095563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            }
4096563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ));
4097563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4098563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4099563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
4100563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
4101563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4102563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_display_t display;
4103563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::vector<hwc2_layer_t> layers;
4104563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::vector<int32_t> fences;
4105563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4106563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4107563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4108563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4109563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
4110563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4111563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
411235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
411335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wallstatic const std::array<android_color_mode, 9> androidColorModes = {{
411435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_NATIVE,
411535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_625,
411635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
411735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_525,
411835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
411935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT709,
412035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_DCI_P3,
412135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_SRGB,
412235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_ADOBE_RGB,
412335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}};
412435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
412535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
412635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * display must support HAL_COLOR_MODE_NATIVE */
412735040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_COLOR_MODES)
412835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
412935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
413035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
413135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
413235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                std::vector<android_color_mode_t> colorModes;
413335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
413435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
413535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &colorModes));
413635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
413735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
413835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        HAL_COLOR_MODE_NATIVE), 0) << "all displays"
413935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        " must support HAL_COLOR_MODE_NATIVE";
414035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
414135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
414235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
414335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
414435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
414535040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
414635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
414735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
414835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    std::vector<android_color_mode_t> colorModes;
414935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
415035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
415135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
415235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
415335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
415435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
415535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
415635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
415735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
415835040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES)
415935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
416035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
416135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
416235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
416335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
416435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
416535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
416635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
416735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
416835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
416935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
417035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
417135040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
417235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
417335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
417435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
417535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
417635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
417735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
417835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
417935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
418035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
418135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
418235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
418335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
418435040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
418535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
418635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
418735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
418835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
418935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_mode_t colorMode =
419035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        static_cast<android_color_mode_t>(-1);
419135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
419235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
419335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
419435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &err));
419535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
419635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        << "returned wrong error code";
419735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
419835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
419935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
420035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
420135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
420235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * for all valid color modes. */
420335040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
420435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
420535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
420635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
420735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
420835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                for (auto colorMode : androidColorModes) {
420935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    hwc2_error_t err = HWC2_ERROR_NONE;
421035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
421135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
421235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            colorMode, &err));
421335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
421435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    EXPECT_TRUE(err == HWC2_ERROR_NONE
421535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            || err == HWC2_ERROR_UNSUPPORTED)
421635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            << "returned wrong error code";
421735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                }
421835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
421935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
422035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
422135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
422235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
422335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * test if they are valid. */
422435040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
422535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
422635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
422735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
422835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
422935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                std::vector<android_hdr_t> hdrCapabilities;
423035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                float maxLuminance, maxAverageLuminance, minLuminance;
423135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
423235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
423335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
423435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &minLuminance));
423535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
423635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                if (hdrCapabilities.empty())
423735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    return;
423835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
423935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_GE(maxLuminance, maxAverageLuminance);
424035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_GE(maxAverageLuminance, minLuminance);
424135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
424235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
424335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
424435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
424535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
424635040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
424735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
424835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
424935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    std::vector<android_hdr_t> hdrCapabilities;
425035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    float maxLuminance, maxAverageLuminance, minLuminance;
425135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
425235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
425335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
425435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
425535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
425635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
425735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
425835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
425935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
426035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wallstatic const std::array<float, 16> identityMatrix = {{
426135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    1.0,  0.0,  0.0,  0.0,
426235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    0.0,  1.0,  0.0,  0.0,
426335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    0.0,  0.0,  1.0,  0.0,
426435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    0.0,  0.0,  0.0,  1.0,
426535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}};
426635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
426735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* Values for the color transform matrices were precomputed using the source code
426835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * in surfaceflinger/Effects/Daltonizer.cpp. */
426935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
427035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wallstatic const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
427135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    identityMatrix,
427235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Converts RGB color to the XYZ space */
427335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 0.4124, 0.2126, 0.0193, 0,
427435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.3576, 0.7152, 0.1192, 0,
427535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.1805, 0.0722, 0.9505, 0,
427635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0     , 0     , 0     , 1 }},
427735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Protanomaly */
427835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 0.068493,  0.931506,  0,  0,
427935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.068493,  0.931507,  0,  0,
428035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.013626, -0.013626,  1,  0,
428135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,         0,         0,  1 }},
428235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Deuteranomaly */
428335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 0.288299, 0.711701,  0,  0,
428435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.052709, 0.947291,  0,  0,
428535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall      -0.257912, 0.257912,  1,  0,
428635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,        0,         0,  1 }},
428735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Tritanomaly */
428835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 1, -0.805712, 0.805712,  0,
428935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,  0.378838, 0.621162,  0,
429035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,  0.104823, 0.895177,  0,
429135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,  0,        0,         1 }},
429235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}};
429335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
429435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can set the identity color transform */
429535040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
429635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
429735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
429835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
429935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
430035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
430135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
430235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
430335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
430435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
430535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
430635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
430735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * display. */
430835040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
430935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
431035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
431135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
431235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
431335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
431435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
431535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
431635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            HAL_COLOR_TRANSFORM_IDENTITY, &err));
431735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
431835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
431935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
432035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
432135040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
432235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
432335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
432435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
432535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
432635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_transform_t hint =
432735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        static_cast<android_color_transform_t>(-1);
432835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
432935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
433035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
433135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        identityMatrix, hint, &err));
433235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
433335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        << "returned wrong error code";
433435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
433535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
433635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
433735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
433835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
433935040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
434035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
434135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
434235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
434335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
434435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_transform_t hint =
434535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
434635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
434735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                for (const std::array<float, 16>& matrix : exampleMatrices) {
434835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
434935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            matrix, hint));
435035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                }
435135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
435235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
435335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
4354bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4355bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
4356bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
4357bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4358bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4359bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
4360bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
4361bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4362bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4363bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
4364bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * displays. */
4365bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
4366bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4367bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4368bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::vector<hwc2_display_t> displays;
4369bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4370bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    do {
4371bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        const UnsignedArea& dimension =
4372bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                testVirtualDisplay.getDisplayDimension();
4373bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4374bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_display_t display;
4375bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
4376bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4377bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
4378bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                dimension.height, &desiredFormat, &display, &err));
4379bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4380bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
4381bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4382bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_GE(desiredFormat, 0) << "invalid format";
4383bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4384bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (err == HWC2_ERROR_NONE)
4385bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            displays.push_back(display);
4386bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4387bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    } while (testVirtualDisplay.advance());
4388bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4389bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    for (hwc2_display_t display : displays) {
4390bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4391bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4392bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4393bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4394bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays.  */
4395bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
4396bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4397bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_display_t display;
4398bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4399bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4400bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4401bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4402bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4403bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4404bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4405bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4406bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
4407bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
4408bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4409bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_display_t display = HWC_DISPLAY_PRIMARY;
4410bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4411bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4412bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4413bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
4414bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4415bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4416bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
4417bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
4418bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4419bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    uint32_t maxCnt;
4420bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4421bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4422bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4423bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4424bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
4425bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * each call. */
4426bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
4427bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4428bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    uint32_t maxCnt1, maxCnt2;
4429bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4430bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
4431bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
4432bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4433bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
4434bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            " counts";
4435bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4436bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4437bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
4438bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * that it reports. */
4439bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
4440bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4441bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::vector<hwc2_display_t> displays;
4442bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    uint32_t maxCnt;
4443bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4444bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4445bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4446bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    while (displays.size() < maxCnt) {
4447bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        uint32_t width = 1920, height = 1080;
4448bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4449bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_display_t display;
4450bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
4451bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4452bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
4453bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    &desiredFormat, &display, &err));
4454bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4455bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
4456bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                << "returned wrong error code";
4457bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (err != HWC2_ERROR_NONE)
4458bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            break;
4459bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4460bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        displays.push_back(display);
4461bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4462bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4463bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    for (hwc2_display_t display : displays) {
4464bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4465bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4466bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4467bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4468bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
4469bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * display. */
4470bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
4471bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4472bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4473bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
4474bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* testVirtualDisplay) {
4475bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4476bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                buffer_handle_t handle;
4477bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                android::base::unique_fd acquireFence;
4478bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4479bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                if (testVirtualDisplay->getBuffer(&handle, &acquireFence) >= 0)
4480bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
4481bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                            handle, acquireFence));
4482bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            }));
4483bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4484bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4485bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
4486bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
4487bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4488bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4489bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* test, hwc2_display_t /*display*/,
4490bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* testVirtualDisplay) {
4491bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4492bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                hwc2_display_t badDisplay;
4493bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                buffer_handle_t handle;
4494bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                android::base::unique_fd acquireFence;
4495bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
4496bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4497bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
4498bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4499bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                if (testVirtualDisplay->getBuffer(&handle, &acquireFence) < 0)
4500bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    return;
4501bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4502bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
4503bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        handle, acquireFence, &err));
4504bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
4505bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        << "returned wrong error code";
4506bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            }));
4507bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4508bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4509bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
4510bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
4511bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4512bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4513bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
4514bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
4515bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4516bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                const buffer_handle_t handle = nullptr;
4517bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                uint32_t releaseFence = -1;
4518bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
4519bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4520bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
4521bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        releaseFence, &err));
4522bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4523bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        << "returned wrong error code";
4524bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            }));
4525bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4526bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4527bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
4528bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * display */
4529bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
4530bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4531bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    for (auto display : mDisplays) {
4532bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4533bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4534bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        do {
4535bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            buffer_handle_t handle;
4536bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            android::base::unique_fd acquireFence;
4537bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
4538bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4539bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            if (testVirtualDisplay.getBuffer(&handle, &acquireFence) < 0)
4540bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                continue;
4541bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4542bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
4543bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    acquireFence, &err));
4544bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4545bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4546bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } while (testVirtualDisplay.advance());
4547bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4548bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4549ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
4550ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall/* TESTCASE: Tests that the HWC2 can dump debug information. */
4551ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa WallTEST_F(Hwc2Test, DUMP)
4552ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall{
4553ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall    std::string buffer;
4554ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall
4555ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall    ASSERT_NO_FATAL_FAILURE(dump(&buffer));
4556ae7d324fcad6d561bc0ee460f296ff2ad8306b00Marissa Wall}
4557