Hwc2Test.cpp revision cf935cbfa66ec65a71485e91e63a5929dc2922a1
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 2024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected: 2034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor) 2044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 2054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall return mHwc2Device->getFunction(mHwc2Device, descriptor); 2064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 2074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities) 2094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 2104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall uint32_t num = 0; 2114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr); 2134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall outCapabilities->resize(num); 2154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 2164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, 2174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall reinterpret_cast<int32_t*>(outCapabilities->data())); 2184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 2194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 220cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers a hotplug callback and waits for hotplug callbacks. This 221cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * function will have no effect if called more than once. */ 222cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void populateDisplays() 223cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 224cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to receiving */ 225cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 226cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 227cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 228cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Init) 229cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 230cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Receiving; 231cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 232cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 233cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers the callback. This function call cannot be locked because 234cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * a callback could happen on the same thread */ 235cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this, 236cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<hwc2_function_pointer_t>( 237cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2TestHotplugCallback))); 238cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 239cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Waits for hotplug events. If a hotplug event has not come within 1 240cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * second, stop waiting. */ 241cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unique_lock<std::mutex> lock(mHotplugMutex); 242cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 243cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) != 244cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::cv_status::timeout) { } 245cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 246cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to done. Future calls will have no effect */ 247cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Done; 248cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 249cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 250cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getBadDisplay(hwc2_display_t* outDisplay) 251cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 252cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (hwc2_display_t display = 0; display < UINT64_MAX; display++) { 253cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mDisplays.count(display) == 0) { 254cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outDisplay = display; 255cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 256cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 257cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 258cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays" 259cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " are registered. This should never happen."; 260cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 261cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 2621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* NOTE: will create min(newlayerCnt, max supported layers) layers */ 2631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayers(hwc2_display_t display, 2641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt) 2651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 2661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> newLayers; 2671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 2681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 2691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 2701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (size_t i = 0; i < newLayerCnt; i++) { 2711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 2721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 2731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NO_RESOURCES) 2741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall break; 2751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err != HWC2_ERROR_NONE) { 2761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.clear(); 2771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 2781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 2791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.push_back(layer); 2801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 2811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 2821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outLayers = std::move(newLayers); 2831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 2841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 2851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayers(hwc2_display_t display, 2861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>&& layers) 2871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 2881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (hwc2_layer_t layer : layers) { 2891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 2901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 2911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 2921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 293cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig) 294cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 295cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 296cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 297cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 298cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 299cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t CONFIG_MAX = UINT32_MAX; 300cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 301cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value" 302cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " (2^32 values) has been taken which shouldn't happen"; 303cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 304cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 305cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (config = 0; config < CONFIG_MAX; config++) { 306cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (std::count(configs.begin(), configs.end(), config) == 0) 307cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall break; 308cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 309cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 310cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outConfig = config; 311cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 312cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 3134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_device_t* mHwc2Device = nullptr; 314cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 315cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall enum class Hwc2TestHotplugStatus { 316cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Init = 1, 317cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Receiving, 318cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Done, 319cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall }; 320cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 321cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::mutex mHotplugMutex; 322cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::condition_variable mHotplugCv; 323cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init; 324cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unordered_set<hwc2_display_t> mDisplays; 3251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 3261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Store all created layers that have not been destroyed. If an ASSERT_* 3271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * fails, then destroy the layers on exit */ 3281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers; 3294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}; 3304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 331cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, 332cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display, int32_t connection) 333cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 334cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (callbackData) 335cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display, 336cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall connection); 337cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 338cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 3394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{ 3414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES, 3424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_LAYER, 3434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY, 3444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_LAYER, 3454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY, 3464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DUMP, 3474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_ACTIVE_CONFIG, 3484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES, 3494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT, 3504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_COLOR_MODES, 3514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE, 3524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_CONFIGS, 3534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_NAME, 3544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_REQUESTS, 3554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_TYPE, 3564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DOZE_SUPPORT, 3574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_HDR_CAPABILITIES, 3584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT, 3594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_RELEASE_FENCES, 3604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_PRESENT_DISPLAY, 3614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_REGISTER_CALLBACK, 3624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_ACTIVE_CONFIG, 3634d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CLIENT_TARGET, 3644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_MODE, 3654d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_TRANSFORM, 3664d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CURSOR_POSITION, 3674d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BLEND_MODE, 3684d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BUFFER, 3694d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COLOR, 3704d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE, 3714d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DATASPACE, 3724d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME, 3734d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA, 3744d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SOURCE_CROP, 3754d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE, 3764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_TRANSFORM, 3774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION, 3784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_Z_ORDER, 3794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_OUTPUT_BUFFER, 3804d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_POWER_MODE, 3814d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_VSYNC_ENABLED, 3824d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_VALIDATE_DISPLAY, 3834d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}}; 3844d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3854d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */ 3864d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION) 3874d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 3884d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall for (hwc2_function_descriptor_t descriptor : requiredFunctions) { 3894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(descriptor); 3904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_TRUE(pfn) << "failed to get function " 3914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << getFunctionDescriptorName(descriptor); 3924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 3934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 3944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 3954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */ 3964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function) 3974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 3984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID); 3994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_FALSE(pfn) << "failed to get invalid function"; 4004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 4014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */ 4034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES) 4044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 4054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall std::vector<hwc2_capability_t> capabilities; 4064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall getCapabilities(&capabilities); 4084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(), 4104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_CAPABILITY_INVALID), 0); 4114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 412a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 413a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{ 414a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_HOTPLUG, 415a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_REFRESH, 416a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_VSYNC, 417a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}}; 418a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 419a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required 420a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */ 421a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK) 422a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 423a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 424a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 425a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 426a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 427a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 428a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 429a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 430a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 431a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 432a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */ 433a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter) 434a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 435a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 436a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 437a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 438a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 439a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data, 440a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; }, &err)); 441a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code"; 442a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 443a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 444a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */ 445a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data) 446a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 447a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = nullptr; 448a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 449a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 450a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 451a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 452a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 453a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 454cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 455cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each 456cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */ 457cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE) 458cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 459cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (auto display : mDisplays) { 460cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 461cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 462cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type)); 463cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return" 464cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " correct display type"; 465cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 466cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 467cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 468cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad 469cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */ 470cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display) 471cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 472cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display; 473cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 474cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 475cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 476cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 477cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 478cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err)); 479cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 4811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 4821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */ 4831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER) 4841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 4851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 4861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 4871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 4881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 4891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 4901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 4911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 4921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 4931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 4941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */ 4951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display) 4961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 4971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display; 4981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 4991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 5021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 5041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 5051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources 5081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */ 5091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources) 5101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall const size_t layerCnt = 1000; 5121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> layers; 5151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt)); 5171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers))); 5191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */ 5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display) 5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t badDisplay; 5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay)); 5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = 0; 5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 5371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 5391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 5401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 5421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 5441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */ 5461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer) 5471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 5481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 5491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 5501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err)); 5531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err)); 5561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err)); 5591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err)); 5621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err)); 5651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 5681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err)); 5701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 5731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err)); 5751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 5761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 578cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 579cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{ 580cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_WIDTH, 581cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_HEIGHT, 582cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 583cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 584cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{ 585cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_VSYNC_PERIOD, 586cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_X, 587cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_Y, 588cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 589cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 590cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid 591cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */ 592cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE) 593cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 594cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 595cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 596cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 597cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 598cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 599cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 600cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 601cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 602cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 603cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 604cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 605cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_GE(value, 0) << "missing required attribute " 606cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " 607cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << config; 608cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 609cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 610cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 611cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 612cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 613cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 614cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 615cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 616cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 617cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid 618cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */ 619cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute) 620cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 621cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID; 622cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 623cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 624cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 625cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 626cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 627cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 628cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 629cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 630cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 631cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 632cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 633cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 634cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(value, -1) << "failed to return -1 for an invalid" 635cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " attribute for config " << config; 636cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 637cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 638cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 639cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 640cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */ 641cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display) 642cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 643cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 644cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_config_t config = 0; 645cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 646cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 647cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 648cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 649cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 650cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 651cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 652cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 653cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 654cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 655cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 656cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 657cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 658cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 659cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 660cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 661cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 662cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 663cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */ 664cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config) 665cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 666cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 667cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 668cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 669cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 670cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 671cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 672cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 673cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 674cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 675cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 676cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 677cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 678cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 679cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 680cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 681cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 682cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 683cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 684cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 685cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 686cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 687cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */ 688cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS) 689cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 690cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 691cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 692cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 693cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 694cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 695cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 696cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 697cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */ 698cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display) 699cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 700cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 701cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 702cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 703cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 704cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 705cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 706cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err)); 707cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 708cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 709cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(configs.empty()) << "returned configs for bad display"; 710cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 711cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 712cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple 713cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */ 714cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same) 715cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 716cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 717cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs1, configs2; 718cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 719cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1)); 720cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2)); 721cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 722cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(), 723cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs2.begin())) << "returned two different config sets"; 724cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 725cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 726cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 727cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */ 728cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate) 729cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 730cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 731cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 732cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 733cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 734cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 735cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::unordered_set<hwc2_config_t> configsSet(configs.begin(), 736cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs.end()); 737cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate" 738cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " configs"; 739cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 740cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 741