Hwc2Test.cpp revision ee24278db26505369c0e917d2a83e7e9fda36e4c
14d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/*
24d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Copyright (C) 2016 The Android Open Source Project
34d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
44d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
54d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * you may not use this file except in compliance with the License.
64d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * You may obtain a copy of the License at
74d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
84d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
94d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall *
104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Unless required by applicable law or agreed to in writing, software
114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * See the License for the specific language governing permissions and
144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * limitations under the License.
154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall */
164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <array>
18cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall#include <unordered_set>
194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h>
204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h>
214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h>
224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION
244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11
254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h>
264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11
284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h"
30273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h"
316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
32cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connected);
34572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
35572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp);
36cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test {
384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic:
394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void SetUp()
414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hw_module_t const* hwc2Module;
434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module);
454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to get hwc hardware module: "
464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        /* The following method will fail if you have not run
494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall         * "adb shell stop" */
504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        err = hwc2_open(hwc2Module, &mHwc2Device);
514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        ASSERT_GE(err, 0) << "failed to open hwc hardware module: "
524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << strerror(-err);
53cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
54cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        populateDisplays();
554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    virtual void TearDown()
584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (auto itr = mLayers.begin(); itr != mLayers.end();) {
611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_display_t display = itr->first;
621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_layer_t layer = itr->second;
631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            itr++;
641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            /* Destroys and removes the layer from mLayers */
651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            destroyLayer(display, layer);
661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
6803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) {
6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_display_t display = *itr;
7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            itr++;
7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            /* Sets power mode to off and removes the display from
7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall             * mActiveDisplays */
7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            setPowerMode(display, HWC2_POWER_MODE_OFF);
7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        if (mHwc2Device)
774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            hwc2_close(mHwc2Device);
784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    void registerCallback(hwc2_callback_descriptor_t descriptor,
81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer,
82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            hwc2_error_t* outErr = nullptr)
83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    {
84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>(
85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                getFunction(HWC2_FUNCTION_REGISTER_CALLBACK));
86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor,
89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                callbackData, pointer));
90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        if (outErr) {
91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            *outErr = err;
92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        } else {
93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback";
94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        }
95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType,
98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            hwc2_error_t* outErr = nullptr)
99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>(
101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE));
102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                    reinterpret_cast<int32_t*>(outType)));
106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (outErr) {
107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            *outErr = err;
108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        } else {
109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type";
110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* If the populateDisplays function is still receiving displays and the
114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * display is connected, the display handle is stored in mDisplays. */
115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void hotplugCallback(hwc2_display_t display, int32_t connected)
116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::lock_guard<std::mutex> lock(mHotplugMutex);
118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving)
120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            return;
121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        if (connected == HWC2_CONNECTION_CONNECTED)
123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mDisplays.insert(display);
124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugCv.notify_all();
126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer,
1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>(
1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_CREATE_LAYER));
1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                outLayer));
1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.insert(std::make_pair(display, *outLayer));
1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayer(hwc2_display_t display, hwc2_layer_t layer,
1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            hwc2_error_t* outErr = nullptr)
1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>(
1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                getFunction(HWC2_FUNCTION_DESTROY_LAYER));
1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer));
1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (err == HWC2_ERROR_NONE)
1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            mLayers.erase(std::make_pair(display, layer));
1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        if (outErr) {
1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            *outErr = err;
1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        } else {
1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer "
1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                    << layer;
1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue,
170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(
173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE));
174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config,
177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                attribute, outValue));
178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute "
183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    << getAttributeName(attribute) << " for config " << config;
184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getDisplayConfigs(hwc2_display_t display,
188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            std::vector<hwc2_config_t>* outConfigs,
189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t* outErr = nullptr)
190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>(
192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS));
193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        uint32_t numConfigs = 0;
196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &numConfigs, nullptr));
199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (err == HWC2_ERROR_NONE) {
201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            outConfigs->resize(numConfigs);
202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    &numConfigs, outConfigs->data()));
205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        if (outErr) {
208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            *outErr = err;
209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        } else {
210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for"
211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " display " << display;
212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig,
21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>(
21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG));
22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                outConfig));
22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on"
22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " display " << display;
22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    void setActiveConfig(hwc2_display_t display, hwc2_config_t config,
23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_error_t* outErr = nullptr)
23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    {
23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>(
23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG));
23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config));
24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (outErr) {
24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            *outErr = err;
24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config "
24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    << config;
24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
24803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void getDozeSupport(hwc2_display_t display, int32_t* outSupport,
24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>(
25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT));
25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                outSupport));
25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on"
26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    " display " << display;
26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode,
26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            hwc2_error_t* outErr = nullptr)
26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    {
26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>(
26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                getFunction(HWC2_FUNCTION_SET_POWER_MODE));
27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                mode));
27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (outErr) {
27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            *outErr = err;
27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            if (err != HWC2_ERROR_NONE)
27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                return;
27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode "
28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                    << getPowerModeName(mode) << " on display " << display;
28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (mode == HWC2_POWER_MODE_OFF) {
28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.erase(display);
28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        } else {
28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            mActiveDisplays.insert(display);
28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        }
28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled,
291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            hwc2_error_t* outErr = nullptr)
292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>(
294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED));
295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                enabled));
299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outErr) {
300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outErr = err;
301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        } else {
302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled "
303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                    << getVsyncName(enabled);
304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        }
305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void vsyncCallback(hwc2_display_t display, int64_t timestamp)
308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::lock_guard<std::mutex> lock(mVsyncMutex);
310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncDisplay = display;
311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncTimestamp = timestamp;
312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        mVsyncCv.notify_all();
313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
315dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    void getDisplayName(hwc2_display_t display, std::string* outName,
316dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                hwc2_error_t* outErr = nullptr)
317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    {
318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>(
319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME));
320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        uint32_t size = 0;
323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                nullptr));
326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (err == HWC2_ERROR_NONE) {
328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            std::vector<char> name(size);
329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size,
331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    name.data()));
332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            outName->assign(name.data());
334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        if (outErr) {
337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            *outErr = err;
338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        } else {
339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for "
340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall                    << display;
341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        }
342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
3446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer,
3456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_composition_t composition, hwc2_error_t* outErr = nullptr)
3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(
3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE));
3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                composition));
3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        if (outErr) {
3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            *outErr = err;
3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        } else {
3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition"
3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    " type " << getCompositionName(composition);
3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
361ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer,
362ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr)
363ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    {
364ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>(
365ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE));
366ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
367ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
368ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
369ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                mode));
370ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        if (outErr) {
371ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            *outErr = err;
372ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        } else {
373ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode "
374ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    << getBlendModeName(mode);
375ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        }
376ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    }
377ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
378ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    void setLayerColor(hwc2_display_t display, hwc2_layer_t layer,
379ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            hwc_color_t color, hwc2_error_t* outErr = nullptr)
380ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {
381ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COLOR>(
382ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_COLOR));
383ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
384ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
385ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
386ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                color));
387ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (outErr) {
388ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            *outErr = err;
389ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        } else {
390ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer color";
391ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
392ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
393ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
394b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer,
395b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr)
396b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    {
397b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>(
398b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE));
399b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
400b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
401b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display,
402b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall                layer, dataspace));
403b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        if (outErr) {
404b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            *outErr = err;
405b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        } else {
406b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace";
407b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        }
408b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    }
409b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
410600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer,
411600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr)
412600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
413600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(
414600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME));
415600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
416600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
417600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
418600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                displayFrame));
419600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        if (outErr) {
420600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            *outErr = err;
421600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        } else {
422600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display"
423600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                    " frame";
424600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        }
425600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
426600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4272b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer,
4282b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            float alpha, hwc2_error_t* outErr = nullptr)
4292b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    {
4302b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(
4312b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA));
4322b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
4332b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4342b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
4352b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                alpha));
4362b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        if (outErr) {
4372b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            *outErr = err;
4382b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        } else {
4392b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha "
4402b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    << alpha;
4412b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        }
4422b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    }
4432b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
444c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    void setLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer,
445c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            const hwc_frect_t& sourceCrop, hwc2_error_t* outErr = nullptr)
446c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {
447c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_SOURCE_CROP>(
448c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP));
449c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
450c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
451c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
452c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                sourceCrop));
453c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        if (outErr) {
454c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            *outErr = err;
455c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        } else {
456c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer source crop";
457c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        }
458c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
459c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
460ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer,
461ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            hwc_transform_t transform, hwc2_error_t* outErr = nullptr)
462ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    {
463ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>(
464ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM));
465ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
466ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
467ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
468ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                transform));
469ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        if (outErr) {
470ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            *outErr = err;
471ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        } else {
472ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform "
473ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall                    << getTransformName(transform);
474ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        }
475ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    }
476ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
477273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer,
478273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            uint32_t zOrder, hwc2_error_t* outErr = nullptr)
479273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
480273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>(
481273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER));
482273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_TRUE(pfn) << "failed to get function";
483273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
484273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer,
485273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                zOrder));
486273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        if (outErr) {
487273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            *outErr = err;
488273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        } else {
489273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order "
490273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    << zOrder;
491273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
492273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
493273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
4944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected:
4954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor)
4964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
4974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        return mHwc2Device->getFunction(mHwc2Device, descriptor);
4984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
4994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities)
5014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    {
5024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        uint32_t num = 0;
5034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr);
5054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        outCapabilities->resize(num);
5074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
5084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        mHwc2Device->getCapabilities(mHwc2Device, &num,
5094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                reinterpret_cast<int32_t*>(outCapabilities->data()));
5104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
5114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
512cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    /* Registers a hotplug callback and waits for hotplug callbacks. This
513cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall     * function will have no effect if called more than once. */
514cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void populateDisplays()
515cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
516cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to receiving */
517cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        {
518cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            std::lock_guard<std::mutex> lock(mHotplugMutex);
519cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
520cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mHotplugStatus != Hwc2TestHotplugStatus::Init)
521cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
522cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            mHotplugStatus = Hwc2TestHotplugStatus::Receiving;
523cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
524cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
525cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Registers the callback. This function call cannot be locked because
526cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * a callback could happen on the same thread */
527cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this,
528cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
529cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                hwc2TestHotplugCallback)));
530cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
531cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Waits for hotplug events. If a hotplug event has not come within 1
532cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall         * second, stop waiting. */
533cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        std::unique_lock<std::mutex> lock(mHotplugMutex);
534cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
535cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) !=
536cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                std::cv_status::timeout) { }
537cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
538cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        /* Sets the hotplug status to done. Future calls will have no effect */
539cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        mHotplugStatus = Hwc2TestHotplugStatus::Done;
540cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
541cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
542cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    void getBadDisplay(hwc2_display_t* outDisplay)
543cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    {
544cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        for (hwc2_display_t display = 0; display < UINT64_MAX; display++) {
545cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            if (mDisplays.count(display) == 0) {
546cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                *outDisplay = display;
547cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                return;
548cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall            }
549cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        }
550cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays"
551cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " are registered. This should never happen.";
552cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
553cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
5541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* NOTE: will create min(newlayerCnt, max supported layers) layers */
5551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void createLayers(hwc2_display_t display,
5561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt)
5571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> newLayers;
5591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
5601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
5611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (size_t i = 0; i < newLayerCnt; i++) {
5631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
5651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err == HWC2_ERROR_NO_RESOURCES)
5661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                break;
5671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            if (err != HWC2_ERROR_NONE) {
5681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                newLayers.clear();
5691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall                ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer";
5701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            }
5711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            newLayers.push_back(layer);
5721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        *outLayers = std::move(newLayers);
5751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
5771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    void destroyLayers(hwc2_display_t display,
5781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            std::vector<hwc2_layer_t>&& layers)
5791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    {
5801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        for (hwc2_layer_t layer : layers) {
5811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall            EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer));
5821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        }
5831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
5841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
585cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig)
586cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    {
587cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
588cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
589cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
590cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
591cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t CONFIG_MAX = UINT32_MAX;
592cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
593cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value"
594cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " (2^32 values) has been taken which shouldn't happen";
595cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
596cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
597cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (config = 0; config < CONFIG_MAX; config++) {
598cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            if (std::count(configs.begin(), configs.end(), config) == 0)
599cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                break;
600cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
601cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
602cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        *outConfig = config;
603cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
604cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
605572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void enableVsync(hwc2_display_t display)
606572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
607572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this,
608572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                reinterpret_cast<hwc2_function_pointer_t>(
609572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                hwc2TestVsyncCallback)));
610572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
611572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
612572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
613572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void disableVsync(hwc2_display_t display)
614572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
615572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
616572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
617572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
618572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    void waitForVsync(hwc2_display_t* outDisplay = nullptr,
619572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            int64_t* outTimestamp = nullptr)
620572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    {
621572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        std::unique_lock<std::mutex> lock(mVsyncMutex);
622572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)),
623572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                std::cv_status::no_timeout) << "timed out attempting to get"
624572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                " vsync callback";
625572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outDisplay)
626572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outDisplay = mVsyncDisplay;
627572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        if (outTimestamp)
628572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            *outTimestamp = mVsyncTimestamp;
629572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
630572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
6316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a property value from
6326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */
6336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyFunction = void (*)(Hwc2Test* test,
6346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
6366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
637273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* Calls a set property function from Hwc2Test to set property values from
638273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */
639273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    using TestLayerPropertiesFunction = void (*)(Hwc2Test* test,
640273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
641273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            const Hwc2TestLayers& testLayers);
642273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
6436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test,
6466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer,
6476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            const Hwc2TestLayer& testLayer, hwc2_error_t* outErr);
6486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Calls a set property function from Hwc2Test to set a bad property value
6506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * on hwc2_layer_t on hwc2_display_t */
6516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test,
6526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr);
6536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* Advances a property of Hwc2TestLayer */
6556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer);
6566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets the property and then
6596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * destroys the layer */
6606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerProperty(Hwc2TestCoverage coverage,
6616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
6696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
670600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
6716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
673600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
674600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
675600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
6766bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6776bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
6786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
6796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
6816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
6826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
6846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
6856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
6866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
6876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
6886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
6906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, cycles through each property
6916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * value and updates the layer property value and then destroys the layer */
6926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyUpdate(Hwc2TestCoverage coverage,
6936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyFunction function, AdvanceProperty advance)
6946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
6956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
6966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
6976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
6986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
6996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
702600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
705600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
706600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
707600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                do {
7126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                            testLayer, nullptr));
7146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                } while (advance(&testLayer));
7156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
721273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    /* For each active display it cycles through each display config and tests
722273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * each property value. It creates multiple layers, calls the
723273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * TestLayerPropertiesFunction to set property values and then
724273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall     * destroys the layers */
725273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt,
726273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            TestLayerPropertiesFunction function)
727273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    {
728273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto display : mDisplays) {
729273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            std::vector<hwc2_config_t> configs;
730273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
731273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
732273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
733273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (auto config : configs) {
734273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                std::vector<hwc2_layer_t> layers;
735600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
736273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
737273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
738600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
739600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
740273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
741273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
742600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayers testLayers(layers, coverage, displayArea);
743273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
744273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                for (auto layer : layers) {
745273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    EXPECT_NO_FATAL_FAILURE(function(this, display, layer,
746273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                            testLayers));
747273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                }
748273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
749273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
750273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
751273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
752273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
753273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
7546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config.
7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 1) It attempts to set a valid property value to bad layer handle.
7566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 2) It creates a layer x and attempts to set a valid property value to
7576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    layer x + 1
7586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * 3) It destroys the layer x and attempts to set a valid property value to
7596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     *    the destroyed layer x.
7606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     */
7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadLayer(Hwc2TestCoverage coverage,
7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            TestLayerPropertyBadLayerFunction function)
7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
7646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
7656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
7666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7676bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
7686bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7696bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
7706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer = 0;
771600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Area displayArea;
7726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
7736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
775600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display,
776600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                        &displayArea));
777600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                Hwc2TestLayer testLayer(coverage, displayArea);
7786bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7796bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7806bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7816bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
7846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1,
7866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
7906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer,
7926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        testLayer, &err));
7936bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
7946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
7956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
7966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
7976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
7986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    /* For each active display it cycles through each display config and tests
7996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * each property value. It creates a layer, sets a bad property value and
8006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall     * then destroys the layer */
8016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function)
8026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    {
8036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        for (auto display : mDisplays) {
8046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            std::vector<hwc2_config_t> configs;
8056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
8076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            for (auto config : configs) {
8096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_layer_t layer;
8106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                hwc2_error_t err = HWC2_ERROR_NONE;
8116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
8136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
8156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err));
8176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong"
8186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        " error code";
8196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
8206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
8216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
8226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        }
8236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
8246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
825600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveConfigAttribute(hwc2_display_t display,
826600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            hwc2_attribute_t attribute, int32_t* outValue)
827600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
828600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        hwc2_config_t config;
829600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config));
830600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
831600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                attribute, outValue));
832600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_GE(*outValue, 0) << "failed to get valid "
833600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                << getAttributeName(attribute);
834600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
835600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
836600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    void getActiveDisplayArea(hwc2_display_t display, Area* displayArea)
837600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {
838600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
839600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_WIDTH, &displayArea->width));
840600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display,
841600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                HWC2_ATTRIBUTE_HEIGHT, &displayArea->height));
842600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
843600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
8444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_device_t* mHwc2Device = nullptr;
845cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
846cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    enum class Hwc2TestHotplugStatus {
847cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Init = 1,
848cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Receiving,
849cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        Done,
850cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    };
851cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
852cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::mutex mHotplugMutex;
853cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::condition_variable mHotplugCv;
854cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init;
855cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    std::unordered_set<hwc2_display_t> mDisplays;
8561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
8571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    /* Store all created layers that have not been destroyed. If an ASSERT_*
8581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall     * fails, then destroy the layers on exit */
8591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers;
86003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
86103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when
86203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall     * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */
86303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    std::set<hwc2_display_t> mActiveDisplays;
864572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
865572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::mutex mVsyncMutex;
866572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    std::condition_variable mVsyncCv;
867572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t mVsyncDisplay;
868572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    int64_t mVsyncTimestamp = -1;
8694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall};
8704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
871cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData,
872cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_t display, int32_t connection)
873cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
874cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    if (callbackData)
875cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display,
876cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                connection);
877cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
878cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
879572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData,
880572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t display, int64_t timestamp)
881572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
882572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    if (callbackData)
883572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display,
884572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                timestamp);
885572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
886572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
887ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
888ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
889ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
890ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
891ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            testLayer.getBlendMode(), outErr));
892ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
893ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
894ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid setColor(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
895ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
896ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
897ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
898ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, HWC2_COMPOSITION_SOLID_COLOR));
899ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
900ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, testLayer.getPlaneAlpha()));
901ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
902ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            layer, testLayer.getBlendMode()));
903ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
904ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            testLayer.getColor(), outErr));
905ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
906ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
9076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
9096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
9106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_composition_t composition = testLayer.getComposition();
9116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
9126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer,
9146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            composition, &err));
9156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (outErr) {
9166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        *outErr = err;
9176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        return;
9186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
9206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    if (composition != HWC2_COMPOSITION_SIDEBAND) {
9216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code";
9226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    } else {
9236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall        EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED)
9246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                 << "returned wrong error code";
9256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    }
9266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
9276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
928b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
929b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
930b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
931b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer,
932b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            testLayer.getDataspace(), outErr));
933b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
934b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
935600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
936600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
937600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
938600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer,
939600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            testLayer.getDisplayFrame(), outErr));
940600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
941600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
9422b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
9432b1f53060ea8587a428f826cf7890354ff124722Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t *outErr)
9442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
9452b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer,
9462b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getBlendMode()));
9472b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer,
9482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            testLayer.getPlaneAlpha(), outErr));
9492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
9502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
951c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid setSourceCrop(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
952c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
953c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
954c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerSourceCrop(display, layer,
955c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            testLayer.getSourceCrop(), outErr));
956c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
957c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
958ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
959ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
960ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
961ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer,
962ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            testLayer.getTransform(), outErr));
963ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
964ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
965273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
966273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        const Hwc2TestLayer& testLayer, hwc2_error_t* outErr)
967273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
968273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
969273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            testLayer.getZOrder(), outErr));
970273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
971273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
972ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer)
973ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
974ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return testLayer->advanceBlendMode();
975ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
976ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
977ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallbool advanceColor(Hwc2TestLayer* testLayer)
978ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
979ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    /* Color depends on blend mode so advance blend mode last so color is not
980ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall     * force to update as often */
981ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advancePlaneAlpha())
982ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
983ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (testLayer->advanceColor())
984ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return true;
985ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return testLayer->advanceBlendMode();
986ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
987ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
9886bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer)
9896bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
9906bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return testLayer->advanceComposition();
9916bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
9926bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
993b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer)
994b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
995b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return testLayer->advanceDataspace();
996b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
997b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
998600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallbool advanceDisplayFrame(Hwc2TestLayer* testLayer)
999600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1000600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return testLayer->advanceDisplayFrame();
1001600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1002600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
10032b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer)
10042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
10052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return testLayer->advancePlaneAlpha();
10062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
10072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1008c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallbool advanceSourceCrop(Hwc2TestLayer* testLayer)
1009c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
1010c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (testLayer->advanceSourceCrop())
1011c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return true;
1012c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return testLayer->advanceBufferArea();
1013c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
1014c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
1015ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer)
1016ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
1017ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return testLayer->advanceTransform();
1018ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
1019ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
10204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{
10224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
10234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_LAYER,
10244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
10254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_LAYER,
10264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
10274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_DUMP,
10284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_ACTIVE_CONFIG,
10294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
10304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
10314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_COLOR_MODES,
10324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
10334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
10344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_NAME,
10354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
10364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DISPLAY_TYPE,
10374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_DOZE_SUPPORT,
10384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_HDR_CAPABILITIES,
10394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
10404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_GET_RELEASE_FENCES,
10414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_PRESENT_DISPLAY,
10424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_REGISTER_CALLBACK,
10434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_ACTIVE_CONFIG,
10444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CLIENT_TARGET,
10454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_MODE,
10464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_COLOR_TRANSFORM,
10474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_CURSOR_POSITION,
10484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
10494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_BUFFER,
10504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COLOR,
10514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
10524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DATASPACE,
10534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
10544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
10554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
10564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
10574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_TRANSFORM,
10584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
10594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_LAYER_Z_ORDER,
10604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_OUTPUT_BUFFER,
10614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_POWER_MODE,
10624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_SET_VSYNC_ENABLED,
10634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    HWC2_FUNCTION_VALIDATE_DISPLAY,
10644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}};
10654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */
10674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION)
10684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
10694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    for (hwc2_function_descriptor_t descriptor : requiredFunctions) {
10704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        hwc2_function_pointer_t pfn = getFunction(descriptor);
10714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall        EXPECT_TRUE(pfn) << "failed to get function "
10724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall                << getFunctionDescriptorName(descriptor);
10734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    }
10744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
10754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */
10774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function)
10784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
10794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID);
10804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_FALSE(pfn) << "failed to get invalid function";
10814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
10824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */
10844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES)
10854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{
10864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    std::vector<hwc2_capability_t> capabilities;
10874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    getCapabilities(&capabilities);
10894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall
10904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall    EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(),
10914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall            HWC2_CAPABILITY_INVALID), 0);
10924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}
1093a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1094a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{
1095a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_HOTPLUG,
1096a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_REFRESH,
1097a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    HWC2_CALLBACK_VSYNC,
1098a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}};
1099a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1100a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required
1101a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */
1102a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK)
1103a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1104a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1105a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1106a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1107a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1108a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1109a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1110a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1111a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1112a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1113a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */
1114a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter)
1115a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1116a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1117a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            const_cast<char*>("data"));
1118a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1119a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1120a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data,
1121a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall            []() { return; }, &err));
1122a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1123a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1124a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1125a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */
1126a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data)
1127a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{
1128a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    hwc2_callback_data_t data = nullptr;
1129a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall
1130a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    for (auto descriptor : callbackDescriptors) {
1131a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data,
1132a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall                []() { return; }));
1133a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall    }
1134a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}
1135cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1136cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each
1137cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */
1138cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE)
1139cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1140cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    for (auto display : mDisplays) {
1141cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        hwc2_display_type_t type;
1142cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1143cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type));
1144cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall        EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return"
1145cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall                " correct display type";
1146cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    }
1147cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
1148cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1149cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad
1150cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */
1151cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display)
1152cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{
1153cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_t display;
1154cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_display_type_t type;
1155cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1156cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1157cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1158cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall
1159cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err));
1160cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1161cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall}
11621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */
11641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER)
11651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
11681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
11701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
11721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
11731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
11741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */
11761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display)
11771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t display;
11791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_layer_t layer;
11801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
11811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
11831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err));
11851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
11861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
11871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources
11891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */
11901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources)
11911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
11921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    const size_t layerCnt = 1000;
11931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
11951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        std::vector<hwc2_layer_t> layers;
11961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt));
11981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
11991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers)));
12001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */
12041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display)
12051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    hwc2_display_t badDisplay;
12071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay));
12091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
12111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer = 0;
12121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
12131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
12151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
12161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err));
12201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
12211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
12251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */
12271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer)
12281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{
12291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    for (auto display : mDisplays) {
12301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_layer_t layer;
12311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
12321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err));
12341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err));
12371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err));
12401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err));
12431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err));
12461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
12491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err));
12511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
12541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall
12551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err));
12561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code";
12571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall    }
12581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall}
1259cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1260cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{
1261cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_WIDTH,
1262cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_HEIGHT,
1263cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1264cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1265cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{
1266cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_VSYNC_PERIOD,
1267cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_X,
1268cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    HWC2_ATTRIBUTE_DPI_Y,
1269cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}};
1270cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1271cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid
1272cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */
1273cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE)
1274cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1275cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1276cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1277cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1278cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1279cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1280cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1281cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1282cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1283cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : requiredAttributes) {
1284cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1285cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1286cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                EXPECT_GE(value, 0) << "missing required attribute "
1287cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << getAttributeName(attribute) << " for config "
1288cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        << config;
1289cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1290cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            for (auto attribute : optionalAttributes) {
1291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1292cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                        attribute, &value));
1293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            }
1294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid
1299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */
1300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute)
1301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID;
1303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto config : configs) {
1310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            int32_t value;
1311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            hwc2_error_t err = HWC2_ERROR_NONE;
1312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1313cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1314cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1315cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(value, -1) << "failed to return -1 for an invalid"
1316cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    " attribute for config " << config;
1317cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1318cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1319cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1320cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1321cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */
1322cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display)
1323cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1324cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1325cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    const hwc2_config_t config = 0;
1326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    int32_t value;
1327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : requiredAttributes) {
1332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto attribute : optionalAttributes) {
1338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute,
1339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                &value, &err));
1340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */
1345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config)
1346cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1347cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1348cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_config_t config;
1349cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        int32_t value;
1350cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1351cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1352cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
1353cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1354cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : requiredAttributes) {
1355cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1356cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1357cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1358cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1359cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1360cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        for (auto attribute : optionalAttributes) {
1361cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config,
1362cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                    attribute, &value, &err));
1363cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
1364cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        }
1365cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1366cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1367cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1368cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */
1369cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS)
1370cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1371cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1372cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1373cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1374cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1375cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1376cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1377cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1378cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */
1379cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display)
1380cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1381cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_display_t display;
1382cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    std::vector<hwc2_config_t> configs;
1383cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1384cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1385cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1386cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1387cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err));
1388cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1389cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1390cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    EXPECT_TRUE(configs.empty()) << "returned configs for bad display";
1391cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1392cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1393cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple
1394cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */
1395cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same)
1396cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1397cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1398cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs1, configs2;
1399cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1400cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1));
1401cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2));
1402cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(),
1404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs2.begin())) << "returned two different config sets";
1405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
1407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */
1409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate)
1410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{
1411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    for (auto display : mDisplays) {
1412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::vector<hwc2_config_t> configs;
1413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
1415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall
1416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        std::unordered_set<hwc2_config_t> configsSet(configs.begin(),
1417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                configs.end());
1418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall        EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate"
1419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall                " configs";
1420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall    }
1421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}
142293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
142393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */
142493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG)
142593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
142693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
142793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
142893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
142993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
143093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
143193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
143293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            hwc2_config_t activeConfig;
143393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
143493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
143593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig));
143693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
143793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(activeConfig, config) << "failed to get active config";
143893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
143993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
144093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
144193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
144293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad
144393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */
144493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display)
144593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
144693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
144793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_config_t activeConfig;
144893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
144993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
145093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
145193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
145293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
145393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
145493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
145593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
145693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
145793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config
145893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */
145993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config)
146093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
146193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
146293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
146393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t activeConfig;
146493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
146593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
146693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
146793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
146893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (configs.empty())
146993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            return;
147093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
147193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err));
147293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        if (err == HWC2_ERROR_NONE) {
147393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NE(std::count(configs.begin(), configs.end(),
147493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    activeConfig), 0) << "active config is not found in "
147593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall                    " configs for display";
147693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        } else {
147793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
147893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
147993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
148093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
148193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
148293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active
148393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */
148493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG)
148593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
148693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
148793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        std::vector<hwc2_config_t> configs;
148893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
148993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
149093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
149193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        for (auto config : configs) {
149293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall            EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config));
149393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        }
149493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
149593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
149693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
149793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */
149893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display)
149993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
150093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_display_t display;
150193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    const hwc2_config_t config = 0;
150293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
150393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
150493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
150593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
150693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
150793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
150893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
150993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
151093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */
151193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config)
151293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{
151393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    for (auto display : mDisplays) {
151493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_config_t config;
151593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
151693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
151793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config));
151893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall
151993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err));
152093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code";
152193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall    }
152293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall}
152303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
152403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */
152503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT)
152603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
152703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
152803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
152903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
153003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
153103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
153203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value";
153303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
153403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
153503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
153603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */
153703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display)
153803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
153903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
154003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
154103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
154203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
154303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
154403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
154503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
154603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
154703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
154803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
154903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
155003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */
155103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE)
155203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
155303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
155403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
155503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
155603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
155703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
155803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
155903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
156003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
156103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
156203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
156303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
156403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
156503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
156603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
156703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
156803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
156903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */
157103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display)
157203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
157303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_display_t display;
157403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
157503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
157703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
157803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err));
157903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
158003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err));
158203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
158303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    int32_t support = -1;
158503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
158603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    if (support != 1)
158703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        return;
158803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
158903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err));
159003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
159103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
159203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND,
159303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            &err));
159403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
159503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
159603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
159703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */
159803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter)
159903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
160003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
160103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>(
160203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND + 1);
160303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
160403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
160503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err));
160603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code "
160703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                << mode;
160803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
160903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
161003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
161103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support
161203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */
161303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported)
161403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
161503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
161603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
161703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
161803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
161903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err));
162003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support == 1)
162103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
162203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
162303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_EQ(support, 0) << "invalid doze support value";
162403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
162503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE,
162603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                &err));
162703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code";
162803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
162903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
163003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND, &err));
163103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) <<  "returned wrong error code";
163203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
163303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
163403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
163503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */
163603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress)
163703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{
163803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    for (auto display : mDisplays) {
163903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
164003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
164103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
164203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
164303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
164403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
164503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
164603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
164703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
164803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        int32_t support = -1;
164903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support));
165003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        if (support != 1)
165103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall            return;
165203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
165403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE));
165503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
165603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
165703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
165803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display,
165903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall                HWC2_POWER_MODE_DOZE_SUSPEND));
166003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall
166103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
166203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall    }
166303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall}
1664572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1665572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active
1666572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */
1667572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED)
1668572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1669572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1670572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1671572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1672572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1678572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1679572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1680572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1681572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1682572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1683572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1684572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1685572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1686572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */
1687572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback)
1688572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1689572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1690572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_display_t receivedDisplay;
1691572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        int64_t receivedTimestamp;
1692572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1693572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1694572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1695572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(enableVsync(display));
1696572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1697572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay,
1698572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &receivedTimestamp));
1699572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1700572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(receivedDisplay, display) << "failed to get correct display";
1701572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp";
1702572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1703572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(disableVsync(display));
1704572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1705572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1706572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1707572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1708572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1709572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */
1710572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display)
1711572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1712572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_display_t display;
1713572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1714572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            const_cast<char*>("data"));
1715572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1716572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1717572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1718572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1719572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1720572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall            []() { return; }));
1721572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1722572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err));
1723572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1724572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1725572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err));
1726572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1727572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1728572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1729572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */
1730572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter)
1731572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1732572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1733572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1734572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1735572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_error_t err = HWC2_ERROR_NONE;
1736572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1737572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1738572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1739572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1740572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1741572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1742572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID,
1743572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                &err));
1744572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code";
1745572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1746572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1747572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1748572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1749572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1750572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple
1751572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */
1752572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress)
1753572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1754572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1755572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>(
1756572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                const_cast<char*>("data"));
1757572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1758572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1759572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1760572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data,
1761572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall                []() { return; }));
1762572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1763572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1764572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1765572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1766572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1767572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1768572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1769572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1770572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1771572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1772572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1773572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1774572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1775572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display
1776572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */
1777572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power)
1778572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1779572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1780572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1781572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1782572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1783572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1789572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1790572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback
1791572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */
1792572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback)
1793572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{
1794572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    const uint secs = 1;
1795572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1796572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    for (auto display : mDisplays) {
1797572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON));
1798572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE));
1800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        sleep(secs);
1802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE));
1804572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall
1805572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall        ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF));
1806572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall    }
1807572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall}
1808dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1809dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */
1810dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME)
1811dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1812dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    for (auto display : mDisplays) {
1813dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        std::string name;
1814dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1815dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name));
1816dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    }
1817dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
1818dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1819dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad
1820dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */
1821dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display)
1822dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{
1823dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_display_t display;
1824dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    std::string name;
1825dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    hwc2_error_t err = HWC2_ERROR_NONE;
1826dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1827dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display));
1828dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall
1829dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err));
1830dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall    EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code";
1831dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall}
18326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */
18346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE)
18356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
18376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
18386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a
18416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */
18426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update)
18436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
18456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition, advanceComposition));
18466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */
18496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer)
18506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
18526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            setComposition));
18536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
18546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */
18566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter)
18576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
18586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
18596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
18606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                    hwc2_error_t* outErr) {
18616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
18626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display,
18636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall                        layer, HWC2_COMPOSITION_INVALID, outErr));
18646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall            }
18656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    ));
18666bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
1867ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1868ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */
1869ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE)
1870ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1871ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1872ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1873ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1874ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1875ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */
1876ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update)
1877ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1878ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1879ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode, advanceBlendMode));
1880ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1881ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1882ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */
1883ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer)
1884ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1885ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1886ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            setBlendMode));
1887ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1888ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1889ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */
1890ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter)
1891ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
1892ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter(
1893ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1894ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                    hwc2_error_t* outErr) {
1895ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
1896ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display,
1897ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall                        layer, HWC2_BLEND_MODE_INVALID, outErr));
1898ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall            }
1899ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    ));
1900ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
1901b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1902ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer. */
1903ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR)
1904ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1905ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1906ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
1907ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1908ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1909ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can update the color of a layer. */
1910ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_update)
1911ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1912ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1913ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            setColor, advanceColor));
1914ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1915ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1916ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 can set the color of a layer when the
1917ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall * composition type has not been set to HWC2_COMPOSITION_SOLID_COLOR. */
1918ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_composition_type_unset)
1919ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1920ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Basic,
1921ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
1922ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
1923ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1924ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, layer,
1925ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                        testLayer.getColor(), outErr));
1926ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            },
1927ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1928ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            advanceColor));
1929ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1930ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1931ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the color of a bad layer. */
1932ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallTEST_F(Hwc2Test, SET_LAYER_COLOR_bad_layer)
1933ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
1934ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1935ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
1936ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) {
1937ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1938ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerColor(display, badLayer,
1939ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                        testLayer.getColor(), outErr));
1940ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            }
1941ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    ));
1942ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
1943ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
1944b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */
1945b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE)
1946b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1947b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1948b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
1949b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1950b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1951b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */
1952b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update)
1953b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1954b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1955b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace, advanceDataspace));
1956b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
1957b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
1958b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */
1959b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer)
1960b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
1961b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1962b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall            setDataspace));
1963b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
19642b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
1965600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */
1966600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME)
1967600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1968600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
1969600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
1970600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1971600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1972600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */
1973600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update)
1974600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1975600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
1976600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame, advanceDisplayFrame));
1977600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1978600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
1979600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */
1980600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallTEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer)
1981600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
1982600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
1983600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            setDisplayFrame));
1984600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
1985600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
19862b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */
19872b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA)
19882b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
19892b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
19902b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
19912b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
19922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
19932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */
19942b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update)
19952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
19962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
19972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            setPlaneAlpha, advancePlaneAlpha));
19982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
19992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
20002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */
20012b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer)
20022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
20032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
20042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer,
20052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) {
20062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
20072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                    EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display,
20082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall                            badLayer, testLayer.getPlaneAlpha(), outErr));
20092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall            }
20102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    ));
20112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
2012ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2013c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can set the source crop of a layer. */
2014c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP)
2015c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2016c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2017c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2018c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2019c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2020c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 can update the source crop of a layer. */
2021c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_update)
2022c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2023c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2024c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop, advanceSourceCrop));
2025c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2026c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2027c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the source crop of a bad layer. */
2028c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallTEST_F(Hwc2Test, SET_LAYER_SOURCE_CROP_bad_layer)
2029c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
2030c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2031c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            setSourceCrop));
2032c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
2033c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
2034ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */
2035ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM)
2036ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2037ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete,
2038ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2039ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2040ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2041ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */
2042ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update)
2043ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2044ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete,
2045ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform, advanceTransform));
2046ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2047ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
2048ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */
2049ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer)
2050ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
2051ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2052ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall            setTransform));
2053ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
2054273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2055273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */
2056273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER)
2057273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2058273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10,
2059273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer,
2060273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                    const Hwc2TestLayers& testLayers) {
2061273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2062273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer,
2063273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                        testLayers.getZOrder(layer)));
2064273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2065273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ));
2066273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2067273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2068273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */
2069273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update)
2070273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2071273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0),
2072273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4),
2073273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX / 2),
2074273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            static_cast<uint32_t>(UINT32_MAX) };
2075273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2076273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    for (auto display : mDisplays) {
2077273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        std::vector<hwc2_config_t> configs;
2078273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2079273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs));
2080273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2081273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        for (auto config : configs) {
2082273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            hwc2_layer_t layer;
2083273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2084273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config));
2085273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2086273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer));
2087273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2088273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            for (uint32_t zOrder : zOrders) {
2089273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall                EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder));
2090273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            }
2091273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2092273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer));
2093273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall        }
2094273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    }
2095273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2096273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall
2097273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */
2098273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer)
2099273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{
2100273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall    ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default,
2101273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall            setZOrder));
2102273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall}
2103