Hwc2Test.cpp revision bad1bc78ef50648fadbe725a1fe1c28d62097351
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
1025f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
1026f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
1027f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
1028f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (mDisplays.count(display) == 0) {
1029f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                *outDisplay = display;
1030f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                return;
1031f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
1032f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
1033f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
1034f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                " are registered. This should never happen.";
1035f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
1036f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1037563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
1038563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            int64_t* outTimestamp = nullptr)
1039563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1040563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
1041563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
1042563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
1043563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                " vsync callback";
1044563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outDisplay)
1045563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outDisplay = mVsyncDisplay;
1046563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (outTimestamp)
1047563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            *outTimestamp = mVsyncTimestamp;
1048563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1049563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1050563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void enableVsync(hwc2_display_t display)
1051563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1052563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
1053563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
1054563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                hwc2TestVsyncCallback)));
1055563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1056563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1057563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1058563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void disableVsync(hwc2_display_t display)
1059563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1060563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1061563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1062563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
10634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
10644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
10654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
10664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
10674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
10684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
10704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
10714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
10724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
10744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
10764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
10784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
10794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
10804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1081cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
1082cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
1083cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
1084cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
1085cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
1086cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
1087cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
1088cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1089cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
1090cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
1091cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
1092cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
1093cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1094cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
1095cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
1096cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
1097cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
1098cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
1099cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
1101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
1102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
1103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
1105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
1106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
1108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
1109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
11111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
11121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
11131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
11141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
11151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
11161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
11171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
11181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
11201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
11221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
11231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
11241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
11251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
11261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
11271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
11281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
11291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
11301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
11321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
11351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
11361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
11371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
11381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
11401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1142cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
1143cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
1144cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1145cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1146cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1147cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1148cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
1149cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1150cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
1151cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
1152cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1153cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1154cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
1155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
1156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
1157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
1160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
11626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
11636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
11646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
11656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
11665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
11676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1168273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
1169273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
1170273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
1171273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
11725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayers* testLayers);
1173273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
11746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
11756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
11766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
11776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
11785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            Hwc2TestLayer* testLayer, hwc2_error_t* outErr);
11796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
11816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
11826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
11836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
11846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
11851cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* Is called after a display is powered on and all layer properties have
11861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * been set. It should be used to test functions such as validate, accepting
11871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * changes, present, etc. */
11881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    using TestDisplayLayersFunction = void (*)(Hwc2Test* test,
1189706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, const std::vector<hwc2_layer_t>& layers,
1190563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            Hwc2TestLayers* testLayers);
1191706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1192706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* It is called on an non validated display */
1193706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    using TestDisplayNonValidatedLayersFunction = void (*)(Hwc2Test* test,
1194706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            hwc2_display_t display, std::vector<hwc2_layer_t>* layers);
11951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1196f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Tests client target support on a particular display and config */
1197f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using TestClientTargetSupportFunction = void (*)(Hwc2Test* test,
1198f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            hwc2_display_t display,
1199f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            const Hwc2TestClientTargetSupport& testClientTargetSupport);
1200f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
120135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Tests a particular active display config */
120235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    using TestActiveDisplayConfigFunction = void (*)(Hwc2Test* test,
120335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            hwc2_display_t display);
120435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
1205bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    /* Tests a newly created virtual display */
1206bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    using TestCreateVirtualDisplayFunction = void (*)(Hwc2Test* test,
1207bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_display_t display, Hwc2TestVirtualDisplay* testVirtualDisplay);
1208bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
12096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
12106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
12116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1212f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    /* Advances properties of Hwc2TestLayers */
1213f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    using AdvanceProperties = bool (*)(Hwc2TestLayers* testLayer);
1214f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1215f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Advances properties of Hwc2TestClientTargetSupport */
1216f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    using AdvanceClientTargetSupport = bool (*)(
1217f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTargetSupport* testClientTargetSupport);
1218f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
12196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
12206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
12216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
12226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
12236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
12246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
12256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
12266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
12276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
12296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
12316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1232600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
12336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1235600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1236600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1237600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
12386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
12406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
12435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
12446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
12476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
12486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
12496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
12506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
12526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
12536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
12546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
12556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
12566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
12576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
12586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
12596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
12616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
12636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
1264600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
12656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1267600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1268600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1269600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
12706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
12746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
12755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            &testLayer, nullptr));
12766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
12776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
12786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
12806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
12816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
12826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
1283273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
1284273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
1285273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
1286273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
1287273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
1288f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            TestLayerPropertiesFunction function, AdvanceProperties advance)
1289273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
1290273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
1291273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
1292273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1293273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1294273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1295273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
1296273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
1297600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
1298273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1299273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1300600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1301600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1302273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1303273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1304600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
1305273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1306f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                do {
1307f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    for (auto layer : layers) {
1308f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
1309f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                                &testLayers));
1310f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    }
1311f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                } while (advance(&testLayers));
1312273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1313273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1314273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
1315273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
1316273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
1317273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
13186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
13196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
13206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
13216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
13226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
13236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
13246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
13256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
13266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
13276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
13286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
13296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
13306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
13326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
13346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
1335600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
13366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
13376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1339600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1340600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
1341600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
13426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
13445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
13456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
13505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
13516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
13565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        &testLayer, &err));
13576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
13586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
13596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
13606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
13616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
13636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
13646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
13656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
13666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
13676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
13686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
13696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
13716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
13736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
13746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
13756bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
13776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
13796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
13816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
13826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
13836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
13856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
13866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
13876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
13886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
13891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    /* For each active display it powers on the display, cycles through each
13901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * config and creates a set of layers with a certain amount of coverage.
13911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * For each active display, for each config and for each set of layers,
13921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall     * it calls the TestDisplayLayersFunction */
13931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void displayLayers(Hwc2TestCoverage coverage, size_t layerCnt,
13941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            TestDisplayLayersFunction function)
13951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
13961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto display : mDisplays) {
13971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            std::vector<hwc2_config_t> configs;
13981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
13991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
14001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
14021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            for (auto config : configs) {
14041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Area displayArea;
14051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                std::vector<hwc2_layer_t> layers;
14061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
14081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
14091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
14111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
14121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                do {
14141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    bool skip;
14151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
14171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            &testLayers, &skip));
14181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    if (!skip)
1419706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        EXPECT_NO_FATAL_FAILURE(function(this, display, layers,
1420563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                                &testLayers));
14211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                } while (testLayers.advance());
14231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
14251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        std::move(layers)));
14261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
14271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
14281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
14291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
14301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
14311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1432706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    /* For each active display, it calls the
1433706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * TestDisplayNonValidatedLayersFunction on a variety on non-validated
1434706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall     * layer combinations */
1435706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    void displayNonValidatedLayers(size_t layerCnt,
1436706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            TestDisplayNonValidatedLayersFunction function)
1437706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    {
1438706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        for (auto display : mDisplays) {
1439706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            uint32_t numTypes, numRequests;
1440706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            std::vector<hwc2_layer_t> layers;
1441706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            bool hasChanges;
1442706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1443706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1444706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1445706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1446706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1447706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1448706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1449706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1450706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1451706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1452706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1453706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_CLIENT));
1454706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1455706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1456706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1457706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1458706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1459706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    &numRequests, &hasChanges));
1460706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1461706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            for (auto layer : layers) {
1462706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
1463706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        HWC2_COMPOSITION_DEVICE));
1464706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
1465706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1466706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1467706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1468706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
1469706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1470706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display, &layers));
1471706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1472706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1473706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall        }
1474706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    }
1475706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
1476f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    /* Test client target support on each config on each active display */
1477f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    void setClientTargetSupport(Hwc2TestCoverage coverage,
1478f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            TestClientTargetSupportFunction function,
1479f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            AdvanceClientTargetSupport advance)
1480f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    {
1481f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto display : mDisplays) {
1482f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_config_t> configs;
1483f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1484f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1485f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1486f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            for (auto config : configs) {
1487f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Area displayArea;
1488f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1489f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1490f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1491f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &displayArea));
1492f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                Hwc2TestClientTargetSupport testClientTargetSupport(coverage,
1493f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        displayArea);
1494f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1495f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                do {
1496f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display,
1497f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            testClientTargetSupport));
1498f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
1499f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                } while (advance(&testClientTargetSupport));
1500f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
1501f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
1502f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
1503f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
150435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Cycles through each config on each active display and calls
150535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall     * a TestActiveDisplayConfigFunction */
150635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    void setActiveDisplayConfig(TestActiveDisplayConfigFunction function)
150735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {
150835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        for (auto display : mDisplays) {
150935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            std::vector<hwc2_config_t> configs;
151035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
151135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
151235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
151335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            for (auto config : configs) {
151435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
151535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
151635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(function(this, display));
151735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
151835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall        }
151935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    }
152035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
1521bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    /* Creates a virtual display for testing */
1522bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    void createVirtualDisplay(Hwc2TestCoverage coverage,
1523bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            TestCreateVirtualDisplayFunction function)
1524bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {
1525bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestVirtualDisplay testVirtualDisplay(coverage);
1526bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1527bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        do {
1528bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_display_t display;
1529bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1530bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1531bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            const UnsignedArea& dimension =
1532bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    testVirtualDisplay.getDisplayDimension();
1533bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
1534bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1535bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
1536bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    dimension.height, &desiredFormat, &display, &err));
1537bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1538bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
1539bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    || err == HWC2_ERROR_UNSUPPORTED)
1540bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    << "returned wrong error code";
1541bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_GE(desiredFormat, 0) << "invalid format";
1542bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1543bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            if (err != HWC2_ERROR_NONE)
1544bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                continue;
1545bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1546bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_NO_FATAL_FAILURE(function(this, display,
1547bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    &testVirtualDisplay));
1548bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1549bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
1550bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1551bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } while (testVirtualDisplay.advance());
1552bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
1553bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1554bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1555600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
1556600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
1557600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1558600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
1559600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
1560600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1561600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
1562600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
1563600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
1564600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1565600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1566600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
1567600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
1568600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1569600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
1570600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
1571600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
1572600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
1573600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1574563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void closeFences(hwc2_display_t display, int32_t presentFence)
1575563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1576563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::vector<hwc2_layer_t> layers;
1577563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        std::vector<int32_t> fences;
1578563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        const int msWait = 3000;
1579563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1580563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        if (presentFence >= 0) {
1581563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_GE(sync_wait(presentFence, msWait), 0);
1582563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            close(presentFence);
1583563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1584563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1585563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences));
1586563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        EXPECT_EQ(layers.size(), fences.size());
1587563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1588563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        for (int32_t fence : fences) {
1589563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            EXPECT_GE(sync_wait(fence, msWait), 0);
1590563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            if (fence >= 0)
1591563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                close(fence);
1592563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1593563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1594563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
15951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display, hwc2_layer_t layer,
15961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
15971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
15981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_composition_t composition;
15991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        buffer_handle_t handle = nullptr;
16001cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        int32_t acquireFence;
16011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
16021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = true;
16031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (!testLayers->contains(layer))
16051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
16061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        composition = testLayers->getComposition(layer);
16081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        /* If the device cannot support a buffer format, then do not continue */
16101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if ((composition == HWC2_COMPOSITION_DEVICE
16111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                || composition == HWC2_COMPOSITION_CURSOR)
16121cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                && testLayers->getBuffer(layer, &handle, &acquireFence) < 0)
16131cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            return;
16141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerCompositionType(display, layer,
16161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                composition, &err));
16171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        if (err == HWC2_ERROR_UNSUPPORTED)
16181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_TRUE(composition != HWC2_COMPOSITION_CLIENT
16191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    && composition != HWC2_COMPOSITION_DEVICE);
16201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        const hwc_rect_t cursor = testLayers->getCursorPosition(layer);
16221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBuffer(display, layer, handle,
16241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                acquireFence));
16251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerBlendMode(display, layer,
16261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getBlendMode(layer)));
16271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerColor(display, layer,
16281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getColor(layer)));
16291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setCursorPosition(display, layer, cursor.left,
16301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                cursor.top));
16311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDataspace(display, layer,
16321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDataspace(layer)));
16331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerDisplayFrame(display, layer,
16341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getDisplayFrame(layer)));
16351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerPlaneAlpha(display, layer,
16361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getPlaneAlpha(layer)));
16371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSourceCrop(display, layer,
16381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSourceCrop(layer)));
16391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerSurfaceDamage(display, layer,
16401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getSurfaceDamage(layer)));
16411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerTransform(display, layer,
16421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getTransform(layer)));
16431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerVisibleRegion(display, layer,
16441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getVisibleRegion(layer)));
16451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer,
16461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                testLayers->getZOrder(layer)));
16471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        *outSkip = false;
16491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
16501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
16511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    void setLayerProperties(hwc2_display_t display,
16521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            const std::vector<hwc2_layer_t>& layers,
16531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            Hwc2TestLayers* testLayers, bool* outSkip)
16541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    {
16551cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        for (auto layer : layers) {
16561cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            EXPECT_NO_FATAL_FAILURE(setLayerProperties(display, layer,
16571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    testLayers, outSkip));
16581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            if (*outSkip)
16591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                return;
16601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall        }
16611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    }
16621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
1663563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void setClientTarget(hwc2_display_t display,
1664563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            Hwc2TestClientTarget* testClientTarget,
1665563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const Hwc2TestLayers& testLayers,
1666563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::set<hwc2_layer_t>& clientLayers,
1667563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
1668563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const Area& displayArea)
1669563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1670563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
1671563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        hwc_region_t damage = { };
1672563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        buffer_handle_t handle;
1673563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        int32_t acquireFence;
1674563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1675563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        ASSERT_EQ(testClientTarget->getBuffer(testLayers, clientLayers,
1676563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                clearLayers, flipClientTarget, displayArea, &handle,
1677563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                &acquireFence), 0);
1678563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
1679563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                dataspace, damage));
1680563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1681563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1682563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    void presentDisplays(size_t layerCnt, Hwc2TestCoverage coverage,
1683563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>&
1684563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            coverageExceptions, bool optimize)
1685563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    {
1686563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        for (auto display : mDisplays) {
1687563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            std::vector<hwc2_config_t> configs;
1688563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1689563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1690563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1691563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1692563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1693563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1694563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            for (auto config : configs) {
1695563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Area displayArea;
1696563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::vector<hwc2_layer_t> layers;
1697563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1698563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
1699563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
1700563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        &displayArea));
1701563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1702563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
1703563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea,
1704563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        coverageExceptions);
1705563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1706563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                if (optimize && !testLayers.optimizeLayouts())
1707563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    continue;
1708563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1709563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::set<hwc2_layer_t> clientLayers;
1710563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                std::set<hwc2_layer_t> clearLayers;
1711563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                Hwc2TestClientTarget testClientTarget;
1712563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1713563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                do {
1714563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    uint32_t numTypes, numRequests;
1715563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    bool hasChanges, skip;
1716563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    bool flipClientTarget;
1717563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    int32_t presentFence;
1718563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1719563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
1720563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &testLayers, &skip));
1721563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    if (skip)
1722563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        continue;
1723563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1724563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
1725563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &numRequests, &hasChanges));
1726563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    if (hasChanges)
1727563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
1728563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                                << "wrong number of requests";
1729563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1730563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
1731563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            testLayers, layers, numTypes, &clientLayers));
1732563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
1733563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            numRequests, &clearLayers, &flipClientTarget));
1734563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(setClientTarget(display,
1735563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &testClientTarget, testLayers, clientLayers,
1736563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            clearLayers, flipClientTarget, displayArea));
1737563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(acceptDisplayChanges(display));
1738563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1739563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(waitForVsync());
1740563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1741563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    EXPECT_NO_FATAL_FAILURE(presentDisplay(display,
1742563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                            &presentFence));
1743563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1744563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    ASSERT_NO_FATAL_FAILURE(closeFences(display, presentFence));
1745563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1746563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                } while (testLayers.advance());
1747563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1748563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display,
1749563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        std::move(layers)));
1750563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            }
1751563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
1752563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1753563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1754563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall        }
1755563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    }
1756563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
17574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
1758cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1759cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
1760cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
1761cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
1762cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
1763cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
1764cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1765cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
1766cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
1767cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
1768cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
17691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
17701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
17711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
17721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
177303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
177403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
177503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
177603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
1777572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1778bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    /* Store all created virtual displays that have not been destroyed. If an
1779bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall     * ASSERT_* fails, then destroy the virtual displays on exit */
1780bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::set<hwc2_display_t> mVirtualDisplays;
1781bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
1782572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
1783572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
1784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
1785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
17864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
17874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
1788cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
1789cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
1790cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1791cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
1792cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
1793cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
1794cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1795cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1796572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
1797572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
1798572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
1800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
1801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
1802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1804ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1806ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1807ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
18085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode(), outErr));
18095a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
18105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid setBuffer(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
18135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
18145a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    buffer_handle_t handle;
18155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    android::base::unique_fd acquireFence;
18165a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
18175a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (composition == HWC2_COMPOSITION_CLIENT
18195a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SOLID_COLOR
18205a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            || composition == HWC2_COMPOSITION_SIDEBAND)
18215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
18225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->getBuffer(&handle, &acquireFence) < 0)
18245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return;
18255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
18265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
18275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            composition));
18285a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
18295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            handle, acquireFence, outErr));
1830ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1831ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1832ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18335a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1834ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1835ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
1836ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
1837ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
18385a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getPlaneAlpha()));
1839ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
18405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            layer, testLayer->getBlendMode()));
1841ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
18425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getColor(), outErr));
1843ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1844ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
18456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
18476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18485a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    hwc2_composition_t composition = testLayer->getComposition();
18496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
18506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
18526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
18536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
18546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
18556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
18566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
18576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
18596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
18606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
18616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
18626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
18636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
18646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallvoid setCursorPosition(Hwc2Test* test, hwc2_display_t display,
18675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        hwc2_layer_t layer, Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
18682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
18692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
18702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            layer, HWC2_COMPOSITION_CURSOR));
18712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
18725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
18732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
18742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            cursorPosition.left, cursorPosition.top, outErr));
18752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
18762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1877b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1879b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1880b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
18815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDataspace(), outErr));
1882b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1883b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1884600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1886600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1887600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
18885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getDisplayFrame(), outErr));
1889600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1890600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
18912b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t *outErr)
18932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
18942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
18955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getBlendMode()));
18962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
18975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getPlaneAlpha(), outErr));
18982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
18992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1900c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1902c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1903c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
19045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSourceCrop(), outErr));
1905c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1906c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1907ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid setSurfaceDamage(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19085a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1909ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1910ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSurfaceDamage(display, layer,
19115a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getSurfaceDamage(), outErr));
1912ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1913ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1914ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19155a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1916ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1917ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
19185a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getTransform(), outErr));
1919ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1920ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
1921f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid setVisibleRegion(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1922f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1923f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
1924f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display, layer,
1925f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            testLayer->getVisibleRegion(), outErr));
1926f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
1927f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
1928273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
19295a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        Hwc2TestLayer* testLayer, hwc2_error_t* outErr)
1930273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
1931273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
19325a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            testLayer->getZOrder(), outErr));
1933273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
1934273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
1935ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
1936ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1937ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
1938ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1939ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
19405a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallbool advanceBuffer(Hwc2TestLayer* testLayer)
19415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
19425a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (testLayer->advanceComposition())
19435a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        return true;
19445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    return testLayer->advanceBufferArea();
19455a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
19465a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
1947ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
1948ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1949ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
1950ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
1951ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
1952ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1953ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
1954ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
1955ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
1956ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1957ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
19586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
19596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
19606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
19616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
19626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
19632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wallbool advanceCursorPosition(Hwc2TestLayer* testLayer)
19642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
19652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    return testLayer->advanceCursorPosition();
19662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
19672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
1968b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
1969b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1970b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
1971b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1972b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1973600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
1974600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1975600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1976600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1977600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
19782b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
19792b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
19802b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
19812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
19822b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1983c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1984c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1985c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1986c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1987c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1988c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1989c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1990ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallbool advanceSurfaceDamage(Hwc2TestLayer* testLayer)
1991ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
1992ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (testLayer->advanceSurfaceDamage())
1993ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return true;
1994ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return testLayer->advanceBufferArea();
1995ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
1996ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
1997ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1998ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1999ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
2000ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2001ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2002f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallbool advanceVisibleRegions(Hwc2TestLayers* testLayers)
2003f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
2004f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return testLayers->advanceVisibleRegions();
2005f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
2006f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
2007f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool advanceClientTargetSupport(
2008f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        Hwc2TestClientTargetSupport* testClientTargetSupport)
2009f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
2010f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return testClientTargetSupport->advance();
2011f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
20124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
20144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
20154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
20164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
20174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
20184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
20194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
20204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
20214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
20224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
20234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
20244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
20254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
20264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
20274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
20284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
20294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
20304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
20314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
20324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
20334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
20344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
20354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
20364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
20374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
20384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
20394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
20404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
20414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
20424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
20434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
20444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
20454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
20464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
20474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
20484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
20494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
20504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
20514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
20524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
20534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
20544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
20554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
20564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
20574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
20594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
20604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
20614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
20624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
20634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
20644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
20654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
20664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
20674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
20694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
20704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
20714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
20724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
20734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
20744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
20764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
20774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
20784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
20794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
20814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
20824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
20834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
20844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
2085a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2086a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
2087a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
2088a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
2089a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
2090a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
2091a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2092a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
2093a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
2094a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
2095a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
2096a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2097a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
2098a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2099a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
2100a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2101a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
2102a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
2103a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
2104a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2105a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
2106a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
2107a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
2108a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2109a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
2110a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2111a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2112a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
2113a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
2114a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2115a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
2116a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2117a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
2118a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
2119a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
2120a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
2121a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
2122a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
2123a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
2124a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
2125a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
2126a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
2127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2128cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
2129cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
2130cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
2131cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
2132cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
2133cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
2134cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2135cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
2136cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
2137cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
2138cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
2139cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
2140cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2141cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
2142cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
2143cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
2144cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
2145cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
2146cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
2147cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2148cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2149cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2150cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
2151cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
2152cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2153cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
21541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
21561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
21571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
21581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
21591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
21601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
21621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
21641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
21651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
21661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
21681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
21691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
21701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
21711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
21721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
21731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
21751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
21771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
21781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
21791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
21811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
21821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
21831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
21841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
21851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
21871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
21881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
21901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
21921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
21931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
21941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
21951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
21961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
21971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
21981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
21991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
22011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
22031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
22041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
22051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
22071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
22081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
22101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
22121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
22131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
22151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
22161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
22171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
22191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
22201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
22211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
22221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
22231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
22241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
22261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
22291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
22321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
22351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
22381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
22411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
22431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
22461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
22471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
22481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
22491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
22501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
2251cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2252cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
2253cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
2254cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
2255cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
2256cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2257cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
2258cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
2259cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
2260cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
2261cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
2262cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2263cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
2264cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
2265cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
2266cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2267cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2268cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2269cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2270cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2271cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2272cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
2273cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
2274cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2275cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
2276cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2277cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
2278cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
2279cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
2280cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
2281cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
2282cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
2283cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2284cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
2285cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
2286cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2287cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2288cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2289cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2290cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
2291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
2292cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
2293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
2295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
2302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
2303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
2304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
2308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
2309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2313cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
2314cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
2315cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2316cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
2317cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
2318cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
2319cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2320cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2321cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2322cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2323cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
2324cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2325cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
2326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
2330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
2331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
2332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
2337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
2338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
2341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
2342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
2345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2346cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
2347cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2348cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2349cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2350cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2351cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2352cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
2353cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
2354cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
2355cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
2356cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
2357cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2358cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2359cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2360cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
2361cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
2362cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2363cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2364cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2365cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2366cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2367cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2368cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2369cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2370cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
2371cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
2372cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2373cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
2374cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
2375cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2376cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2377cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2378cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2379cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
2380cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2381cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2382cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
2383cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2384cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2385cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
2386cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
2387cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
2388cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2389cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2390cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
2391cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2392cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
2393cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
2394cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2395cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
2396cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
2397cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2398cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
2399cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2400cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
2401cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
2402cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
2403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
2404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
2405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
2408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
2409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
2410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
2411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
2412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
2413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
241493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
241593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
241693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
241793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
241893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
241993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
242093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
242193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
242293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
242393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
242493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
242593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
242693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
242793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
242893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
242993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
243093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
243193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
243293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
243393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
243493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
243593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
243693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
243793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
243893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
243993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
244093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
244193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
244393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
244593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
244793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
244893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
244993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
245093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
245193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
245293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
245393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
245493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
245593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
245693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
245793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
245893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
245993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
246093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
246193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
246293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
246393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
246493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
246593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
246693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
246793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
246893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
246993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
247093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
247193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
247293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
247393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
247493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
247593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
247693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
247793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
247893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
247993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
248093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
248193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
248293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
248393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
248493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
248593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
248693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
248793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
248893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
248993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
249093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
249193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
249293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
249393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
249493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
249593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
249693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
249793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
249893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
249993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
250093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
250193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
250293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
250393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
250493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
250593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
250693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
250793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
250893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
250993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
251093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
251193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
251293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
251393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
251493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
251503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
251603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
251703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
251803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
251903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
252003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
252103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
252203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
252303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
252403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
252503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
252603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
252703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
252803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
252903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
253003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
253103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
253203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
253303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
253403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
253503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
253603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
253703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
253803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
253903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
254003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
254103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
254203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
254303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
254403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
254503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
254603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
254703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
254803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
254903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
255003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
255103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
255203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
255303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
255403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
255503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
255603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
255703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
255803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
255903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
256003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
256103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
256203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
256303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
256403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
256503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
256603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
256703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
256803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
256903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
257003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
257103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
257203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
257303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
257403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
257503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
257603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
257703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
257803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
257903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
258003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
258103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
258203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
258303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
258403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
258503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
258603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
258703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
258803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
258903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
259003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
259103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
259203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
259303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
259403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
259503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
259603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
259703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
259803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
259903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
260003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
260103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
260203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
260303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
260403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
260503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
260603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
260703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
260803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
260903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
261003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
261103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
261203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
261303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
261403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
261503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
261603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
261703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
261803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
261903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
262003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
262103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
262203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
262303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
262403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
262503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
262603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
262703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
262803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
262903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
263003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
263103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
263203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
263303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
263403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
263503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
263603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
263703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
263803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
263903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
264003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
264103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
264203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
264303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
264403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
264503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
264603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
264703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
264803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
264903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
265003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
265103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
265203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
265303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
265403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
265503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
2656572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2657572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
2658572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
2659572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
2660572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2661572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2662572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2663572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2664572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2665572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2666572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2667572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2668572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2669572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2670572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2671572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2672572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2678572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
2679572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
2680572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2681572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2682572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
2683572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
2684572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2685572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2686572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2687572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
2688572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2689572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
2690572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
2691572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2692572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
2693572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
2694572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2695572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
2696572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2697572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2698572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2699572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2700572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2701572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
2702572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
2703572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2704572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
2705572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2706572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
2707572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2708572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2709572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2710572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2711572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2712572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
2713572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2714572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
2715572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2716572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2717572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
2718572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2719572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2720572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2721572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
2722572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
2723572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2724572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2725572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2726572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2727572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
2728572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2729572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2730572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2731572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2732572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2733572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2734572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
2735572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
2736572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
2737572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2738572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2739572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2740572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2741572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2742572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
2743572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
2744572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
2745572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2746572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2747572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
2748572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
2749572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2750572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2751572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2752572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
2753572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
2754572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2755572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2756572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2757572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2758572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2759572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2760572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2761572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2762572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2763572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2764572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2765572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2766572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2767572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
2768572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
2769572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
2770572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2771572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2772572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2773572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2774572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
2775572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2776572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
2777572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2778572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
2779572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2780572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2781572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2782572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
2783572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
2784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
2785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
2786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
2787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
2788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
2789572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
2790572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
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        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
2798572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
2799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
2800dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2801dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
2802dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
2803dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2804dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
2805dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
2806dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2807dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
2808dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
2809dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
2810dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2811dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
2812dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
2813dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
2814dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
2815dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
2816dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
2817dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
2818dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2819dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
2820dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
2821dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
2822dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
2823dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
28246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
28266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
28276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
28306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
28316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
28336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
28346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
28356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
28376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
28386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
28396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
28416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
28426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
28446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
28456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
28466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
28486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
28496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
28506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
28516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
28526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
28536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
28546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
28556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
28566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
28576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
28586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2859ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
28602a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer. */
28612a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION)
28622a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28632a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28642a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
28652a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
28662a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28672a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can update the cursor position of a layer. */
28682a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_update)
28692a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28702a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
28712a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            ::setCursorPosition, advanceCursorPosition));
28722a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
28732a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28742a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 can set the cursor position of a layer when the
28752a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * composition type has not been set to HWC2_COMPOSITION_CURSOR. */
28762a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_composition_type_unset)
28772a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28782a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
28792a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
28805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
28812a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
28832a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display, layer,
28842a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        cursorPosition.left, cursorPosition.top, outErr));
28852a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            },
28862a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28872a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            advanceCursorPosition));
28882a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
28892a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28902a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad
28912a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall * display. */
28922a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_display)
28932a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
28942a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_display_t display;
28952a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_layer_t layer = 0;
28962a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    int32_t x = 0, y = 0;
28972a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
28982a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
28992a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
29002a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29012a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setCursorPosition(display, layer, x, y, &err));
29022a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
29032a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
29042a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29052a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the cursor position of a bad layer. */
29062a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa WallTEST_F(Hwc2Test, SET_CURSOR_POSITION_bad_layer)
29072a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall{
29082a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
29092a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
29105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
29112a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
29125a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                const hwc_rect_t cursorPosition = testLayer->getCursorPosition();
29132a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setCursorPosition(display,
29142a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        badLayer, cursorPosition.left, cursorPosition.top,
29152a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall                        outErr));
29162a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall            }
29172a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall   ));
29182a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall}
29192a0aaf9f5a3daeb0525249eda40242bb63f56468Marissa Wall
2920ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
2921ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
2922ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2923ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2924ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2925ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2926ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2927ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
2928ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
2929ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2930ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2931ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
2932ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2933ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2934ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
2935ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
2936ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2937ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2938ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
2939ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2940ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2941ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
2942ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
2943ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
2944ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
2945ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2946ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
2947ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
2948ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
2949ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
2950ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
2951ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
2952ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
2953b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
29545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set the buffer of a layer. */
29555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER)
29565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
29585a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
29595a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
29605a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29615a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can update the buffer of a layer. */
29625a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_update)
29635a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29645a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
29655a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            setBuffer, advanceBuffer));
29665a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
29675a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29685a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the buffer of a bad layer. */
29695a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_layer)
29705a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29715a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
29725a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
29735a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
29745a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29755a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
29765a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                android::base::unique_fd acquireFence;
29775a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29785a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                /* If there is not available buffer for the given buffer
29795a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                 * properties, it should not fail this test case */
29805a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                if (testLayer->getBuffer(&handle, &acquireFence) == 0) {
29815a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    *outErr = HWC2_ERROR_BAD_LAYER;
29825a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    return;
29835a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                }
29845a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29855a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, badLayer,
29865a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
29875a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
29885a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
29895a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
29905a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29915a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall/* TESTCASE: Tests that the HWC2 can set an invalid buffer for a layer. */
29925a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa WallTEST_F(Hwc2Test, SET_LAYER_BUFFER_bad_parameter)
29935a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
29945a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
29955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
29965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    hwc2_error_t* outErr) {
29975a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
29985a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                buffer_handle_t handle = nullptr;
29995a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                int32_t acquireFence = -1;
30005a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
30015a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBuffer(display, layer,
30025a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        handle, acquireFence, outErr));
30035a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall            }
30045a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    ));
30055a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
30065a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
3007ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
3008ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
3009ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3010ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3011ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
3012ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3013ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3014ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
3015ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
3016ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3017ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3018ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
3019ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3020ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3021ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
3022ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
3023ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
3024ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3025ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
3026ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
30275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
3028ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3029ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
30305a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
3031ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
3032ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3033ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
3034ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3035ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3036ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
3037ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
3038ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
3039ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3040ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
30415a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t* outErr) {
3042ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3043ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
30445a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayer->getColor(), outErr));
3045ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
3046ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
3047ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
3048ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
3049b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
3050b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
3051b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
3052b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3053b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
3054b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
3055b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
3056b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
3057b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
3058b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
3059b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3060b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
3061b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
3062b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
3063b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
3064b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
3065b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
3066b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3067b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
3068b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
30692b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
3070600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
3071600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
3072600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
3073600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3074600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
3075600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
3076600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
3077600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
3078600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
3079600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
3080600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3081600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
3082600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
3083600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
3084600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
3085600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
3086600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
3087600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3088600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
3089600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
3090600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
30912b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
30922b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
30932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
30942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
30952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
30962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
30972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
30982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
30992b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
31002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
31012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
31022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
31032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
31042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
31052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
31062b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
31072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
31082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
31092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
31105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayer* testLayer, hwc2_error_t *outErr) {
31112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
31122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
31135a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                            badLayer, testLayer->getPlaneAlpha(), outErr));
31142b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
31152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
31162b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
3117ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
3118c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
3119c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
3120c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
3121c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3122c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
3123c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
3124c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
3125c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
3126c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
3127c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
3128c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3129c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
3130c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
3131c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
3132c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
3133c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
3134c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
3135c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3136c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
3137c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
3138c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
3139ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the surface damage of a layer. */
3140ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE)
3141ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
3142ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3143ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
3144ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
3145ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
3146ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the surface damage of a layer. */
3147ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_update)
3148ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
3149ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3150ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage, advanceSurfaceDamage));
3151ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
3152ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
3153ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the surface damage of a bad layer. */
3154ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallTEST_F(Hwc2Test, SET_LAYER_SURFACE_DAMAGE_bad_layer)
3155ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
3156ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3157ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            setSurfaceDamage));
3158ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
3159ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
3160ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
3161ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
3162ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
3163ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
3164ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
3165ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
3166ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
3167ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
3168ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
3169ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
3170ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
3171ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
3172ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
3173ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
3174ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
3175ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
3176ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
3177ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3178ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
3179ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
3180273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3181f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 can set the visible region of a layer. */
3182f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION)
3183f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
3184f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Basic, 5,
3185f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
3186f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                    Hwc2TestLayers* testLayers) {
3187f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3188f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerVisibleRegion(display,
3189f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                        layer, testLayers->getVisibleRegion(layer)));
3190f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
3191f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3192f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            advanceVisibleRegions));
3193f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
3194f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3195f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the visible region of a bad layer. */
3196f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallTEST_F(Hwc2Test, SET_LAYER_VISIBLE_REGION_bad_layer)
3197f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
3198f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3199f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            setVisibleRegion));
3200f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
3201f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3202273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
3203273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
3204273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3205273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
3206273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
32075a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                    Hwc2TestLayers* testLayers) {
3208273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3209273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
32105a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall                        testLayers->getZOrder(layer)));
3211f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            },
3212f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
3213f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            /* TestLayer z orders are set during the construction of TestLayers
3214f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * and cannot be updated. There is no need (or ability) to cycle
3215f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall             * through additional z order configurations. */
3216f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            [] (Hwc2TestLayers* /*testLayers*/) {
3217f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                return false;
3218273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
3219273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
3220273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
3221273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3222273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
3223273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
3224273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3225273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
3226273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
3227273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
3228273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
3229273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3230273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
3231273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
3232273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3233273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3234273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3235273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
3236273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
3237273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3238273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3239273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3240273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
3241273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3242273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
3243273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
3244273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
3245273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3246273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
3247273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
3248273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
3249273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
3250273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
3251273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
3252273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
3253273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
3254273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
3255273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
3256273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
32571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32581cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display a layer with basic property
32591cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * coverage */
32601cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_basic)
32611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
32621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
32631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3264706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3265563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
32661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
32681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
32691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
32711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
32721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
32731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
32741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
32751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
32761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
32771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
32781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 can display 5 layers with default coverage. */
32801cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_default_5)
32811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
32821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 5,
32831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3284706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3285563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
32861cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32871cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                uint32_t numTypes, numRequests;
32881cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                bool hasChanges = false;
32891cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32901cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
32911cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                        &numRequests, &hasChanges));
32921cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                if (hasChanges)
32931cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                    EXPECT_LE(numTypes, static_cast<uint32_t>(layers.size()))
32941cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall                            << "wrong number of requests";
32951cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            }
32961cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ));
32971cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
32981cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
32991cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot validate a bad display */
33001cd789cd2b300427467586f4ec721a8123f118b7Marissa WallTEST_F(Hwc2Test, VALIDATE_DISPLAY_bad_display)
33011cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall{
33021cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_display_t display;
33031cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    uint32_t numTypes, numRequests;
33041cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
33051cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33061cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
33071cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
33081cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes, &numRequests,
33091cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            &err));
33101cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
33111cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}
3312706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3313706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get display requests after validating a
3314706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3315706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_basic)
3316706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3317706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3318706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3319706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3320563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
3321706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3322706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3323706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3324706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3325706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3326706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3327706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3328706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3329706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3330706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3331706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleRequests(display, layers,
3332706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        numRequests));
3333706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3334706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3335706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3336706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3337706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from a bad display */
3338706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_bad_display)
3339706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3340706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3341706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_request_t displayRequests;
3342706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3343706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_request_t> layerRequests;
3344706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3345706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3346706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3347706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3348706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getDisplayRequests(display, &displayRequests,
3349706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &layers, &layerRequests, &err));
3350706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3351706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3352706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3353706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get display requests from an non
3354706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3355706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_REQUESTS_not_validated)
3356706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3357706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3358706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3359706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3360706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3361706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_display_request_t displayRequests;
3362706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_layer_request_t> layerRequests;
3363706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3364706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3365706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getDisplayRequests(display,
3366706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &displayRequests, layers, &layerRequests, &err));
3367706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3368706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3369706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3370706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3371706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3372706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3373706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can get changed composition types after
3374706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validating a basic layer. */
3375706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_basic)
3376706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3377706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3378706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3379706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3380563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* testLayers) {
3381706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3382706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3383706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3384706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3385706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3386706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3387706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3388706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3389706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3390706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3391706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3392563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        *testLayers, layers, numTypes));
3393706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3394706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3395706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3396706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3397706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from a bad
3398706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3399706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_bad_display)
3400706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3401706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3402706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_layer_t> layers;
3403706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    std::vector<hwc2_composition_t> types;
3404706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3405706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3406706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3407706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3408706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(getChangedCompositionTypes(display, &layers,
3409706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            &types, &err));
3410706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3411706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3412706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3413706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get changed composition types from an non
3414706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3415706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, GET_CHANGED_COMPOSITION_TYPES_not_validated)
3416706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3417706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3418706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3419706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* layers) {
3420706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3421706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                std::vector<hwc2_composition_t> types;
3422706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3423706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3424706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getChangedCompositionTypes(
3425706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        display, layers, &types, &err));
3426706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3427706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3428706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3429706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3430706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3431706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3432706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 can accept display changes after validating a
3433706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * basic layer. */
3434706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_basic)
3435706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3436706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Basic, 1,
3437706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3438706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    const std::vector<hwc2_layer_t>& layers,
3439563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* testLayers) {
3440706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3441706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                uint32_t numTypes, numRequests;
3442706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                bool hasChanges = false;
3443706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3444706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->validateDisplay(display, &numTypes,
3445706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        &numRequests, &hasChanges));
3446706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                if (hasChanges)
3447706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3448706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                            << "wrong number of requests";
3449706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3450706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->handleCompositionChanges(display,
3451563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        *testLayers, layers, numTypes));
3452706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3453706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display));
3454706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3455706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3456706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3457706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3458706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from a bad
3459706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * display */
3460706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_bad_display)
3461706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3462706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_display_t display;
3463706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3464706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3465706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3466706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3467706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_NO_FATAL_FAILURE(acceptDisplayChanges(display, &err));
3468706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3469706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3470706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3471706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall/* TESTCASE: Tests that the HWC2 cannot accept display changes from an non
3472706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall * validated display. */
3473706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa WallTEST_F(Hwc2Test, ACCEPT_DISPLAY_CHANGES_not_validated)
3474706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall{
3475706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayNonValidatedLayers(5,
3476706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3477706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                    std::vector<hwc2_layer_t>* /*layers*/) {
3478706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3479706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3480706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall
3481706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->acceptDisplayChanges(display, &err));
3482706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
3483706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall                        << "returned wrong error code";
3484706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall            }
3485706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall    ));
3486706178db2a89e2bf44e95bfad74dc4451a277b3dMarissa Wall}
3487f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3488f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 supports client target with required values */
3489f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT)
3490f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3491f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3492f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3493f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3494f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3495f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3496f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3497f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3498f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3499f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3500f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace()));
3501f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3502f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3503f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3504f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3505f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3506f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get client target support for a bad
3507f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * display. */
3508f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_bad_display)
3509f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3510f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Default,
3511f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t /*display*/,
3512f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3513f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3514f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3515f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3516f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_display_t badDisplay;
3517f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3518f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3519f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
3520f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3521f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(badDisplay,
3522f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3523f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3524f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3525f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3526f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3527f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3528f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3529f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3530f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
3531f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * for a variety of client target values. */
3532f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, GET_CLIENT_TARGET_SUPPORT_unsupported)
3533f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3534f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(setClientTargetSupport(Hwc2TestCoverage::Complete,
3535f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
3536f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    const Hwc2TestClientTargetSupport& testClientTargetSupport) {
3537f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3538f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const Area bufferArea = testClientTargetSupport.getBufferArea();
3539f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                const android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888;
3540f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
3541f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3542f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->getClientTargetSupport(display,
3543f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        bufferArea.width, bufferArea.height, format,
3544f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testClientTargetSupport.getDataspace(), &err));
3545f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_TRUE(err == HWC2_ERROR_NONE
3546f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        || err == HWC2_ERROR_UNSUPPORTED)
3547f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        << "returned wrong error code";
3548f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            },
3549f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3550f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            advanceClientTargetSupport));
3551f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3552f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3553f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 can set a client target buffer for a basic
3554f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * layer. */
3555f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_basic)
3556f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3557f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3558f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3559f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const size_t layerCnt = 1;
3560f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3561f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto display : mDisplays) {
3562f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        std::vector<hwc2_config_t> configs;
3563f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3564f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
3565f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3566f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
3567f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3568f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto config : configs) {
3569f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Area displayArea;
3570f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            std::vector<hwc2_layer_t> layers;
3571f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3572f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
3573f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, &displayArea));
3574f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3575f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
3576f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Basic,
3577f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    displayArea);
3578f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3579f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (!testLayers.optimizeLayouts())
3580f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                continue;
3581f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3582f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            Hwc2TestClientTarget testClientTarget;
3583f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3584f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            do {
3585f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clientLayers;
3586f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                std::set<hwc2_layer_t> clearLayers;
3587f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                uint32_t numTypes, numRequests;
3588f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool hasChanges, skip;
3589f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                bool flipClientTarget;
3590f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                buffer_handle_t handle;
3591f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                int32_t acquireFence;
3592f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3593f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(setLayerProperties(display, layers,
3594f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &testLayers, &skip));
3595f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (skip)
3596f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    continue;
3597f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3598f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(validateDisplay(display, &numTypes,
3599f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &numRequests, &hasChanges));
3600f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (hasChanges)
3601f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    EXPECT_LE(numTypes, layers.size())
3602f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                            << "wrong number of requests";
3603f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3604f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleCompositionChanges(display,
3605f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        testLayers, layers, numTypes, &clientLayers));
3606f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_NO_FATAL_FAILURE(handleRequests(display, layers,
3607f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        numRequests, &clearLayers, &flipClientTarget));
3608f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3609f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        clearLayers, flipClientTarget, displayArea, &handle,
3610f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        &acquireFence), 0);
3611f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle,
3612f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                        acquireFence, dataspace, damage));
3613f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3614f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                if (acquireFence >= 0)
3615f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                    close(acquireFence);
3616f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3617f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            } while (testLayers.advance());
3618f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3619f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
3620f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
3621f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3622f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
3623f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
3624f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3625f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3626f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a client target for a bad display. */
3627f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallTEST_F(Hwc2Test, SET_CLIENT_TARGET_bad_display)
3628f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
3629f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_display_t display;
3630f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::vector<hwc2_layer_t> layers;
3631f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const Area displayArea = {0, 0};
3632f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestLayers testLayers(layers, Hwc2TestCoverage::Default, displayArea);
3633f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> clientLayers;
3634f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::set<hwc2_layer_t> flipClientTargetLayers;
3635f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    bool flipClientTarget = true;
3636f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN;
3637f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    const hwc_region_t damage = { };
3638f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    buffer_handle_t handle;
3639f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    int32_t acquireFence;
3640f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
3641f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3642f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
3643f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3644f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    Hwc2TestClientTarget testClientTarget;
3645f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3646f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    ASSERT_EQ(testClientTarget.getBuffer(testLayers, clientLayers,
3647f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            flipClientTargetLayers, flipClientTarget, displayArea, &handle,
3648f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            &acquireFence), 0);
3649f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3650f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_NO_FATAL_FAILURE(setClientTarget(display, handle, acquireFence,
3651f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            dataspace, damage, &err));
3652f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3653f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (acquireFence >= 0)
3654f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        close(acquireFence);
3655f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
3656f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
3657f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
3658563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3659563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 default layer. */
3660563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_1)
3661563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3662563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3663563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3664563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3665563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3666563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3667563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3668563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3669563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3670563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3671563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 default layers. */
3672563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_2)
3673563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3674563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3675563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3676563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3677563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3678563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3679563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3680563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3681563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3682563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3683563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 3 default layers. */
3684563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_3)
3685563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3686563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 3;
3687563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3688563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3689563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3690563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3691563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3692563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3693563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3694563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3695563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 4 default layers. */
3696563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_4)
3697563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3698563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 4;
3699563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3700563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3701563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3702563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3703563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3704563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3705563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3706563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3707563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 5 default layers. */
3708563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_5)
3709563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3710563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 5;
3711563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3712563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3713563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3714563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3715563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3716563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3717563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3718563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3719563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 6 default layers. */
3720563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_default_6)
3721563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3722563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 6;
3723563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3724563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
3725563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3726563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3727563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3728563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3729563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3730563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3731563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3732563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * blend mode. */
3733563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_1)
3734563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3735563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3736563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3737563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3738563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3739563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Basic},
3740563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3741563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3742563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3743563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3744563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3745563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3746563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3747563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3748563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * blend mode. */
3749563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_blend_mode_2)
3750563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3751563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3752563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3753563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3754563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Complete},
3755563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic}};
3756563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3757563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3758563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3759563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3760563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3761563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3762563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3763563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * buffer. */
3764563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_buffer_1)
3765563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3766563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3767563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3768563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3769563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BufferArea, Hwc2TestCoverage::Complete}};
3770563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3771563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3772563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3773563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3774563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3775563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3776563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3777563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * color. */
3778563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_color_1)
3779563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3780563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3781563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3782563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3783563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3784563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Complete}};
3785563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3786563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3787563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3788563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3789563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3790563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3791563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3792563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * color. */
3793563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_color_2)
3794563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3795563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3796563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3797563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3798563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3799563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3800563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Basic},
3801563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::Color, Hwc2TestCoverage::Basic}};
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 1 layer with complete coverage of
3809563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * composition. */
3810563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_composition_1)
3811563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3812563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3813563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3814563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3815563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete}};
3816563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3817563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3818563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3819563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3820563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3821563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3822563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3823563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * cursor. */
3824563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_1)
3825563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3826563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3827563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3828563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3829563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3830563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete}};
3831563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3832563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3833563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3834563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3835563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3836563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3837563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3838563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * cursor. */
3839563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_cursor_2)
3840563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3841563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3842563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3843563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3844563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Composition, Hwc2TestCoverage::Complete},
3845563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::CursorPosition, Hwc2TestCoverage::Complete},
3846563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
3847563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3848563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3849563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3850563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3851563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3852563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3853563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3854563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * dataspace. */
3855563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_dataspace_1)
3856563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3857563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3858563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3859563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3860563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Dataspace, Hwc2TestCoverage::Complete}};
3861563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3862563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3863563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3864563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3865563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3866563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3867563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3868563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3869563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_1)
3870563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3871563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3872563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3873563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3874563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3875563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3876563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3877563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3878563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3879563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3880563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3881563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3882563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3883563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_2)
3884563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3885563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3886563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3887563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3888563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3889563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3890563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3891563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3892563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3893563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3894563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3895563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 3 layers with complete coverage of
3896563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3897563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_3)
3898563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3899563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 3;
3900563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3901563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3902563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3903563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3904563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3905563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3906563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3907563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3908563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3909563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 4 layers with complete coverage of
3910563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * display frame. */
3911563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_display_frame_4)
3912563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3913563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 4;
3914563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3915563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3916563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete}};
3917563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3918563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3919563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3920563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3921563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3922563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3923563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3924563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * plane alpha. */
3925563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_1)
3926563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3927563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3928563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3929563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3930563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3931563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3932563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3933563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3934563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3935563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3936563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3937563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3938563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3939563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * plane alpha. */
3940563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_plane_alpha_2)
3941563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3942563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3943563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3944563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3945563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::BlendMode, Hwc2TestCoverage::Basic},
3946563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::PlaneAlpha, Hwc2TestCoverage::Complete}};
3947563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = false;
3948563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3949563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3950563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3951563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3952563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3953563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3954563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * source crop. */
3955563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_1)
3956563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3957563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3958563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3959563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3960563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3961563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3962563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3963563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3964563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3965563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3966563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3967563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3968563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
3969563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * source crop. */
3970563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_source_crop_2)
3971563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3972563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
3973563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3974563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3975563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Complete},
3976563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::SourceCrop, Hwc2TestCoverage::Complete}};
3977563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3978563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3979563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3980563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3981563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3982563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3983563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3984563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3985563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * surface damage. */
3986563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_surface_damage_1)
3987563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
3988563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
3989563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
3990563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
3991563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::SurfaceDamage, Hwc2TestCoverage::Complete}};
3992563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
3993563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3994563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
3995563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
3996563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
3997563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
3998563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
3999563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * transform. */
4000563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_transform_1)
4001563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4002563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
4003563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4004563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4005563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete}};
4006563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4007563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4008563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4009563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4010563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4011563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4012563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 2 layers with complete coverage of
4013563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * transform. */
4014563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_transform_2)
4015563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4016563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 2;
4017563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Default;
4018563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions =
4019563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {{Hwc2TestPropertyName::Transform, Hwc2TestCoverage::Complete},
4020563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            {Hwc2TestPropertyName::DisplayFrame, Hwc2TestCoverage::Basic}};
4021563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4022563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4023563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4024563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4025563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4026563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4027563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 can present 1 layer with complete coverage of
4028563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall * basic. */
4029563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_basic_1)
4030563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4031563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    const size_t layerCnt = 1;
4032563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    Hwc2TestCoverage coverage = Hwc2TestCoverage::Basic;
4033563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage> exceptions;
4034563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    bool optimize = true;
4035563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4036563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplays(layerCnt, coverage, exceptions,
4037563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            optimize));
4038563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4039563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4040563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot present a bad display.  */
4041563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_bad_display)
4042563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4043563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_display_t display;
4044563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    int32_t presentFence;
4045563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4046563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4047563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4048563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4049563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(presentDisplay(display, &presentFence, &err));
4050563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4051563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4052563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4053563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot present an unvalidated display. */
4054563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, PRESENT_DISPLAY_not_validated)
4055563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4056563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(displayLayers(Hwc2TestCoverage::Default, 1,
4057563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
4058563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    const std::vector<hwc2_layer_t>& /*layers*/,
4059563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                    Hwc2TestLayers* /*testLayers*/) {
4060563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4061563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                int32_t presentFence;
4062563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
4063563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4064563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4065563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        HWC2_POWER_MODE_ON));
4066563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->enableVsync(display));
4067563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4068563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->waitForVsync());
4069563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4070563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->presentDisplay(display,
4071563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        &presentFence, &err));
4072563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_NOT_VALIDATED)
4073563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        << "returned wrong error code";
4074563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4075563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->disableVsync(display));
4076563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setPowerMode(display,
4077563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall                        HWC2_POWER_MODE_OFF));
4078563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall            }
4079563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ));
4080563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
4081563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4082563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get release fences from a bad display. */
4083563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa WallTEST_F(Hwc2Test, GET_RELEASE_FENCES_bad_display)
4084563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall{
4085563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_display_t display;
4086563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::vector<hwc2_layer_t> layers;
4087563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    std::vector<int32_t> fences;
4088563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4089563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4090563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4091563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall
4092563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    ASSERT_NO_FATAL_FAILURE(getReleaseFences(display, &layers, &fences, &err));
4093563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4094563030b4402f4b9aa08cece732f2a4a756a0f72cMarissa Wall}
409535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
409635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wallstatic const std::array<android_color_mode, 9> androidColorModes = {{
409735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_NATIVE,
409835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_625,
409935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_625_UNADJUSTED,
410035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_525,
410135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT601_525_UNADJUSTED,
410235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_STANDARD_BT709,
410335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_DCI_P3,
410435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_SRGB,
410535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    HAL_COLOR_MODE_ADOBE_RGB,
410635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}};
410735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
410835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can get the color modes for a display. The
410935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * display must support HAL_COLOR_MODE_NATIVE */
411035040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_COLOR_MODES)
411135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
411235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
411335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
411435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
411535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                std::vector<android_color_mode_t> colorModes;
411635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
411735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->getColorModes(display,
411835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &colorModes));
411935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
412035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NE(std::count(colorModes.begin(), colorModes.end(),
412135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        HAL_COLOR_MODE_NATIVE), 0) << "all displays"
412235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        " must support HAL_COLOR_MODE_NATIVE";
412335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
412435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
412535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
412635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
412735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot get color modes from a bad display. */
412835040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_COLOR_MODES_bad_display)
412935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
413035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
413135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    std::vector<android_color_mode_t> colorModes;
413235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
413335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
413435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
413535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
413635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getColorModes(display, &colorModes, &err));
413735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
413835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
413935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
414035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can set the required color mode on a display. */
414135040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES)
414235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
414335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
414435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
414535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
414635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
414735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
414835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode));
414935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
415035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
415135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
415235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
415335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a color mode on a bad display. */
415435040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES_bad_display)
415535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
415635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
415735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    const android_color_mode_t colorMode = HAL_COLOR_MODE_NATIVE;
415835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
415935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
416035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
416135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
416235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setColorMode(display, colorMode, &err));
416335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
416435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
416535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
416635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid color mode. */
416735040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES_bad_parameter)
416835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
416935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
417035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
417135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
417235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_mode_t colorMode =
417335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        static_cast<android_color_mode_t>(-1);
417435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
417535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
417635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setColorMode(display, colorMode,
417735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &err));
417835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
417935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        << "returned wrong error code";
418035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
418135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
418235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
418335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
418435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 either supports or returns error unsupported
418535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * for all valid color modes. */
418635040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_MODES_unsupported)
418735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
418835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
418935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
419035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
419135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                for (auto colorMode : androidColorModes) {
419235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    hwc2_error_t err = HWC2_ERROR_NONE;
419335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
419435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    ASSERT_NO_FATAL_FAILURE(test->setColorMode(display,
419535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            colorMode, &err));
419635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
419735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    EXPECT_TRUE(err == HWC2_ERROR_NONE
419835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            || err == HWC2_ERROR_UNSUPPORTED)
419935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            << "returned wrong error code";
420035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                }
420135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
420235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
420335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
420435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
420535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 gets the HDR capabilities for a display and
420635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * test if they are valid. */
420735040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_HDR_CAPABILITIES)
420835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
420935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
421035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
421135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
421235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                std::vector<android_hdr_t> hdrCapabilities;
421335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                float maxLuminance, maxAverageLuminance, minLuminance;
421435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
421535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->getHdrCapabilities(display,
421635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &hdrCapabilities, &maxLuminance, &maxAverageLuminance,
421735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        &minLuminance));
421835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
421935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                if (hdrCapabilities.empty())
422035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    return;
422135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
422235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_GE(maxLuminance, maxAverageLuminance);
422335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_GE(maxAverageLuminance, minLuminance);
422435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
422535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
422635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
422735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
422835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot get hdr capabilities from a bad display */
422935040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, GET_HDR_CAPABILITIES_bad_display)
423035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
423135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
423235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    std::vector<android_hdr_t> hdrCapabilities;
423335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    float maxLuminance, maxAverageLuminance, minLuminance;
423435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
423535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
423635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
423735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
423835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getHdrCapabilities(display, &hdrCapabilities,
423935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            &maxLuminance, &maxAverageLuminance, &minLuminance, &err));
424035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
424135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
424235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
424335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wallstatic const std::array<float, 16> identityMatrix = {{
424435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    1.0,  0.0,  0.0,  0.0,
424535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    0.0,  1.0,  0.0,  0.0,
424635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    0.0,  0.0,  1.0,  0.0,
424735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    0.0,  0.0,  0.0,  1.0,
424835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}};
424935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
425035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* Values for the color transform matrices were precomputed using the source code
425135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * in surfaceflinger/Effects/Daltonizer.cpp. */
425235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
425335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wallstatic const std::array<const std::array<float, 16>, 5> exampleMatrices = {{
425435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    identityMatrix,
425535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Converts RGB color to the XYZ space */
425635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 0.4124, 0.2126, 0.0193, 0,
425735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.3576, 0.7152, 0.1192, 0,
425835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.1805, 0.0722, 0.9505, 0,
425935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0     , 0     , 0     , 1 }},
426035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Protanomaly */
426135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 0.068493,  0.931506,  0,  0,
426235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.068493,  0.931507,  0,  0,
426335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.013626, -0.013626,  1,  0,
426435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,         0,         0,  1 }},
426535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Deuteranomaly */
426635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 0.288299, 0.711701,  0,  0,
426735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0.052709, 0.947291,  0,  0,
426835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall      -0.257912, 0.257912,  1,  0,
426935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,        0,         0,  1 }},
427035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    /* Tritanomaly */
427135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    {{ 1, -0.805712, 0.805712,  0,
427235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,  0.378838, 0.621162,  0,
427335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,  0.104823, 0.895177,  0,
427435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall       0,  0,        0,         1 }},
427535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}};
427635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
427735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can set the identity color transform */
427835040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM)
427935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
428035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
428135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
428235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
428335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
428435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        identityMatrix, HAL_COLOR_TRANSFORM_IDENTITY));
428535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
428635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
428735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
428835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
428935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color transform for a bad
429035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall * display. */
429135040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_display)
429235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
429335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_display_t display;
429435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
429535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
429635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
429735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
429835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setColorTransform(display, identityMatrix,
429935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            HAL_COLOR_TRANSFORM_IDENTITY, &err));
430035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
430135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
430235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
430335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid color transform. */
430435040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM_bad_parameter)
430535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
430635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
430735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
430835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
430935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_transform_t hint =
431035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        static_cast<android_color_transform_t>(-1);
431135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
431235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
431335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setColorTransform(display,
431435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        identityMatrix, hint, &err));
431535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
431635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        << "returned wrong error code";
431735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
431835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
431935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
432035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
432135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall/* TESTCASE: Tests that the HWC2 can set an arbitrary color matrix. */
432235040c559d26d00d6123c894cfc9573b0a5aa860Marissa WallTEST_F(Hwc2Test, SET_COLOR_TRANSFORM_arbitrary_matrix)
432335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall{
432435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveDisplayConfig(
432535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display) {
432635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
432735040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                const android_color_transform_t hint =
432835040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                        HAL_COLOR_TRANSFORM_ARBITRARY_MATRIX;
432935040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall
433035040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                for (const std::array<float, 16>& matrix : exampleMatrices) {
433135040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setColorTransform(display,
433235040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                            matrix, hint));
433335040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall                }
433435040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall            }
433535040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall    ));
433635040c559d26d00d6123c894cfc9573b0a5aa860Marissa Wall}
4337bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4338bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 create an destory virtual displays. */
4339bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY)
4340bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4341bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4342bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* /*test*/, hwc2_display_t /*display*/,
4343bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) { }));
4344bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4345bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4346bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy multiple virtual
4347bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * displays. */
4348bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_VIRTUAL_DISPLAY_multiple)
4349bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4350bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4351bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::vector<hwc2_display_t> displays;
4352bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4353bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    do {
4354bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        const UnsignedArea& dimension =
4355bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                testVirtualDisplay.getDisplayDimension();
4356bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4357bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_display_t display;
4358bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
4359bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4360bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(dimension.width,
4361bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                dimension.height, &desiredFormat, &display, &err));
4362bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4363bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_NO_RESOURCES
4364bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                || err == HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4365bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_GE(desiredFormat, 0) << "invalid format";
4366bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4367bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (err == HWC2_ERROR_NONE)
4368bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            displays.push_back(display);
4369bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4370bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    } while (testVirtualDisplay.advance());
4371bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4372bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    for (hwc2_display_t display : displays) {
4373bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4374bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4375bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4376bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4377bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a bad virtual displays.  */
4378bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_display)
4379bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4380bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_display_t display;
4381bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4382bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4383bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
4384bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4385bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4386bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
4387bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4388bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4389bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a physical display. */
4390bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, DESTROY_VIRTUAL_DISPLAY_bad_parameter)
4391bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4392bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_display_t display = HWC_DISPLAY_PRIMARY;
4393bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
4394bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4395bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(destroyVirtualDisplay(display, &err));
4396bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
4397bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4398bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4399bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can get the max virtual display count. */
4400bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT)
4401bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4402bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    uint32_t maxCnt;
4403bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4404bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4405bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4406bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4407bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 returns the same max virtual display count for
4408bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * each call. */
4409bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_duplicate)
4410bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4411bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    uint32_t maxCnt1, maxCnt2;
4412bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4413bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt1));
4414bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt2));
4415bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4416bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    EXPECT_EQ(maxCnt1, maxCnt2) << "returned two different max virtual display"
4417bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            " counts";
4418bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4419bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4420bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can create the max number of virtual displays
4421bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * that it reports. */
4422bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, GET_MAX_VIRTUAL_DISPLAY_COUNT_create_max)
4423bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4424bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::vector<hwc2_display_t> displays;
4425bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    uint32_t maxCnt;
4426bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4427bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(getMaxVirtualDisplayCount(&maxCnt));
4428bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4429bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    while (displays.size() < maxCnt) {
4430bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        uint32_t width = 1920, height = 1080;
4431bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        android_pixel_format_t desiredFormat = HAL_PIXEL_FORMAT_RGBA_8888;
4432bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_display_t display;
4433bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
4434bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4435bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(width, height,
4436bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    &desiredFormat, &display, &err));
4437bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4438bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
4439bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                << "returned wrong error code";
4440bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        if (err != HWC2_ERROR_NONE)
4441bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            break;
4442bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4443bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        displays.push_back(display);
4444bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4445bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4446bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    for (hwc2_display_t display : displays) {
4447bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        EXPECT_NO_FATAL_FAILURE(destroyVirtualDisplay(display));
4448bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4449bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4450bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4451bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 can set an output buffer for a virtual
4452bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * display. */
4453bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER)
4454bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4455bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Complete,
4456bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
4457bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* testVirtualDisplay) {
4458bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4459bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                buffer_handle_t handle;
4460bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                android::base::unique_fd acquireFence;
4461bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4462bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                if (testVirtualDisplay->getBuffer(&handle, &acquireFence) >= 0)
4463bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setOutputBuffer(display,
4464bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                            handle, acquireFence));
4465bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            }));
4466bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4467bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4468bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an output buffer for a bad display */
4469bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_display)
4470bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4471bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4472bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* test, hwc2_display_t /*display*/,
4473bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* testVirtualDisplay) {
4474bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4475bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                hwc2_display_t badDisplay;
4476bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                buffer_handle_t handle;
4477bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                android::base::unique_fd acquireFence;
4478bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
4479bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4480bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->getBadDisplay(&badDisplay));
4481bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4482bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                if (testVirtualDisplay->getBuffer(&handle, &acquireFence) < 0)
4483bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    return;
4484bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4485bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(badDisplay,
4486bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        handle, acquireFence, &err));
4487bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                EXPECT_TRUE(err == HWC2_ERROR_BAD_DISPLAY)
4488bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        << "returned wrong error code";
4489bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            }));
4490bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4491bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4492bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid output buffer. */
4493bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER_bad_parameter)
4494bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4495bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    ASSERT_NO_FATAL_FAILURE(createVirtualDisplay(Hwc2TestCoverage::Default,
4496bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display,
4497bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    Hwc2TestVirtualDisplay* /*testVirtualDisplay*/) {
4498bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4499bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                const buffer_handle_t handle = nullptr;
4500bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                uint32_t releaseFence = -1;
4501bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
4502bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4503bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setOutputBuffer(display, handle,
4504bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        releaseFence, &err));
4505bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER)
4506bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                        << "returned wrong error code";
4507bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            }));
4508bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4509bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4510bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an output buffer for non virtual
4511bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * display */
4512bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallTEST_F(Hwc2Test, SET_OUTPUT_BUFFER_unsupported)
4513bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
4514bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    for (auto display : mDisplays) {
4515bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestVirtualDisplay testVirtualDisplay(Hwc2TestCoverage::Complete);
4516bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4517bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        do {
4518bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            buffer_handle_t handle;
4519bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            android::base::unique_fd acquireFence;
4520bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
4521bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4522bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            if (testVirtualDisplay.getBuffer(&handle, &acquireFence) < 0)
4523bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                continue;
4524bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4525bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            ASSERT_NO_FATAL_FAILURE(setOutputBuffer(display, handle,
4526bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                    acquireFence, &err));
4527bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
4528bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
4529bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        } while (testVirtualDisplay.advance());
4530bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    }
4531bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
4532