Hwc2Test.cpp revision 93dc04fda8de625d780bcd9b3cef15ad7a4932a8
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); 31cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test { 334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic: 344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall virtual void SetUp() 364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hw_module_t const* hwc2Module; 384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module); 404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall ASSERT_GE(err, 0) << "failed to get hwc hardware module: " 414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << strerror(-err); 424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall /* The following method will fail if you have not run 444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * "adb shell stop" */ 454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall err = hwc2_open(hwc2Module, &mHwc2Device); 464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall ASSERT_GE(err, 0) << "failed to open hwc hardware module: " 474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << strerror(-err); 48cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 49cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall populateDisplays(); 504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall virtual void TearDown() 534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto itr = mLayers.begin(); itr != mLayers.end();) { 561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display = itr->first; 571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = itr->second; 581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall itr++; 591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Destroys and removes the layer from mLayers */ 601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall destroyLayer(display, layer); 611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall if (mHwc2Device) 644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_close(mHwc2Device); 654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 67a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall void registerCallback(hwc2_callback_descriptor_t descriptor, 68a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer, 69a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t* outErr = nullptr) 70a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall { 71a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>( 72a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall getFunction(HWC2_FUNCTION_REGISTER_CALLBACK)); 73a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 74a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 75a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor, 76a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall callbackData, pointer)); 77a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall if (outErr) { 78a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall *outErr = err; 79a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } else { 80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback"; 81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 84cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType, 85cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t* outErr = nullptr) 86cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 87cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>( 88cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE)); 89cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 90cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 91cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 92cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<int32_t*>(outType))); 93cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (outErr) { 94cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outErr = err; 95cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } else { 96cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type"; 97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* If the populateDisplays function is still receiving displays and the 101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is connected, the display handle is stored in mDisplays. */ 102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void hotplugCallback(hwc2_display_t display, int32_t connected) 103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving) 107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (connected == HWC2_CONNECTION_CONNECTED) 110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mDisplays.insert(display); 111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugCv.notify_all(); 113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer, 1161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t* outErr = nullptr) 1171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 1181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>( 1191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall getFunction(HWC2_FUNCTION_CREATE_LAYER)); 1201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 1211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 1231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall outLayer)); 1241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NONE) 1261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall mLayers.insert(std::make_pair(display, *outLayer)); 1271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (outErr) { 1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outErr = err; 1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } else { 1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayer(hwc2_display_t display, hwc2_layer_t layer, 1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t* outErr = nullptr) 1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>( 1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall getFunction(HWC2_FUNCTION_DESTROY_LAYER)); 1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer)); 1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NONE) 1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall mLayers.erase(std::make_pair(display, layer)); 1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (outErr) { 1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outErr = err; 1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } else { 1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer " 1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall << layer; 1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config, 156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_attribute_t attribute, int32_t* outValue, 157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t* outErr = nullptr) 158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>( 160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE)); 161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config, 164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, outValue)); 165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (outErr) { 167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outErr = err; 168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } else { 169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute " 170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " << config; 171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getDisplayConfigs(hwc2_display_t display, 175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t>* outConfigs, 176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t* outErr = nullptr) 177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>( 179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS)); 180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall uint32_t numConfigs = 0; 183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &numConfigs, nullptr)); 186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (err == HWC2_ERROR_NONE) { 188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall outConfigs->resize(numConfigs); 189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &numConfigs, outConfigs->data())); 192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (outErr) { 195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outErr = err; 196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } else { 197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for" 198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " display " << display; 199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 20293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig, 20393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t* outErr = nullptr) 20493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall { 20593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>( 20693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG)); 20793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 20893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 20993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 21093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall outConfig)); 21193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (outErr) { 21293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall *outErr = err; 21393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 21493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on" 21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall " display " << display; 21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall void setActiveConfig(hwc2_display_t display, hwc2_config_t config, 22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t* outErr = nullptr) 22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall { 22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>( 22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG)); 22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config)); 22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (outErr) { 22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall *outErr = err; 22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config " 23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall << config; 23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 2354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected: 2364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor) 2374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 2384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall return mHwc2Device->getFunction(mHwc2Device, descriptor); 2394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 2404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities) 2424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 2434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall uint32_t num = 0; 2444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr); 2464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall outCapabilities->resize(num); 2484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, 2504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall reinterpret_cast<int32_t*>(outCapabilities->data())); 2514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 2524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 253cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers a hotplug callback and waits for hotplug callbacks. This 254cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * function will have no effect if called more than once. */ 255cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void populateDisplays() 256cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 257cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to receiving */ 258cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 259cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 260cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 261cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Init) 262cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 263cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Receiving; 264cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 265cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 266cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers the callback. This function call cannot be locked because 267cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * a callback could happen on the same thread */ 268cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this, 269cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<hwc2_function_pointer_t>( 270cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2TestHotplugCallback))); 271cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 272cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Waits for hotplug events. If a hotplug event has not come within 1 273cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * second, stop waiting. */ 274cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unique_lock<std::mutex> lock(mHotplugMutex); 275cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 276cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) != 277cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::cv_status::timeout) { } 278cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 279cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to done. Future calls will have no effect */ 280cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Done; 281cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 282cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 283cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getBadDisplay(hwc2_display_t* outDisplay) 284cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 285cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (hwc2_display_t display = 0; display < UINT64_MAX; display++) { 286cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mDisplays.count(display) == 0) { 287cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outDisplay = display; 288cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 289cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 290cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 291cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays" 292cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " are registered. This should never happen."; 293cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 294cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 2951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* NOTE: will create min(newlayerCnt, max supported layers) layers */ 2961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayers(hwc2_display_t display, 2971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt) 2981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 2991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> newLayers; 3001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 3011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 3021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (size_t i = 0; i < newLayerCnt; i++) { 3041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 3061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NO_RESOURCES) 3071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall break; 3081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err != HWC2_ERROR_NONE) { 3091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.clear(); 3101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 3111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.push_back(layer); 3131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outLayers = std::move(newLayers); 3161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayers(hwc2_display_t display, 3191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>&& layers) 3201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 3211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (hwc2_layer_t layer : layers) { 3221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 3231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 3251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 326cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig) 327cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 328cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 329cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 330cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 331cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 332cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t CONFIG_MAX = UINT32_MAX; 333cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 334cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value" 335cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " (2^32 values) has been taken which shouldn't happen"; 336cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 337cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 338cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (config = 0; config < CONFIG_MAX; config++) { 339cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (std::count(configs.begin(), configs.end(), config) == 0) 340cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall break; 341cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 342cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 343cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outConfig = config; 344cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 345cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 3464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_device_t* mHwc2Device = nullptr; 347cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 348cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall enum class Hwc2TestHotplugStatus { 349cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Init = 1, 350cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Receiving, 351cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Done, 352cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall }; 353cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 354cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::mutex mHotplugMutex; 355cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::condition_variable mHotplugCv; 356cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init; 357cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unordered_set<hwc2_display_t> mDisplays; 3581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Store all created layers that have not been destroyed. If an ASSERT_* 3601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * fails, then destroy the layers on exit */ 3611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers; 3624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}; 3634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 364cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, 365cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display, int32_t connection) 366cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 367cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (callbackData) 368cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display, 369cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall connection); 370cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 371cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 3724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{ 3744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES, 3754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_LAYER, 3764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY, 3774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_LAYER, 3784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY, 3794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DUMP, 3804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_ACTIVE_CONFIG, 3814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES, 3824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT, 3834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_COLOR_MODES, 3844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE, 3854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_CONFIGS, 3864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_NAME, 3874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_REQUESTS, 3884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_TYPE, 3894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DOZE_SUPPORT, 3904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_HDR_CAPABILITIES, 3914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT, 3924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_RELEASE_FENCES, 3934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_PRESENT_DISPLAY, 3944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_REGISTER_CALLBACK, 3954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_ACTIVE_CONFIG, 3964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CLIENT_TARGET, 3974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_MODE, 3984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_TRANSFORM, 3994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CURSOR_POSITION, 4004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BLEND_MODE, 4014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BUFFER, 4024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COLOR, 4034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE, 4044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DATASPACE, 4054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME, 4064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA, 4074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SOURCE_CROP, 4084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE, 4094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_TRANSFORM, 4104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION, 4114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_Z_ORDER, 4124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_OUTPUT_BUFFER, 4134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_POWER_MODE, 4144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_VSYNC_ENABLED, 4154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_VALIDATE_DISPLAY, 4164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}}; 4174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */ 4194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION) 4204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 4214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall for (hwc2_function_descriptor_t descriptor : requiredFunctions) { 4224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(descriptor); 4234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_TRUE(pfn) << "failed to get function " 4244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << getFunctionDescriptorName(descriptor); 4254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 4264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 4274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */ 4294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function) 4304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 4314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID); 4324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_FALSE(pfn) << "failed to get invalid function"; 4334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 4344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */ 4364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES) 4374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 4384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall std::vector<hwc2_capability_t> capabilities; 4394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall getCapabilities(&capabilities); 4414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(), 4434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_CAPABILITY_INVALID), 0); 4444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 445a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 446a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{ 447a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_HOTPLUG, 448a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_REFRESH, 449a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_VSYNC, 450a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}}; 451a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 452a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required 453a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */ 454a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK) 455a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 456a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 457a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 458a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 459a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 460a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 461a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 462a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 463a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 464a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 465a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */ 466a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter) 467a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 468a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 469a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 470a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 471a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 472a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data, 473a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; }, &err)); 474a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code"; 475a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 476a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 477a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */ 478a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data) 479a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 480a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = nullptr; 481a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 482a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 483a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 484a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 485a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 486a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 487cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 488cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each 489cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */ 490cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE) 491cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 492cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (auto display : mDisplays) { 493cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 494cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 495cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type)); 496cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return" 497cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " correct display type"; 498cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 499cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 500cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 501cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad 502cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */ 503cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display) 504cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 505cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display; 506cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 507cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 508cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 509cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 510cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 511cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err)); 512cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 513cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 5141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */ 5161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER) 5171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 5201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */ 5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display) 5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display; 5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 5371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 5381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources 5411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */ 5421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources) 5431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall const size_t layerCnt = 1000; 5451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> layers; 5481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt)); 5501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers))); 5521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */ 5561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display) 5571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t badDisplay; 5591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay)); 5611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = 0; 5641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 5671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 5681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 5701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 5721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 5731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 5751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */ 5791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer) 5801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 5831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err)); 5861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err)); 5891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err)); 5921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err)); 5951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err)); 5981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 6011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err)); 6031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 6041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 6061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err)); 6081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 6091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 6101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 611cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 612cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{ 613cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_WIDTH, 614cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_HEIGHT, 615cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 616cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 617cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{ 618cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_VSYNC_PERIOD, 619cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_X, 620cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_Y, 621cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 622cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 623cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid 624cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */ 625cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE) 626cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 627cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 628cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 629cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 630cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 631cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 632cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 633cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 634cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 635cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 636cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 637cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 638cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_GE(value, 0) << "missing required attribute " 639cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " 640cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << config; 641cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 642cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 643cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 644cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 645cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 646cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 647cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 648cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 649cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 650cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid 651cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */ 652cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute) 653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID; 655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 656cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 657cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 658cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 659cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 660cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 661cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 662cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 663cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 664cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 665cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 666cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 667cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(value, -1) << "failed to return -1 for an invalid" 668cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " attribute for config " << config; 669cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 670cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 671cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 672cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 673cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */ 674cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display) 675cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 676cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 677cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_config_t config = 0; 678cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 679cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 680cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 681cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 682cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 683cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 684cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 685cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 686cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 687cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 688cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 689cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 690cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 691cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 692cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 693cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 694cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 695cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 696cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */ 697cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config) 698cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 699cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 700cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 701cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 702cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 703cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 704cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 705cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 706cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 707cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 708cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 709cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 710cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 711cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 712cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 713cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 714cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 715cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 716cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 717cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 718cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 719cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 720cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */ 721cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS) 722cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 723cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 724cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 725cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 726cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 727cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 728cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 729cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 730cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */ 731cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display) 732cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 733cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 734cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 735cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 736cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 737cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 738cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 739cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err)); 740cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 741cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 742cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(configs.empty()) << "returned configs for bad display"; 743cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 744cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 745cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple 746cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */ 747cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same) 748cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 749cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 750cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs1, configs2; 751cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 752cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1)); 753cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2)); 754cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 755cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(), 756cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs2.begin())) << "returned two different config sets"; 757cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 758cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 759cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 760cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */ 761cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate) 762cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 763cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 764cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 765cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 766cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 767cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 768cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::unordered_set<hwc2_config_t> configsSet(configs.begin(), 769cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs.end()); 770cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate" 771cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " configs"; 772cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 773cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 77493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 77593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */ 77693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG) 77793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 77893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 77993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 78093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 78193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 78293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 78393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto config : configs) { 78493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 78593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 78693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 78793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig)); 78893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 78993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(activeConfig, config) << "failed to get active config"; 79093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 79193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 79293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 79393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 79493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad 79593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */ 79693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display) 79793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 79893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_display_t display; 79993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 80093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 80193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 80293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 80393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 80493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err)); 80593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 80693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 80793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 80893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 80993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config 81093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */ 81193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config) 81293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 81393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 81493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 81593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 81693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 81793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 81893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 81993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 82093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (configs.empty()) 82193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall return; 82293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 82393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err)); 82493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (err == HWC2_ERROR_NONE) { 82593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_NE(std::count(configs.begin(), configs.end(), 82693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall activeConfig), 0) << "active config is not found in " 82793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall " configs for display"; 82893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 82993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 83093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 83193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 83293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 83393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 83493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active 83593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */ 83693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG) 83793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 83893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 83993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 84093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 84193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 84293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 84393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto config : configs) { 84493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 84593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 84693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 84793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 84893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 84993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */ 85093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display) 85193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 85293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_display_t display; 85393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall const hwc2_config_t config = 0; 85493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 85593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 85693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 85793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 85893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err)); 85993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 86093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 86193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 86293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */ 86393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config) 86493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 86593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 86693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t config; 86793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 86893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 86993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 87093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 87193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err)); 87293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 87393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 87493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 875