Hwc2Test.cpp revision 572a1eedae1d15a8544c95f0284e5b1216a187d2
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 29cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, 30cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display, int32_t connected); 31572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData, 32572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t display, int64_t timestamp); 33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test { 354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic: 364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall virtual void SetUp() 384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hw_module_t const* hwc2Module; 404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module); 424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall ASSERT_GE(err, 0) << "failed to get hwc hardware module: " 434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << strerror(-err); 444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall /* The following method will fail if you have not run 464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * "adb shell stop" */ 474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall err = hwc2_open(hwc2Module, &mHwc2Device); 484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall ASSERT_GE(err, 0) << "failed to open hwc hardware module: " 494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << strerror(-err); 50cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 51cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall populateDisplays(); 524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall virtual void TearDown() 554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto itr = mLayers.begin(); itr != mLayers.end();) { 581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display = itr->first; 591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = itr->second; 601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall itr++; 611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Destroys and removes the layer from mLayers */ 621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall destroyLayer(display, layer); 631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) { 6603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_display_t display = *itr; 6703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall itr++; 6803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall /* Sets power mode to off and removes the display from 6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * mActiveDisplays */ 7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall setPowerMode(display, HWC2_POWER_MODE_OFF); 7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall if (mHwc2Device) 744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_close(mHwc2Device); 754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 77a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall void registerCallback(hwc2_callback_descriptor_t descriptor, 78a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer, 79a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t* outErr = nullptr) 80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall { 81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>( 82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall getFunction(HWC2_FUNCTION_REGISTER_CALLBACK)); 83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor, 86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall callbackData, pointer)); 87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall if (outErr) { 88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall *outErr = err; 89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } else { 90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback"; 91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 94cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType, 95cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t* outErr = nullptr) 96cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>( 98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE)); 99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<int32_t*>(outType))); 103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (outErr) { 104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outErr = err; 105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } else { 106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type"; 107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* If the populateDisplays function is still receiving displays and the 111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is connected, the display handle is stored in mDisplays. */ 112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void hotplugCallback(hwc2_display_t display, int32_t connected) 113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving) 117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (connected == HWC2_CONNECTION_CONNECTED) 120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mDisplays.insert(display); 121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugCv.notify_all(); 123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer, 1261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t* outErr = nullptr) 1271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>( 1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall getFunction(HWC2_FUNCTION_CREATE_LAYER)); 1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall outLayer)); 1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NONE) 1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall mLayers.insert(std::make_pair(display, *outLayer)); 1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (outErr) { 1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outErr = err; 1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } else { 1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayer(hwc2_display_t display, hwc2_layer_t layer, 1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t* outErr = nullptr) 1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>( 1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall getFunction(HWC2_FUNCTION_DESTROY_LAYER)); 1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer)); 1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NONE) 1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall mLayers.erase(std::make_pair(display, layer)); 1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (outErr) { 1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outErr = err; 1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } else { 1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer " 1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall << layer; 1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config, 166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_attribute_t attribute, int32_t* outValue, 167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t* outErr = nullptr) 168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>( 170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE)); 171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config, 174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, outValue)); 175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (outErr) { 177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outErr = err; 178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } else { 179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute " 180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " << config; 181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getDisplayConfigs(hwc2_display_t display, 185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t>* outConfigs, 186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t* outErr = nullptr) 187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>( 189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS)); 190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall uint32_t numConfigs = 0; 193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &numConfigs, nullptr)); 196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (err == HWC2_ERROR_NONE) { 198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall outConfigs->resize(numConfigs); 199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &numConfigs, outConfigs->data())); 202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (outErr) { 205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outErr = err; 206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } else { 207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for" 208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " display " << display; 209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 21293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig, 21393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t* outErr = nullptr) 21493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall { 21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>( 21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG)); 21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall outConfig)); 22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (outErr) { 22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall *outErr = err; 22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on" 22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall " display " << display; 22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall void setActiveConfig(hwc2_display_t display, hwc2_config_t config, 23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t* outErr = nullptr) 23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall { 23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>( 23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG)); 23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config)); 23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (outErr) { 23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall *outErr = err; 23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config " 24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall << config; 24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 24503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall void getDozeSupport(hwc2_display_t display, int32_t* outSupport, 24603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t* outErr = nullptr) 24703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall { 24803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>( 24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT)); 25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall outSupport)); 25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (outErr) { 25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall *outErr = err; 25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } else { 25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on" 25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall " display " << display; 25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode, 26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t* outErr = nullptr) 26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall { 26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>( 26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall getFunction(HWC2_FUNCTION_SET_POWER_MODE)); 26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall mode)); 27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (outErr) { 27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall *outErr = err; 27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (err != HWC2_ERROR_NONE) 27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } else { 27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode " 27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall << getPowerModeName(mode) << " on display " << display; 27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (mode == HWC2_POWER_MODE_OFF) { 28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall mActiveDisplays.erase(display); 28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } else { 28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall mActiveDisplays.insert(display); 28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 287572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled, 288572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_error_t* outErr = nullptr) 289572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>( 291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED)); 292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall enabled)); 296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (outErr) { 297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall *outErr = err; 298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } else { 299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled " 300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall << getVsyncName(enabled); 301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void vsyncCallback(hwc2_display_t display, int64_t timestamp) 305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::lock_guard<std::mutex> lock(mVsyncMutex); 307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall mVsyncDisplay = display; 308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall mVsyncTimestamp = timestamp; 309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall mVsyncCv.notify_all(); 310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 3124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected: 3134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor) 3144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 3154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall return mHwc2Device->getFunction(mHwc2Device, descriptor); 3164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 3174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities) 3194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 3204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall uint32_t num = 0; 3214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr); 3234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall outCapabilities->resize(num); 3254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, 3274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall reinterpret_cast<int32_t*>(outCapabilities->data())); 3284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 3294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 330cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers a hotplug callback and waits for hotplug callbacks. This 331cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * function will have no effect if called more than once. */ 332cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void populateDisplays() 333cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 334cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to receiving */ 335cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 336cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 337cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 338cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Init) 339cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 340cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Receiving; 341cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 342cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 343cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers the callback. This function call cannot be locked because 344cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * a callback could happen on the same thread */ 345cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this, 346cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<hwc2_function_pointer_t>( 347cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2TestHotplugCallback))); 348cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 349cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Waits for hotplug events. If a hotplug event has not come within 1 350cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * second, stop waiting. */ 351cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unique_lock<std::mutex> lock(mHotplugMutex); 352cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 353cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) != 354cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::cv_status::timeout) { } 355cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 356cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to done. Future calls will have no effect */ 357cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Done; 358cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 359cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 360cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getBadDisplay(hwc2_display_t* outDisplay) 361cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 362cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (hwc2_display_t display = 0; display < UINT64_MAX; display++) { 363cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mDisplays.count(display) == 0) { 364cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outDisplay = display; 365cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 366cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 367cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 368cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays" 369cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " are registered. This should never happen."; 370cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 371cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 3721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* NOTE: will create min(newlayerCnt, max supported layers) layers */ 3731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayers(hwc2_display_t display, 3741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt) 3751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 3761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> newLayers; 3771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 3781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 3791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (size_t i = 0; i < newLayerCnt; i++) { 3811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 3831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NO_RESOURCES) 3841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall break; 3851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err != HWC2_ERROR_NONE) { 3861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.clear(); 3871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 3881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.push_back(layer); 3901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outLayers = std::move(newLayers); 3931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayers(hwc2_display_t display, 3961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>&& layers) 3971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 3981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (hwc2_layer_t layer : layers) { 3991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 4001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 4011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 4021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 403cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig) 404cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 405cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 406cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 407cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 408cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 409cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t CONFIG_MAX = UINT32_MAX; 410cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 411cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value" 412cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " (2^32 values) has been taken which shouldn't happen"; 413cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 414cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 415cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (config = 0; config < CONFIG_MAX; config++) { 416cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (std::count(configs.begin(), configs.end(), config) == 0) 417cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall break; 418cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 419cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 420cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outConfig = config; 421cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 422cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 423572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void enableVsync(hwc2_display_t display) 424572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 425572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this, 426572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall reinterpret_cast<hwc2_function_pointer_t>( 427572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2TestVsyncCallback))); 428572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 429572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 430572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 431572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void disableVsync(hwc2_display_t display) 432572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 433572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 434572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 435572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 436572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void waitForVsync(hwc2_display_t* outDisplay = nullptr, 437572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall int64_t* outTimestamp = nullptr) 438572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 439572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::unique_lock<std::mutex> lock(mVsyncMutex); 440572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)), 441572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::cv_status::no_timeout) << "timed out attempting to get" 442572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall " vsync callback"; 443572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (outDisplay) 444572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall *outDisplay = mVsyncDisplay; 445572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (outTimestamp) 446572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall *outTimestamp = mVsyncTimestamp; 447572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 448572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 4494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_device_t* mHwc2Device = nullptr; 450cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 451cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall enum class Hwc2TestHotplugStatus { 452cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Init = 1, 453cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Receiving, 454cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Done, 455cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall }; 456cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 457cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::mutex mHotplugMutex; 458cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::condition_variable mHotplugCv; 459cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init; 460cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unordered_set<hwc2_display_t> mDisplays; 4611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 4621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Store all created layers that have not been destroyed. If an ASSERT_* 4631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * fails, then destroy the layers on exit */ 4641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers; 46503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 46603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when 46703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */ 46803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall std::set<hwc2_display_t> mActiveDisplays; 469572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 470572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::mutex mVsyncMutex; 471572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::condition_variable mVsyncCv; 472572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t mVsyncDisplay; 473572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall int64_t mVsyncTimestamp = -1; 4744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}; 4754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 476cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, 477cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display, int32_t connection) 478cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 479cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (callbackData) 480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display, 481cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall connection); 482cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 483cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 484572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData, 485572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t display, int64_t timestamp) 486572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 487572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (callbackData) 488572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display, 489572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall timestamp); 490572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 491572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 4924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{ 4944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES, 4954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_LAYER, 4964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY, 4974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_LAYER, 4984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY, 4994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DUMP, 5004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_ACTIVE_CONFIG, 5014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES, 5024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT, 5034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_COLOR_MODES, 5044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE, 5054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_CONFIGS, 5064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_NAME, 5074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_REQUESTS, 5084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_TYPE, 5094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DOZE_SUPPORT, 5104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_HDR_CAPABILITIES, 5114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT, 5124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_RELEASE_FENCES, 5134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_PRESENT_DISPLAY, 5144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_REGISTER_CALLBACK, 5154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_ACTIVE_CONFIG, 5164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CLIENT_TARGET, 5174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_MODE, 5184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_TRANSFORM, 5194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CURSOR_POSITION, 5204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BLEND_MODE, 5214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BUFFER, 5224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COLOR, 5234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE, 5244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DATASPACE, 5254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME, 5264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA, 5274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SOURCE_CROP, 5284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE, 5294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_TRANSFORM, 5304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION, 5314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_Z_ORDER, 5324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_OUTPUT_BUFFER, 5334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_POWER_MODE, 5344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_VSYNC_ENABLED, 5354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_VALIDATE_DISPLAY, 5364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}}; 5374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 5384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */ 5394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION) 5404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 5414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall for (hwc2_function_descriptor_t descriptor : requiredFunctions) { 5424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(descriptor); 5434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_TRUE(pfn) << "failed to get function " 5444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << getFunctionDescriptorName(descriptor); 5454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 5464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 5474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 5484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */ 5494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function) 5504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 5514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID); 5524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_FALSE(pfn) << "failed to get invalid function"; 5534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 5544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 5554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */ 5564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES) 5574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 5584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall std::vector<hwc2_capability_t> capabilities; 5594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 5604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall getCapabilities(&capabilities); 5614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 5624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(), 5634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_CAPABILITY_INVALID), 0); 5644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 565a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 566a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{ 567a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_HOTPLUG, 568a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_REFRESH, 569a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_VSYNC, 570a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}}; 571a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 572a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required 573a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */ 574a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK) 575a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 576a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 577a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 578a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 579a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 580a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 581a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 582a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 583a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 584a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 585a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */ 586a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter) 587a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 588a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 589a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 590a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 591a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 592a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data, 593a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; }, &err)); 594a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code"; 595a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 596a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 597a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */ 598a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data) 599a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 600a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = nullptr; 601a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 602a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 603a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 604a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 605a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 606a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 607cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 608cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each 609cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */ 610cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE) 611cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 612cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (auto display : mDisplays) { 613cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 614cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 615cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type)); 616cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return" 617cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " correct display type"; 618cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 619cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 620cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 621cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad 622cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */ 623cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display) 624cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 625cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display; 626cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 627cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 628cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 629cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 630cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 631cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err)); 632cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 633cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 6341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */ 6361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER) 6371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 6381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 6391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 6401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 6421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 6441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 6451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 6461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */ 6481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display) 6491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 6501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display; 6511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 6521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 6531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 6551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 6571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 6581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 6591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources 6611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */ 6621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources) 6631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 6641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall const size_t layerCnt = 1000; 6651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 6671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> layers; 6681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt)); 6701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers))); 6721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 6731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 6741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */ 6761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display) 6771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 6781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t badDisplay; 6791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay)); 6811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 6831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = 0; 6841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 6851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 6871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 6881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 6901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 6921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 6931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 6951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 6961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 6971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */ 6991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer) 7001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 7011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 7021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 7031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 7041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err)); 7061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err)); 7091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err)); 7121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err)); 7151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err)); 7181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 7211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err)); 7231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 7261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err)); 7281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 7301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 731cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 732cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{ 733cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_WIDTH, 734cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_HEIGHT, 735cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 736cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 737cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{ 738cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_VSYNC_PERIOD, 739cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_X, 740cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_Y, 741cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 742cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 743cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid 744cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */ 745cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE) 746cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 747cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 748cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 749cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 750cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 751cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 752cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 753cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 754cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 755cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 756cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 757cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 758cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_GE(value, 0) << "missing required attribute " 759cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " 760cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << config; 761cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 762cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 763cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 764cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 765cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 766cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 767cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 768cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 769cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 770cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid 771cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */ 772cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute) 773cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 774cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID; 775cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 776cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 777cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 778cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 779cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 780cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 781cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 782cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 783cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 784cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 785cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 786cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 787cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(value, -1) << "failed to return -1 for an invalid" 788cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " attribute for config " << config; 789cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 790cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 791cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 792cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 793cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */ 794cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display) 795cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 796cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 797cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_config_t config = 0; 798cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 799cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 800cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 801cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 802cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 803cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 804cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 805cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 806cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 807cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 808cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 809cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 810cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 811cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 812cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 813cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 814cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 815cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 816cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */ 817cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config) 818cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 819cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 820cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 821cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 822cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 823cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 824cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 825cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 826cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 827cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 828cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 829cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 830cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 831cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 832cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 833cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 834cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 835cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 836cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 837cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 838cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 839cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 840cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */ 841cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS) 842cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 843cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 844cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 845cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 846cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 847cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 848cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 849cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 850cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */ 851cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display) 852cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 853cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 854cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 855cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 856cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 857cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 858cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 859cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err)); 860cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 861cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 862cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(configs.empty()) << "returned configs for bad display"; 863cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 864cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 865cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple 866cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */ 867cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same) 868cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 869cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 870cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs1, configs2; 871cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 872cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1)); 873cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2)); 874cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 875cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(), 876cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs2.begin())) << "returned two different config sets"; 877cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 878cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 879cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 880cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */ 881cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate) 882cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 883cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 884cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 885cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 886cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 887cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 888cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::unordered_set<hwc2_config_t> configsSet(configs.begin(), 889cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs.end()); 890cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate" 891cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " configs"; 892cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 893cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 89493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 89593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */ 89693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG) 89793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 89893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 89993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 90093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 90193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 90293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 90393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto config : configs) { 90493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 90593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 90693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 90793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig)); 90893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 90993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(activeConfig, config) << "failed to get active config"; 91093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 91193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 91293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 91393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 91493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad 91593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */ 91693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display) 91793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 91893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_display_t display; 91993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 92093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 92193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 92293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 92393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 92493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err)); 92593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 92693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 92793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 92893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 92993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config 93093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */ 93193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config) 93293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 93393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 93493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 93593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 93693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 93793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 93893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 93993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 94093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (configs.empty()) 94193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall return; 94293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 94393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err)); 94493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (err == HWC2_ERROR_NONE) { 94593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_NE(std::count(configs.begin(), configs.end(), 94693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall activeConfig), 0) << "active config is not found in " 94793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall " configs for display"; 94893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 94993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 95093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 95193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 95293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 95393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 95493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active 95593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */ 95693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG) 95793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 95893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 95993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 96093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 96193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 96293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 96393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto config : configs) { 96493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 96593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 96693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 96793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 96893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 96993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */ 97093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display) 97193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 97293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_display_t display; 97393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall const hwc2_config_t config = 0; 97493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 97593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 97693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 97793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 97893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err)); 97993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 98093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 98193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 98293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */ 98393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config) 98493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 98593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 98693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t config; 98793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 98893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 98993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 99093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 99193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err)); 99293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 99393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 99493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 99503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 99603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */ 99703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT) 99803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 99903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 100003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 100103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 100203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support)); 100303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 100403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value"; 100503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 100603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 100703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 100803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */ 100903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display) 101003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 101103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_display_t display; 101203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 101303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 101403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 101503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 101603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 101703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err)); 101803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 101903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 102003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 102103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 102203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */ 102303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE) 102403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 102503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 102603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 102703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 102803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 102903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 103003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support)); 103103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support != 1) 103203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 103303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 103403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE)); 103503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 103603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND)); 103703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 103803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 103903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 104003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 104103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 104203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */ 104303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display) 104403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 104503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_display_t display; 104603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 104703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 104803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 104903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 105003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err)); 105103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 105203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 105303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err)); 105403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 105503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 105603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 105703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err)); 105803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support != 1) 105903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 106003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 106103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err)); 106203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 106303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 106403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND, 106503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall &err)); 106603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 106703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 106803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 106903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */ 107003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter) 107103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 107203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 107303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>( 107403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND + 1); 107503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 107603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 107703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err)); 107803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code " 107903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall << mode; 108003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 108103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 108203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 108303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support 108403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */ 108503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported) 108603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 108703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 108803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 108903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 109003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 109103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err)); 109203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support == 1) 109303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 109403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 109503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_EQ(support, 0) << "invalid doze support value"; 109603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 109703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, 109803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall &err)); 109903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code"; 110003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 110103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 110203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND, &err)); 110303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code"; 110403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 110503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 110603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 110703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */ 110803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress) 110903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 111003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 111103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 111203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 111303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 111403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 111503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 111603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 111703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 111803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 111903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 112003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 112103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support)); 112203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support != 1) 112303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 112403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 112503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE)); 112603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE)); 112703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 112803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 112903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND)); 113003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 113103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND)); 113203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 113303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 113403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 113503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 1136572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1137572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active 1138572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */ 1139572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED) 1140572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1141572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1142572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1143572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1144572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1145572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1146572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1147572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1148572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1149572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1150572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1151572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1152572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1153572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1154572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1155572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1156572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1157572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1158572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */ 1159572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback) 1160572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1161572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1162572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t receivedDisplay; 1163572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall int64_t receivedTimestamp; 1164572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1165572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1166572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1167572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(enableVsync(display)); 1168572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1169572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay, 1170572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall &receivedTimestamp)); 1171572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1172572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(receivedDisplay, display) << "failed to get correct display"; 1173572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp"; 1174572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1175572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(disableVsync(display)); 1176572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1177572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1178572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1179572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1180572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1181572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */ 1182572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display) 1183572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1184572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t display; 1185572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1186572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1187572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1188572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1189572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 1190572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1191572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1192572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1193572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1194572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err)); 1195572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1196572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1197572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err)); 1198572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1199572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1200572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1201572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */ 1202572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter) 1203572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1204572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1205572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1206572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1207572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1208572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1209572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1210572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1211572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1212572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1213572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1214572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID, 1215572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall &err)); 1216572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code"; 1217572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1218572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1219572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1220572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1221572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1222572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple 1223572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */ 1224572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress) 1225572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1226572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1227572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1228572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1229572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1230572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1231572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1232572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1233572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1234572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1235572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1236572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1237572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1238572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1239572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1240572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1241572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1242572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1243572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1244572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1245572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1246572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1247572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display 1248572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */ 1249572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power) 1250572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1251572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const uint secs = 1; 1252572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1253572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1254572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1255572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1256572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall sleep(secs); 1257572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1258572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1259572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1260572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1261572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1262572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback 1263572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */ 1264572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback) 1265572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1266572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const uint secs = 1; 1267572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1268572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1269572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1270572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1271572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1272572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1273572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall sleep(secs); 1274572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1275572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1276572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1277572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1278572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1279572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1280