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