Hwc2Test.cpp revision 273b1dfa05287a0016ae1fc230cd3a5b1b7433fa
14d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* 24d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Copyright (C) 2016 The Android Open Source Project 34d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * 44d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License"); 54d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * you may not use this file except in compliance with the License. 64d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * You may obtain a copy of the License at 74d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * 84d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * http://www.apache.org/licenses/LICENSE-2.0 94d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * 104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * Unless required by applicable law or agreed to in writing, software 114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS, 124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * See the License for the specific language governing permissions and 144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * limitations under the License. 154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall */ 164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <array> 18cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall#include <unordered_set> 194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <gtest/gtest.h> 204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <dlfcn.h> 214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hardware.h> 224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_INCLUDE_STRINGIFICATION 244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#define HWC2_USE_CPP11 254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#include <hardware/hwcomposer2.h> 264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_INCLUDE_STRINGIFICATION 274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall#undef HWC2_USE_CPP11 284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestLayer.h" 30273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall#include "Hwc2TestLayers.h" 316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 32cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, 33cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display, int32_t connected); 34572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData, 35572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t display, int64_t timestamp); 36cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallclass Hwc2Test : public testing::Test { 384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallpublic: 394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall virtual void SetUp() 414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hw_module_t const* hwc2Module; 434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &hwc2Module); 454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall ASSERT_GE(err, 0) << "failed to get hwc hardware module: " 464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << strerror(-err); 474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall /* The following method will fail if you have not run 494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall * "adb shell stop" */ 504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall err = hwc2_open(hwc2Module, &mHwc2Device); 514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall ASSERT_GE(err, 0) << "failed to open hwc hardware module: " 524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << strerror(-err); 53cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 54cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall populateDisplays(); 554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall virtual void TearDown() 584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto itr = mLayers.begin(); itr != mLayers.end();) { 611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display = itr->first; 621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = itr->second; 631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall itr++; 641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Destroys and removes the layer from mLayers */ 651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall destroyLayer(display, layer); 661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 6803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto itr = mActiveDisplays.begin(); itr != mActiveDisplays.end();) { 6903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_display_t display = *itr; 7003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall itr++; 7103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall /* Sets power mode to off and removes the display from 7203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * mActiveDisplays */ 7303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall setPowerMode(display, HWC2_POWER_MODE_OFF); 7403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 7503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 764d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall if (mHwc2Device) 774d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_close(mHwc2Device); 784d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 794d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 80a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall void registerCallback(hwc2_callback_descriptor_t descriptor, 81a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer, 82a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t* outErr = nullptr) 83a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall { 84a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_REGISTER_CALLBACK>( 85a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall getFunction(HWC2_FUNCTION_REGISTER_CALLBACK)); 86a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 87a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 88a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, descriptor, 89a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall callbackData, pointer)); 90a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall if (outErr) { 91a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall *outErr = err; 92a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } else { 93a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to register callback"; 94a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 95a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 96a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 97cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getDisplayType(hwc2_display_t display, hwc2_display_type_t* outType, 98cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t* outErr = nullptr) 99cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 100cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_TYPE>( 101cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_TYPE)); 102cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 103cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 104cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 105cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<int32_t*>(outType))); 106cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (outErr) { 107cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outErr = err; 108cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } else { 109cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display type"; 110cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 111cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 112cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 113cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* If the populateDisplays function is still receiving displays and the 114cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is connected, the display handle is stored in mDisplays. */ 115cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void hotplugCallback(hwc2_display_t display, int32_t connected) 116cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 117cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 118cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 119cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Receiving) 120cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 121cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 122cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (connected == HWC2_CONNECTION_CONNECTED) 123cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mDisplays.insert(display); 124cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 125cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugCv.notify_all(); 126cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 127cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayer(hwc2_display_t display, hwc2_layer_t* outLayer, 1291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t* outErr = nullptr) 1301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 1311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_CREATE_LAYER>( 1321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall getFunction(HWC2_FUNCTION_CREATE_LAYER)); 1331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 1341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 1361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall outLayer)); 1371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NONE) 1391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall mLayers.insert(std::make_pair(display, *outLayer)); 1401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (outErr) { 1421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outErr = err; 1431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } else { 1441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 1451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayer(hwc2_display_t display, hwc2_layer_t layer, 1491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t* outErr = nullptr) 1501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 1511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_DESTROY_LAYER>( 1521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall getFunction(HWC2_FUNCTION_DESTROY_LAYER)); 1531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 1541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer)); 1561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NONE) 1581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall mLayers.erase(std::make_pair(display, layer)); 1591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 1601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (outErr) { 1611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outErr = err; 1621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } else { 1631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to destroy layer " 1641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall << layer; 1651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 1671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getDisplayAttribute(hwc2_display_t display, hwc2_config_t config, 169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_attribute_t attribute, int32_t* outValue, 170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t* outErr = nullptr) 171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>( 173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE)); 174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config, 177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, outValue)); 178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (outErr) { 180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outErr = err; 181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } else { 182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display attribute " 183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " << config; 184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getDisplayConfigs(hwc2_display_t display, 188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t>* outConfigs, 189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t* outErr = nullptr) 190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_CONFIGS>( 192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_CONFIGS)); 193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall uint32_t numConfigs = 0; 196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &numConfigs, nullptr)); 199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (err == HWC2_ERROR_NONE) { 201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall outConfigs->resize(numConfigs); 202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &numConfigs, outConfigs->data())); 205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (outErr) { 208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outErr = err; 209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } else { 210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get configs for" 211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " display " << display; 212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 21593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall void getActiveConfig(hwc2_display_t display, hwc2_config_t* outConfig, 21693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t* outErr = nullptr) 21793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall { 21893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_ACTIVE_CONFIG>( 21993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall getFunction(HWC2_FUNCTION_GET_ACTIVE_CONFIG)); 22093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 22193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 22293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 22393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall outConfig)); 22493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (outErr) { 22593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall *outErr = err; 22693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 22793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get active config on" 22893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall " display " << display; 22993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 23093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 23193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 23293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall void setActiveConfig(hwc2_display_t display, hwc2_config_t config, 23393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t* outErr = nullptr) 23493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall { 23593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_ACTIVE_CONFIG>( 23693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall getFunction(HWC2_FUNCTION_SET_ACTIVE_CONFIG)); 23793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 23893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 23993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, config)); 24093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (outErr) { 24193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall *outErr = err; 24293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 24393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set active config " 24493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall << config; 24593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 24693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 24793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 24803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall void getDozeSupport(hwc2_display_t display, int32_t* outSupport, 24903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t* outErr = nullptr) 25003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall { 25103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DOZE_SUPPORT>( 25203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall getFunction(HWC2_FUNCTION_GET_DOZE_SUPPORT)); 25303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 25403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 25503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 25603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall outSupport)); 25703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (outErr) { 25803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall *outErr = err; 25903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } else { 26003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get doze support on" 26103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall " display " << display; 26203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 26303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 26403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 26503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall void setPowerMode(hwc2_display_t display, hwc2_power_mode_t mode, 26603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t* outErr = nullptr) 26703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall { 26803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_POWER_MODE>( 26903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall getFunction(HWC2_FUNCTION_SET_POWER_MODE)); 27003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 27103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 27203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 27303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall mode)); 27403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (outErr) { 27503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall *outErr = err; 27603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (err != HWC2_ERROR_NONE) 27703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 27803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } else { 27903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set power mode " 28003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall << getPowerModeName(mode) << " on display " << display; 28103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 28203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 28303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (mode == HWC2_POWER_MODE_OFF) { 28403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall mActiveDisplays.erase(display); 28503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } else { 28603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall mActiveDisplays.insert(display); 28703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 28803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 28903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 290572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void setVsyncEnabled(hwc2_display_t display, hwc2_vsync_t enabled, 291572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_error_t* outErr = nullptr) 292572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 293572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_VSYNC_ENABLED>( 294572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall getFunction(HWC2_FUNCTION_SET_VSYNC_ENABLED)); 295572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 296572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 297572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 298572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall enabled)); 299572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (outErr) { 300572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall *outErr = err; 301572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } else { 302572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set vsync enabled " 303572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall << getVsyncName(enabled); 304572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 305572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 306572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 307572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void vsyncCallback(hwc2_display_t display, int64_t timestamp) 308572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 309572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::lock_guard<std::mutex> lock(mVsyncMutex); 310572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall mVsyncDisplay = display; 311572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall mVsyncTimestamp = timestamp; 312572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall mVsyncCv.notify_all(); 313572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 314572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 315dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall void getDisplayName(hwc2_display_t display, std::string* outName, 316dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall hwc2_error_t* outErr = nullptr) 317dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall { 318dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_GET_DISPLAY_NAME>( 319dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall getFunction(HWC2_FUNCTION_GET_DISPLAY_NAME)); 320dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 321dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 322dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall uint32_t size = 0; 323dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 324dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size, 325dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall nullptr)); 326dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 327dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall if (err == HWC2_ERROR_NONE) { 328dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall std::vector<char> name(size); 329dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 330dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, &size, 331dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall name.data())); 332dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 333dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall outName->assign(name.data()); 334dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall } 335dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 336dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall if (outErr) { 337dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall *outErr = err; 338dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall } else { 339dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to get display name for " 340dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall << display; 341dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall } 342dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall } 343dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 3446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall void setLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer, 3456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_composition_t composition, hwc2_error_t* outErr = nullptr) 3466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall { 3476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>( 3486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall getFunction(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE)); 3496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 3506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 3516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, 3526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall composition)); 3536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall if (outErr) { 3546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall *outErr = err; 3556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } else { 3566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer composition" 3576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall " type " << getCompositionName(composition); 3586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 3596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 3606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 361ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall void setLayerBlendMode(hwc2_display_t display, hwc2_layer_t layer, 362ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall hwc2_blend_mode_t mode, hwc2_error_t* outErr = nullptr) 363ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall { 364ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_BLEND_MODE>( 365ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall getFunction(HWC2_FUNCTION_SET_LAYER_BLEND_MODE)); 366ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 367ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 368ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, 369ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall mode)); 370ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall if (outErr) { 371ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall *outErr = err; 372ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall } else { 373ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer blend mode " 374ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall << getBlendModeName(mode); 375ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall } 376ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall } 377ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 378b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall void setLayerDataspace(hwc2_display_t display, hwc2_layer_t layer, 379b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall android_dataspace_t dataspace, hwc2_error_t* outErr = nullptr) 380b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall { 381b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_DATASPACE>( 382b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall getFunction(HWC2_FUNCTION_SET_LAYER_DATASPACE)); 383b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 384b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 385b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, 386b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall layer, dataspace)); 387b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall if (outErr) { 388b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall *outErr = err; 389b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall } else { 390b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer dataspace"; 391b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall } 392b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall } 393b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 3942b1f53060ea8587a428f826cf7890354ff124722Marissa Wall void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer, 3952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall float alpha, hwc2_error_t* outErr = nullptr) 3962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall { 3972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_PLANE_ALPHA>( 3982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall getFunction(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA)); 3992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 4002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 4012b1f53060ea8587a428f826cf7890354ff124722Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, 4022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall alpha)); 4032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall if (outErr) { 4042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall *outErr = err; 4052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall } else { 4062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer plane alpha " 4072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall << alpha; 4082b1f53060ea8587a428f826cf7890354ff124722Marissa Wall } 4092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall } 4102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 411ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall void setLayerTransform(hwc2_display_t display, hwc2_layer_t layer, 412ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall hwc_transform_t transform, hwc2_error_t* outErr = nullptr) 413ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall { 414ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_TRANSFORM>( 415ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall getFunction(HWC2_FUNCTION_SET_LAYER_TRANSFORM)); 416ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 417ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 418ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, 419ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall transform)); 420ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall if (outErr) { 421ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall *outErr = err; 422ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall } else { 423ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer transform " 424ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall << getTransformName(transform); 425ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall } 426ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall } 427ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 428273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall void setLayerZOrder(hwc2_display_t display, hwc2_layer_t layer, 429273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall uint32_t zOrder, hwc2_error_t* outErr = nullptr) 430273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall { 431273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall auto pfn = reinterpret_cast<HWC2_PFN_SET_LAYER_Z_ORDER>( 432273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall getFunction(HWC2_FUNCTION_SET_LAYER_Z_ORDER)); 433273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_TRUE(pfn) << "failed to get function"; 434273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 435273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall auto err = static_cast<hwc2_error_t>(pfn(mHwc2Device, display, layer, 436273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall zOrder)); 437273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall if (outErr) { 438273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall *outErr = err; 439273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } else { 440273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer z order " 441273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall << zOrder; 442273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 443273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 444273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 4454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallprotected: 4464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t getFunction(hwc2_function_descriptor_t descriptor) 4474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 4484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall return mHwc2Device->getFunction(mHwc2Device, descriptor); 4494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 4504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall void getCapabilities(std::vector<hwc2_capability_t>* outCapabilities) 4524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall { 4534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall uint32_t num = 0; 4544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, nullptr); 4564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall outCapabilities->resize(num); 4584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 4594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall mHwc2Device->getCapabilities(mHwc2Device, &num, 4604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall reinterpret_cast<int32_t*>(outCapabilities->data())); 4614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 4624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 463cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers a hotplug callback and waits for hotplug callbacks. This 464cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * function will have no effect if called more than once. */ 465cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void populateDisplays() 466cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 467cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to receiving */ 468cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 469cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::lock_guard<std::mutex> lock(mHotplugMutex); 470cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 471cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mHotplugStatus != Hwc2TestHotplugStatus::Init) 472cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 473cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Receiving; 474cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 475cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 476cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Registers the callback. This function call cannot be locked because 477cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * a callback could happen on the same thread */ 478cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_HOTPLUG, this, 479cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall reinterpret_cast<hwc2_function_pointer_t>( 480cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2TestHotplugCallback))); 481cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 482cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Waits for hotplug events. If a hotplug event has not come within 1 483cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * second, stop waiting. */ 484cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unique_lock<std::mutex> lock(mHotplugMutex); 485cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 486cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall while (mHotplugCv.wait_for(lock, std::chrono::seconds(1)) != 487cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::cv_status::timeout) { } 488cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 489cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall /* Sets the hotplug status to done. Future calls will have no effect */ 490cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall mHotplugStatus = Hwc2TestHotplugStatus::Done; 491cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 492cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 493cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall void getBadDisplay(hwc2_display_t* outDisplay) 494cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall { 495cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (hwc2_display_t display = 0; display < UINT64_MAX; display++) { 496cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (mDisplays.count(display) == 0) { 497cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall *outDisplay = display; 498cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall return; 499cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 500cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 501cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_TRUE(false) << "Unable to find bad display. UINT64_MAX displays" 502cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " are registered. This should never happen."; 503cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 504cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 5051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* NOTE: will create min(newlayerCnt, max supported layers) layers */ 5061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void createLayers(hwc2_display_t display, 5071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>* outLayers, size_t newLayerCnt) 5081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 5091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> newLayers; 5101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 5111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 5121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (size_t i = 0; i < newLayerCnt; i++) { 5141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 5161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err == HWC2_ERROR_NO_RESOURCES) 5171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall break; 5181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall if (err != HWC2_ERROR_NONE) { 5191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.clear(); 5201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to create layer"; 5211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall newLayers.push_back(layer); 5231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall *outLayers = std::move(newLayers); 5261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 5281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall void destroyLayers(hwc2_display_t display, 5291db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t>&& layers) 5301db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall { 5311db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (hwc2_layer_t layer : layers) { 5321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 5331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 5351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 536cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall void getInvalidConfig(hwc2_display_t display, hwc2_config_t* outConfig) 537cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall { 538cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 539cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 540cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 541cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 542cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t CONFIG_MAX = UINT32_MAX; 543cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 544cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_LE(configs.size() - 1, CONFIG_MAX) << "every config value" 545cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " (2^32 values) has been taken which shouldn't happen"; 546cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 547cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 548cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (config = 0; config < CONFIG_MAX; config++) { 549cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall if (std::count(configs.begin(), configs.end(), config) == 0) 550cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall break; 551cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 552cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 553cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall *outConfig = config; 554cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 555cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 556572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void enableVsync(hwc2_display_t display) 557572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 558572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, this, 559572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall reinterpret_cast<hwc2_function_pointer_t>( 560572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2TestVsyncCallback))); 561572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 562572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 563572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 564572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void disableVsync(hwc2_display_t display) 565572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 566572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 567572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 568572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 569572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall void waitForVsync(hwc2_display_t* outDisplay = nullptr, 570572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall int64_t* outTimestamp = nullptr) 571572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall { 572572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::unique_lock<std::mutex> lock(mVsyncMutex); 573572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_EQ(mVsyncCv.wait_for(lock, std::chrono::seconds(3)), 574572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::cv_status::no_timeout) << "timed out attempting to get" 575572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall " vsync callback"; 576572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (outDisplay) 577572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall *outDisplay = mVsyncDisplay; 578572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (outTimestamp) 579572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall *outTimestamp = mVsyncTimestamp; 580572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 581572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 5826bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* Calls a set property function from Hwc2Test to set a property value from 5836bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * Hwc2TestLayer to hwc2_layer_t on hwc2_display_t */ 5846bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall using TestLayerPropertyFunction = void (*)(Hwc2Test* test, 5856bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_display_t display, hwc2_layer_t layer, 5866bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr); 5876bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 588273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall /* Calls a set property function from Hwc2Test to set property values from 589273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * Hwc2TestLayers to hwc2_layer_t on hwc2_display_t */ 590273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall using TestLayerPropertiesFunction = void (*)(Hwc2Test* test, 591273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall hwc2_display_t display, hwc2_layer_t layer, 592273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall const Hwc2TestLayers& testLayers); 593273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 5946bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* Calls a set property function from Hwc2Test to set a bad property value 5956bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * on hwc2_layer_t on hwc2_display_t */ 5966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall using TestLayerPropertyBadLayerFunction = void (*)(Hwc2Test* test, 5976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_display_t display, hwc2_layer_t layer, 5986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr); 5996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* Calls a set property function from Hwc2Test to set a bad property value 6016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * on hwc2_layer_t on hwc2_display_t */ 6026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall using TestLayerPropertyBadParameterFunction = void (*)(Hwc2Test* test, 6036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_display_t display, hwc2_layer_t layer, hwc2_error_t* outErr); 6046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* Advances a property of Hwc2TestLayer */ 6066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall using AdvanceProperty = bool (*)(Hwc2TestLayer* testLayer); 6076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* For each active display it cycles through each display config and tests 6096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * each property value. It creates a layer, sets the property and then 6106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * destroys the layer */ 6116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall void setLayerProperty(Hwc2TestCoverage coverage, 6126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall TestLayerPropertyFunction function, AdvanceProperty advance) 6136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall { 6146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto display : mDisplays) { 6156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall std::vector<hwc2_config_t> configs; 6166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 6186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto config : configs) { 6206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_layer_t layer; 6216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 6236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall Hwc2TestLayer testLayer(coverage); 6246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall do { 6266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 6276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(function(this, display, layer, 6296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall testLayer, nullptr)); 6306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 6326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } while (advance(&testLayer)); 6336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 6346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 6356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 6366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* For each active display it cycles through each display config and tests 6386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * each property value. It creates a layer, cycles through each property 6396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * value and updates the layer property value and then destroys the layer */ 6406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall void setLayerPropertyUpdate(Hwc2TestCoverage coverage, 6416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall TestLayerPropertyFunction function, AdvanceProperty advance) 6426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall { 6436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto display : mDisplays) { 6446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall std::vector<hwc2_config_t> configs; 6456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 6476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto config : configs) { 6496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_layer_t layer; 6506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 6526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall Hwc2TestLayer testLayer(coverage); 6536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 6556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall do { 6576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(function(this, display, layer, 6586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall testLayer, nullptr)); 6596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } while (advance(&testLayer)); 6606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 6616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 6626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 6636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 6646bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 6656bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 666273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall /* For each active display it cycles through each display config and tests 667273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * each property value. It creates multiple layers, calls the 668273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * TestLayerPropertiesFunction to set property values and then 669273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall * destroys the layers */ 670273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall void setLayerProperties(Hwc2TestCoverage coverage, size_t layerCnt, 671273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall TestLayerPropertiesFunction function) 672273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall { 673273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall for (auto display : mDisplays) { 674273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall std::vector<hwc2_config_t> configs; 675273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 676273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 677273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 678273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall for (auto config : configs) { 679273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall std::vector<hwc2_layer_t> layers; 680273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 681273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 682273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 683273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt)); 684273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall Hwc2TestLayers testLayers(layers, coverage); 685273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 686273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall for (auto layer : layers) { 687273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall EXPECT_NO_FATAL_FAILURE(function(this, display, layer, 688273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall testLayers)); 689273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 690273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 691273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers))); 692273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 693273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 694273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 695273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 6966bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* For each active display it cycles through each display config. 6976bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * 1) It attempts to set a valid property value to bad layer handle. 6986bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * 2) It creates a layer x and attempts to set a valid property value to 6996bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer x + 1 7006bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * 3) It destroys the layer x and attempts to set a valid property value to 7016bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * the destroyed layer x. 7026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall */ 7036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall void setLayerPropertyBadLayer(Hwc2TestCoverage coverage, 7046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall TestLayerPropertyBadLayerFunction function) 7056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall { 7066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto display : mDisplays) { 7076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall std::vector<hwc2_config_t> configs; 7086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 7106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto config : configs) { 7126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_layer_t layer = 0; 7136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 7146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 7166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall Hwc2TestLayer testLayer(coverage); 7176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(function(this, display, layer, 7196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall testLayer, &err)); 7206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 7236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(function(this, display, layer + 1, 7256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall testLayer, &err)); 7266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 7296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(function(this, display, layer, 7316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall testLayer, &err)); 7326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 7336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 7346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 7356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 7366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall /* For each active display it cycles through each display config and tests 7386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * each property value. It creates a layer, sets a bad property value and 7396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * then destroys the layer */ 7406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall void setLayerPropertyBadParameter(TestLayerPropertyBadParameterFunction function) 7416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall { 7426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto display : mDisplays) { 7436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall std::vector<hwc2_config_t> configs; 7446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 7466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall for (auto config : configs) { 7486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_layer_t layer; 7496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 7506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 7526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 7546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(function(this, display, layer, &err)); 7566bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong" 7576bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall " error code"; 7586bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7596bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 7606bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 7616bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 7626bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 7636bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 7644d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_device_t* mHwc2Device = nullptr; 765cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 766cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall enum class Hwc2TestHotplugStatus { 767cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Init = 1, 768cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Receiving, 769cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Done, 770cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall }; 771cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 772cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::mutex mHotplugMutex; 773cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::condition_variable mHotplugCv; 774cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall Hwc2TestHotplugStatus mHotplugStatus = Hwc2TestHotplugStatus::Init; 775cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall std::unordered_set<hwc2_display_t> mDisplays; 7761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 7771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall /* Store all created layers that have not been destroyed. If an ASSERT_* 7781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * fails, then destroy the layers on exit */ 7791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::set<std::pair<hwc2_display_t, hwc2_layer_t>> mLayers; 78003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 78103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall /* Store the power mode state. If it is not HWC2_POWER_MODE_OFF when 78203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * tearing down the test cases, change it to HWC2_POWER_MODE_OFF */ 78303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall std::set<hwc2_display_t> mActiveDisplays; 784572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 785572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::mutex mVsyncMutex; 786572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall std::condition_variable mVsyncCv; 787572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t mVsyncDisplay; 788572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall int64_t mVsyncTimestamp = -1; 7894d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}; 7904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 791cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wallvoid hwc2TestHotplugCallback(hwc2_callback_data_t callbackData, 792cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display, int32_t connection) 793cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 794cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall if (callbackData) 795cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall static_cast<Hwc2Test*>(callbackData)->hotplugCallback(display, 796cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall connection); 797cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 798cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 799572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wallvoid hwc2TestVsyncCallback(hwc2_callback_data_t callbackData, 800572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t display, int64_t timestamp) 801572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 802572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall if (callbackData) 803572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall static_cast<Hwc2Test*>(callbackData)->vsyncCallback(display, 804572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall timestamp); 805572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 806572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 807ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallvoid setBlendMode(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 808ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) 809ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{ 810ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer, 811ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall testLayer.getBlendMode(), outErr)); 812ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall} 813ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 8146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallvoid setComposition(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 8156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) 8166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{ 8176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_composition_t composition = testLayer.getComposition(); 8186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 8196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 8206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, layer, 8216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall composition, &err)); 8226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall if (outErr) { 8236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall *outErr = err; 8246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall return; 8256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 8266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 8276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall if (composition != HWC2_COMPOSITION_SIDEBAND) { 8286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall EXPECT_EQ(err, HWC2_ERROR_NONE) << "returned wrong error code"; 8296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } else { 8306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall EXPECT_TRUE(err == HWC2_ERROR_NONE || err == HWC2_ERROR_UNSUPPORTED) 8316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall << "returned wrong error code"; 8326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 8336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall} 8346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 835b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallvoid setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 836b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) 837b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{ 838b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerDataspace(display, layer, 839b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall testLayer.getDataspace(), outErr)); 840b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall} 841b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 8422b1f53060ea8587a428f826cf7890354ff124722Marissa Wallvoid setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 8432b1f53060ea8587a428f826cf7890354ff124722Marissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) 8442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{ 8452b1f53060ea8587a428f826cf7890354ff124722Marissa Wall ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, layer, 8462b1f53060ea8587a428f826cf7890354ff124722Marissa Wall testLayer.getBlendMode())); 8472b1f53060ea8587a428f826cf7890354ff124722Marissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, layer, 8482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall testLayer.getPlaneAlpha(), outErr)); 8492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall} 8502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 851ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallvoid setTransform(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 852ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) 853ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{ 854ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerTransform(display, layer, 855ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall testLayer.getTransform(), outErr)); 856ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall} 857ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 858273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wallvoid setZOrder(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 859273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) 860273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{ 861273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer, 862273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall testLayer.getZOrder(), outErr)); 863273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall} 864273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 865ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallbool advanceBlendMode(Hwc2TestLayer* testLayer) 866ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{ 867ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall return testLayer->advanceBlendMode(); 868ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall} 869ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 8706bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallbool advanceComposition(Hwc2TestLayer* testLayer) 8716bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{ 8726bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall return testLayer->advanceComposition(); 8736bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall} 8746bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 875b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallbool advanceDataspace(Hwc2TestLayer* testLayer) 876b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{ 877b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall return testLayer->advanceDataspace(); 878b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall} 879b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 8802b1f53060ea8587a428f826cf7890354ff124722Marissa Wallbool advancePlaneAlpha(Hwc2TestLayer* testLayer) 8812b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{ 8822b1f53060ea8587a428f826cf7890354ff124722Marissa Wall return testLayer->advancePlaneAlpha(); 8832b1f53060ea8587a428f826cf7890354ff124722Marissa Wall} 8842b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 885ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallbool advanceTransform(Hwc2TestLayer* testLayer) 886ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{ 887ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall return testLayer->advanceTransform(); 888ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall} 889ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 8904d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 8914d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wallstatic const std::array<hwc2_function_descriptor_t, 42> requiredFunctions = {{ 8924d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES, 8934d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_LAYER, 8944d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY, 8954d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_LAYER, 8964d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY, 8974d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_DUMP, 8984d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_ACTIVE_CONFIG, 8994d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES, 9004d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT, 9014d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_COLOR_MODES, 9024d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE, 9034d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_CONFIGS, 9044d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_NAME, 9054d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_REQUESTS, 9064d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DISPLAY_TYPE, 9074d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_DOZE_SUPPORT, 9084d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_HDR_CAPABILITIES, 9094d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT, 9104d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_GET_RELEASE_FENCES, 9114d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_PRESENT_DISPLAY, 9124d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_REGISTER_CALLBACK, 9134d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_ACTIVE_CONFIG, 9144d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CLIENT_TARGET, 9154d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_MODE, 9164d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_COLOR_TRANSFORM, 9174d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_CURSOR_POSITION, 9184d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BLEND_MODE, 9194d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_BUFFER, 9204d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COLOR, 9214d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE, 9224d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DATASPACE, 9234d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME, 9244d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA, 9254d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SOURCE_CROP, 9264d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE, 9274d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_TRANSFORM, 9284d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION, 9294d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_LAYER_Z_ORDER, 9304d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_OUTPUT_BUFFER, 9314d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_POWER_MODE, 9324d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_SET_VSYNC_ENABLED, 9334d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_FUNCTION_VALIDATE_DISPLAY, 9344d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall}}; 9354d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 9364d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 supports all required functions. */ 9374d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION) 9384d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 9394d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall for (hwc2_function_descriptor_t descriptor : requiredFunctions) { 9404d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(descriptor); 9414d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_TRUE(pfn) << "failed to get function " 9424d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall << getFunctionDescriptorName(descriptor); 9434d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall } 9444d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 9454d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 9464d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 fails to retrieve and invalid function. */ 9474d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_FUNCTION_invalid_function) 9484d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 9494d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall hwc2_function_pointer_t pfn = getFunction(HWC2_FUNCTION_INVALID); 9504d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_FALSE(pfn) << "failed to get invalid function"; 9514d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 9524d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 9534d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an invalid capability. */ 9544d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa WallTEST_F(Hwc2Test, GET_CAPABILITIES) 9554d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall{ 9564d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall std::vector<hwc2_capability_t> capabilities; 9574d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 9584d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall getCapabilities(&capabilities); 9594d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall 9604d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall EXPECT_EQ(std::count(capabilities.begin(), capabilities.end(), 9614d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall HWC2_CAPABILITY_INVALID), 0); 9624d600057db0c977e75c5d6e2d5f01fa69d30b364Marissa Wall} 963a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 964a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wallstatic const std::array<hwc2_callback_descriptor_t, 3> callbackDescriptors = {{ 965a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_HOTPLUG, 966a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_REFRESH, 967a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall HWC2_CALLBACK_VSYNC, 968a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall}}; 969a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 970a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can successfully register all required 971a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall * callback functions. */ 972a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK) 973a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 974a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 975a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 976a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 977a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 978a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 979a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 980a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 981a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 982a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 983a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Test that the HWC2 fails to register invalid callbacks. */ 984a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_bad_parameter) 985a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 986a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 987a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall const_cast<char*>("data")); 988a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 989a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 990a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_INVALID, data, 991a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; }, &err)); 992a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code"; 993a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 994a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 995a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall/* TESTCASE: Tests that the HWC2 can register a callback with null data. */ 996a4b01488e852c0c16df89d04914e6f060dd862e3Marissa WallTEST_F(Hwc2Test, REGISTER_CALLBACK_null_data) 997a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall{ 998a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall hwc2_callback_data_t data = nullptr; 999a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall 1000a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall for (auto descriptor : callbackDescriptors) { 1001a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(descriptor, data, 1002a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall []() { return; })); 1003a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall } 1004a4b01488e852c0c16df89d04914e6f060dd862e3Marissa Wall} 1005cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1006cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns the correct display type for each 1007cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * physical display. */ 1008cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE) 1009cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 1010cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall for (auto display : mDisplays) { 1011cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 1012cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1013cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type)); 1014cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(type, HWC2_DISPLAY_TYPE_PHYSICAL) << "failed to return" 1015cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall " correct display type"; 1016cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall } 1017cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 1018cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1019cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall/* TESTCASE: Tests that the HWC2 returns an error when the display type of a bad 1020cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall * display is requested. */ 1021cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_TYPE_bad_display) 1022cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall{ 1023cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_t display; 1024cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_display_type_t type; 1025cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1026cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1027cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 1028cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall 1029cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayType(display, &type, &err)); 1030cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1031cfb9a07ff9bcc36afc08cef5874344aec03f18faMarissa Wall} 10321db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10331db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 can create and destroy layers. */ 10341db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_DESTROY_LAYER) 10351db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 10361db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 10371db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 10381db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10391db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 10401db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10411db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 10421db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 10431db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 10441db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10451db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot create a layer for a bad display */ 10461db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_bad_display) 10471db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 10481db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t display; 10491db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 10501db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 10511db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10521db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 10531db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10541db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer, &err)); 10551db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 10561db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 10571db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10581db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 will either support a large number of resources 10591db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall * or will return no resources. */ 10601db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, CREATE_LAYER_no_resources) 10611db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 10621db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall const size_t layerCnt = 1000; 10631db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10641db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 10651db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall std::vector<hwc2_layer_t> layers; 10661db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10671db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt)); 10681db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10691db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayers(display, std::move(layers))); 10701db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 10711db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 10721db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10731db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destroy a layer for a bad display */ 10741db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_display) 10751db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 10761db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_display_t badDisplay; 10771db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10781db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&badDisplay)); 10791db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10801db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 10811db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer = 0; 10821db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 10831db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10841db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 10851db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 10861db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10871db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 10881db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10891db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(badDisplay, layer, &err)); 10901db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 10911db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10921db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 10931db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 10941db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 10951db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 10961db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot destory a bad layer */ 10971db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa WallTEST_F(Hwc2Test, DESTROY_LAYER_bad_layer) 10981db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall{ 10991db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall for (auto display : mDisplays) { 11001db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_layer_t layer; 11011db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 11021db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11031db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX / 2, &err)); 11041db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11051db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11061db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 0, &err)); 11071db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11081db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11091db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX - 1, &err)); 11101db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11111db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11121db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, 1, &err)); 11131db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11141db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11151db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, UINT64_MAX, &err)); 11161db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11171db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11181db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 11191db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11201db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer + 1, &err)); 11211db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11221db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11231db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 11241db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall 11251db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer, &err)); 11261db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_LAYER) << "returned wrong error code"; 11271db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall } 11281db2e37295cd89946ec5280c1db2dc11bba45ee2Marissa Wall} 1129cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1130cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 2> requiredAttributes = {{ 1131cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_WIDTH, 1132cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_HEIGHT, 1133cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 1134cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1135cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wallstatic const std::array<hwc2_attribute_t, 3> optionalAttributes = {{ 1136cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_VSYNC_PERIOD, 1137cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_X, 1138cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall HWC2_ATTRIBUTE_DPI_Y, 1139cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall}}; 1140cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1141cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 can return display attributes for a valid 1142cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * config. */ 1143cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE) 1144cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1145cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 1146cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 1147cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1148cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 1149cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1150cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 1151cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 1152cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1153cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 1154cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 1155cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 1156cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_GE(value, 0) << "missing required attribute " 1157cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << getAttributeName(attribute) << " for config " 1158cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall << config; 1159cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1160cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 1161cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 1162cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value)); 1163cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1164cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1165cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1166cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1167cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1168cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return a value of -1 for an invalid 1169cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * attribute */ 1170cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_invalid_attribute) 1171cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1172cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_attribute_t attribute = HWC2_ATTRIBUTE_INVALID; 1173cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1174cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 1175cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 1176cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1177cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 1178cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1179cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto config : configs) { 1180cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 1181cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1182cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1183cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 1184cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 1185cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(value, -1) << "failed to return -1 for an invalid" 1186cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " attribute for config " << config; 1187cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1188cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1189cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1190cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1191cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad display */ 1192cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_display) 1193cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1194cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 1195cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall const hwc2_config_t config = 0; 1196cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 1197cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1198cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1199cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 1200cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1201cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 1202cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 1203cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 1204cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1205cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1206cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1207cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 1208cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, attribute, 1209cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall &value, &err)); 1210cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1211cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1212cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1213cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1214cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will fail to get attributes for a bad config */ 1215cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_ATTRIBUTE_bad_config) 1216cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1217cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 1218cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_config_t config; 1219cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall int32_t value; 1220cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1221cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1222cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 1223cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1224cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : requiredAttributes) { 1225cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 1226cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 1227cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 1228cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1229cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1230cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto attribute : optionalAttributes) { 1231cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, 1232cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall attribute, &value, &err)); 1233cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 1234cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1235cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1236cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1237cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1238cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will get display configs for active displays */ 1239cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS) 1240cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1241cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 1242cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 1243cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1244cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 1245cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1246cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1247cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1248cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will not get display configs for bad displays */ 1249cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_bad_display) 1250cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1251cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_display_t display; 1252cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 1253cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1254cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1255cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 1256cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1257cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs, &err)); 1258cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1259cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1260cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(configs.empty()) << "returned configs for bad display"; 1261cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1262cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1263cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 will return the same config list multiple 1264cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall * times in a row. */ 1265cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_same) 1266cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1267cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 1268cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs1, configs2; 1269cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1270cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs1)); 1271cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs2)); 1272cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1273cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_TRUE(std::is_permutation(configs1.begin(), configs1.end(), 1274cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs2.begin())) << "returned two different config sets"; 1275cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1276cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 1277cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1278cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall/* TESTCASE: Tests that the HWC2 does not return duplicate display configs */ 1279cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa WallTEST_F(Hwc2Test, GET_DISPLAY_CONFIGS_duplicate) 1280cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall{ 1281cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall for (auto display : mDisplays) { 1282cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::vector<hwc2_config_t> configs; 1283cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1284cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 1285cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall 1286cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall std::unordered_set<hwc2_config_t> configsSet(configs.begin(), 1287cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall configs.end()); 1288cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall EXPECT_EQ(configs.size(), configsSet.size()) << "returned duplicate" 1289cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall " configs"; 1290cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall } 1291cf935cbfa66ec65a71485e91e63a5929dc2922a1Marissa Wall} 129293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 129393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 returns the active config for a display */ 129493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG) 129593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 129693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 129793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 129893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 129993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 130093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 130193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto config : configs) { 130293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 130393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 130493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 130593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig)); 130693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 130793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(activeConfig, config) << "failed to get active config"; 130893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 130993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 131093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 131193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 131293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 does not return an active config for a bad 131393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * display. */ 131493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_display) 131593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 131693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_display_t display; 131793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 131893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 131993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 132093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 132193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 132293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err)); 132393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 132493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 132593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 132693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 132793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 either begins with a valid active config 132893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * or returns an error when getActiveConfig is called. */ 132993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, GET_ACTIVE_CONFIG_bad_config) 133093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 133193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 133293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 133393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t activeConfig; 133493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 133593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 133693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 133793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 133893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (configs.empty()) 133993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall return; 134093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 134193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &activeConfig, &err)); 134293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall if (err == HWC2_ERROR_NONE) { 134393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_NE(std::count(configs.begin(), configs.end(), 134493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall activeConfig), 0) << "active config is not found in " 134593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall " configs for display"; 134693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } else { 134793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 134893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 134993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 135093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 135193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 135293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 can set every display config as an active 135393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall * config */ 135493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG) 135593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 135693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 135793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall std::vector<hwc2_config_t> configs; 135893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 135993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 136093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 136193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto config : configs) { 136293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 136393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 136493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 136593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 136693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 136793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an active config for a bad display */ 136893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_display) 136993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 137093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_display_t display; 137193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall const hwc2_config_t config = 0; 137293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 137393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 137493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 137593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 137693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err)); 137793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 137893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 137993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 138093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid active config */ 138193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa WallTEST_F(Hwc2Test, SET_ACTIVE_CONFIG_bad_config) 138293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall{ 138393dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall for (auto display : mDisplays) { 138493dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_config_t config; 138593dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 138693dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 138793dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(getInvalidConfig(display, &config)); 138893dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall 138993dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config, &err)); 139093dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_CONFIG) << "returned wrong error code"; 139193dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall } 139293dc04fda8de625d780bcd9b3cef15ad7a4932a8Marissa Wall} 139303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 139403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 returns a valid value for getDozeSupport. */ 139503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT) 139603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 139703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 139803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 139903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 140003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support)); 140103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 140203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_TRUE(support == 0 || support == 1) << "invalid doze support value"; 140303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 140403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 140503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 140603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot get doze support for a bad display. */ 140703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, GET_DOZE_SUPPORT_bad_display) 140803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 140903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_display_t display; 141003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 141103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 141203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 141303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 141403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 141503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err)); 141603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 141703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 141803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 141903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 142003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set all supported power modes */ 142103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE) 142203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 142303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 142403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 142503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 142603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 142703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 142803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support)); 142903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support != 1) 143003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 143103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 143203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE)); 143303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 143403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND)); 143503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 143603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 143703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 143803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 143903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 144003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a power mode for a bad display. */ 144103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_display) 144203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 144303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_display_t display; 144403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 144503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 144603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 144703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 144803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON, &err)); 144903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 145003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 145103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF, &err)); 145203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 145303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 145403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 145503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err)); 145603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support != 1) 145703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 145803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 145903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, &err)); 146003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 146103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 146203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE_SUSPEND, 146303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall &err)); 146403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 146503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 146603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 146703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid power mode value. */ 146803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_bad_parameter) 146903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 147003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 147103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_power_mode_t mode = static_cast<hwc2_power_mode_t>( 147203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND + 1); 147303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 147403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 147503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, mode, &err)); 147603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code " 147703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall << mode; 147803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 147903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 148003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 148103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 will return unsupported if it does not support 148203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall * an optional power mode. */ 148303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_unsupported) 148403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 148503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 148603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 148703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 148803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 148903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support, &err)); 149003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support == 1) 149103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 149203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 149303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_EQ(support, 0) << "invalid doze support value"; 149403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 149503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE, 149603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall &err)); 149703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code"; 149803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 149903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 150003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND, &err)); 150103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall EXPECT_EQ(err, HWC2_ERROR_UNSUPPORTED) << "returned wrong error code"; 150203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 150303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 150403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 150503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall/* TESTCASE: Tests that the HWC2 can set the same power mode multiple times. */ 150603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa WallTEST_F(Hwc2Test, SET_POWER_MODE_stress) 150703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall{ 150803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall for (auto display : mDisplays) { 150903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 151003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 151103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 151203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 151303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 151403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 151503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 151603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 151703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 151803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall int32_t support = -1; 151903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(getDozeSupport(display, &support)); 152003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall if (support != 1) 152103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall return; 152203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 152303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE)); 152403c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_DOZE)); 152503c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 152603c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 152703c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND)); 152803c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, 152903c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall HWC2_POWER_MODE_DOZE_SUSPEND)); 153003c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall 153103c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 153203c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall } 153303c917316507dd1c12cdb15a84f5e41576ab4bdeMarissa Wall} 1534572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1535572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable vsync on active 1536572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * displays */ 1537572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED) 1538572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1539572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1540572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1541572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1542572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1543572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1544572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1545572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1546572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1547572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1548572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1549572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1550572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1551572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1552572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1553572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1554572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1555572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1556572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 issues a valid vsync callback. */ 1557572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_callback) 1558572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1559572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1560572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t receivedDisplay; 1561572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall int64_t receivedTimestamp; 1562572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1563572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1564572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1565572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(enableVsync(display)); 1566572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1567572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(waitForVsync(&receivedDisplay, 1568572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall &receivedTimestamp)); 1569572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1570572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(receivedDisplay, display) << "failed to get correct display"; 1571572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_GE(receivedTimestamp, 0) << "failed to get valid timestamp"; 1572572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1573572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(disableVsync(display)); 1574572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1575572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1576572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1577572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1578572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1579572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable a vsync for a bad display */ 1580572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_display) 1581572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1582572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_display_t display; 1583572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1584572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1585572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1586572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1587572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 1588572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1589572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1590572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1591572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1592572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE, &err)); 1593572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1594572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1595572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE, &err)); 1596572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1597572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1598572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1599572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 cannot enable an invalid vsync value */ 1600572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_bad_parameter) 1601572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1602572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1603572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1604572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1605572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1606572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1607572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1608572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1609572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1610572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1611572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1612572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_INVALID, 1613572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall &err)); 1614572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_PARAMETER) << "returned wrong error code"; 1615572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1616572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1617572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1618572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1619572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1620572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can enable and disable a vsync value multiple 1621572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * times. */ 1622572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_stress) 1623572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1624572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1625572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall hwc2_callback_data_t data = reinterpret_cast<hwc2_callback_data_t>( 1626572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const_cast<char*>("data")); 1627572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1628572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1629572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1630572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(registerCallback(HWC2_CALLBACK_VSYNC, data, 1631572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall []() { return; })); 1632572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1633572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1634572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1635572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1636572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1637572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1638572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1639572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1640572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1641572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1642572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1643572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1644572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1645572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when the display 1646572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is off and no callback is registered. */ 1647572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback_no_power) 1648572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1649572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const uint secs = 1; 1650572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1651572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1652572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1653572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1654572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall sleep(secs); 1655572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1656572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1657572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1658572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1659572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1660572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall/* TESTCASE: Tests that the HWC2 can set a vsync enable value when no callback 1661572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall * is registered. */ 1662572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa WallTEST_F(Hwc2Test, SET_VSYNC_ENABLED_no_callback) 1663572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall{ 1664572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall const uint secs = 1; 1665572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1666572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall for (auto display : mDisplays) { 1667572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_ON)); 1668572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1669572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_ENABLE)); 1670572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1671572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall sleep(secs); 1672572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1673572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setVsyncEnabled(display, HWC2_VSYNC_DISABLE)); 1674572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall 1675572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall ASSERT_NO_FATAL_FAILURE(setPowerMode(display, HWC2_POWER_MODE_OFF)); 1676572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall } 1677572a1eedae1d15a8544c95f0284e5b1216a187d2Marissa Wall} 1678dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 1679dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 returns a display name for each display */ 1680dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME) 1681dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{ 1682dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall for (auto display : mDisplays) { 1683dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall std::string name; 1684dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 1685dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name)); 1686dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall } 1687dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall} 1688dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 1689dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall/* TESTCASE: Tests that the HWC2 does not return a display name for a bad 1690dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall * display */ 1691dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa WallTEST_F(Hwc2Test, GET_DISPLAY_NAME_bad_display) 1692dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall{ 1693dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall hwc2_display_t display; 1694dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall std::string name; 1695dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall hwc2_error_t err = HWC2_ERROR_NONE; 1696dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 1697dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall ASSERT_NO_FATAL_FAILURE(getBadDisplay(&display)); 1698dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall 1699dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayName(display, &name, &err)); 1700dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall EXPECT_EQ(err, HWC2_ERROR_BAD_DISPLAY) << "returned wrong error code"; 1701dd4087f4eab87607662b7ee87e9e7b1298f7a3fcMarissa Wall} 17026bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 17036bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can set basic composition types. */ 17046bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE) 17056bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{ 17066bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete, 17076bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall setComposition, advanceComposition)); 17086bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall} 17096bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 17106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 can update a basic composition type on a 17116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * layer. */ 17126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_update) 17136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{ 17146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete, 17156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall setComposition, advanceComposition)); 17166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall} 17176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 17186bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a composition type for a bad layer */ 17196bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_layer) 17206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{ 17216bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, 17226bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall setComposition)); 17236bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall} 17246bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 17256bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a bad composition type */ 17266bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallTEST_F(Hwc2Test, SET_LAYER_COMPOSITION_TYPE_bad_parameter) 17276bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{ 17286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter( 17296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 17306bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall hwc2_error_t* outErr) { 17316bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall 17326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall ASSERT_NO_FATAL_FAILURE(test->setLayerCompositionType(display, 17336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall layer, HWC2_COMPOSITION_INVALID, outErr)); 17346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall } 17356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall )); 17366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall} 1737ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 1738ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can set a blend mode value of a layer. */ 1739ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE) 1740ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{ 1741ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete, 1742ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall setBlendMode, advanceBlendMode)); 1743ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall} 1744ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 1745ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 can update a blend mode value of a layer. */ 1746ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_update) 1747ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{ 1748ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete, 1749ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall setBlendMode, advanceBlendMode)); 1750ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall} 1751ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 1752ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a blend mode for a bad layer. */ 1753ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_layer) 1754ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{ 1755ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, 1756ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall setBlendMode)); 1757ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall} 1758ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 1759ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set an invalid blend mode. */ 1760ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallTEST_F(Hwc2Test, SET_LAYER_BLEND_MODE_bad_parameter) 1761ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{ 1762ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadParameter( 1763ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 1764ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall hwc2_error_t* outErr) { 1765ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall 1766ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall ASSERT_NO_FATAL_FAILURE(test->setLayerBlendMode(display, 1767ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall layer, HWC2_BLEND_MODE_INVALID, outErr)); 1768ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall } 1769ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall )); 1770ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall} 1771b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 1772b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can set the dataspace of a layer. */ 1773b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE) 1774b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{ 1775b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete, 1776b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall setDataspace, advanceDataspace)); 1777b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall} 1778b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 1779b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 can update the dataspace of a layer. */ 1780b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_update) 1781b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{ 1782b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete, 1783b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall setDataspace, advanceDataspace)); 1784b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall} 1785b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall 1786b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set a dataspace for a bad layer. */ 1787b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallTEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer) 1788b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{ 1789b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, 1790b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall setDataspace)); 1791b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall} 17922b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 17932b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */ 17942b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA) 17952b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{ 17962b1f53060ea8587a428f826cf7890354ff124722Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete, 17972b1f53060ea8587a428f826cf7890354ff124722Marissa Wall setPlaneAlpha, advancePlaneAlpha)); 17982b1f53060ea8587a428f826cf7890354ff124722Marissa Wall} 17992b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 18002b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 can update the plane alpha of a layer. */ 18012b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_update) 18022b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{ 18032b1f53060ea8587a428f826cf7890354ff124722Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete, 18042b1f53060ea8587a428f826cf7890354ff124722Marissa Wall setPlaneAlpha, advancePlaneAlpha)); 18052b1f53060ea8587a428f826cf7890354ff124722Marissa Wall} 18062b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 18072b1f53060ea8587a428f826cf7890354ff124722Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set a plane alpha for a bad layer. */ 18082b1f53060ea8587a428f826cf7890354ff124722Marissa WallTEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA_bad_layer) 18092b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{ 18102b1f53060ea8587a428f826cf7890354ff124722Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, 18112b1f53060ea8587a428f826cf7890354ff124722Marissa Wall [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t badLayer, 18122b1f53060ea8587a428f826cf7890354ff124722Marissa Wall const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) { 18132b1f53060ea8587a428f826cf7890354ff124722Marissa Wall 18142b1f53060ea8587a428f826cf7890354ff124722Marissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerPlaneAlpha(display, 18152b1f53060ea8587a428f826cf7890354ff124722Marissa Wall badLayer, testLayer.getPlaneAlpha(), outErr)); 18162b1f53060ea8587a428f826cf7890354ff124722Marissa Wall } 18172b1f53060ea8587a428f826cf7890354ff124722Marissa Wall )); 18182b1f53060ea8587a428f826cf7890354ff124722Marissa Wall} 1819ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 1820ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can set the transform value of a layer. */ 1821ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM) 1822ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{ 1823ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete, 1824ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall setTransform, advanceTransform)); 1825ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall} 1826ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 1827ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 can update the transform value of a layer. */ 1828ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_update) 1829ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{ 1830ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete, 1831ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall setTransform, advanceTransform)); 1832ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall} 1833ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall 1834ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall/* TESTCASE: Tests that the HWC2 cannot set the transform for a bad layer. */ 1835ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallTEST_F(Hwc2Test, SET_LAYER_TRANSFORM_bad_layer) 1836ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{ 1837ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, 1838ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall setTransform)); 1839ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall} 1840273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1841273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can set the z order of a layer. */ 1842273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER) 1843273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{ 1844273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerProperties(Hwc2TestCoverage::Complete, 10, 1845273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall [] (Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, 1846273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall const Hwc2TestLayers& testLayers) { 1847273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1848273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall EXPECT_NO_FATAL_FAILURE(test->setLayerZOrder(display, layer, 1849273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall testLayers.getZOrder(layer))); 1850273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 1851273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall )); 1852273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall} 1853273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1854273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 can update the z order of a layer. */ 1855273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_update) 1856273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{ 1857273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall const std::vector<uint32_t> zOrders = { static_cast<uint32_t>(0), 1858273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall static_cast<uint32_t>(1), static_cast<uint32_t>(UINT32_MAX / 4), 1859273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall static_cast<uint32_t>(UINT32_MAX / 2), 1860273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall static_cast<uint32_t>(UINT32_MAX) }; 1861273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1862273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall for (auto display : mDisplays) { 1863273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall std::vector<hwc2_config_t> configs; 1864273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1865273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(getDisplayConfigs(display, &configs)); 1866273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1867273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall for (auto config : configs) { 1868273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall hwc2_layer_t layer; 1869273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1870273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); 1871273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1872273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); 1873273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1874273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall for (uint32_t zOrder : zOrders) { 1875273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall EXPECT_NO_FATAL_FAILURE(setLayerZOrder(display, layer, zOrder)); 1876273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 1877273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1878273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(destroyLayer(display, layer)); 1879273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 1880273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall } 1881273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall} 1882273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall 1883273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall/* TESTCASE: Tests that the HWC2 cannot set the z order of a bad layer. */ 1884273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa WallTEST_F(Hwc2Test, SET_LAYER_Z_ORDER_bad_layer) 1885273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall{ 1886273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, 1887273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall setZOrder)); 1888273b1dfa05287a0016ae1fc230cd3a5b1b7433faMarissa Wall} 1889