[Composer VTS] Adds VTS for getDisplayConfigurations
Test getDisplayConfigurations on the version 3 of the composer.
Test: atest VtsHalGraphicsComposer3_TargetTest
BUG: 287518719
BUG: 284866749
Change-Id: Ibb654dbeb4b164d86f92f51f8083ed1ab06fcfa4
diff --git a/graphics/composer/aidl/vts/VtsComposerClient.cpp b/graphics/composer/aidl/vts/VtsComposerClient.cpp
index 25b0ca0..bf42d88 100644
--- a/graphics/composer/aidl/vts/VtsComposerClient.cpp
+++ b/graphics/composer/aidl/vts/VtsComposerClient.cpp
@@ -58,7 +58,7 @@
return verifyComposerCallbackParams() && destroyAllLayers();
}
-std::pair<ScopedAStatus, int32_t> VtsComposerClient::getInterfaceVersion() {
+std::pair<ScopedAStatus, int32_t> VtsComposerClient::getInterfaceVersion() const {
int32_t version = 1;
auto status = mComposerClient->getInterfaceVersion(&version);
return {std::move(status), version};
@@ -295,7 +295,24 @@
std::pair<ScopedAStatus, std::vector<int32_t>> VtsComposerClient::getDisplayConfigs(
int64_t display) {
std::vector<int32_t> outConfigs;
- return {mComposerClient->getDisplayConfigs(display, &outConfigs), outConfigs};
+ if (!getDisplayConfigurationSupported()) {
+ return {mComposerClient->getDisplayConfigs(display, &outConfigs), outConfigs};
+ }
+
+ auto [status, configs] = getDisplayConfigurations(display);
+ if (!status.isOk()) {
+ return {std::move(status), outConfigs};
+ }
+ for (const auto& config : configs) {
+ outConfigs.emplace_back(config.configId);
+ }
+ return {std::move(status), outConfigs};
+}
+
+std::pair<ScopedAStatus, std::vector<DisplayConfiguration>>
+VtsComposerClient::getDisplayConfigurations(int64_t display) {
+ std::vector<DisplayConfiguration> outConfigs;
+ return {mComposerClient->getDisplayConfigurations(display, &outConfigs), outConfigs};
}
std::pair<ScopedAStatus, int32_t> VtsComposerClient::getDisplayVsyncPeriod(int64_t display) {
@@ -439,31 +456,41 @@
vtsDisplays.reserve(displays.size());
for (int64_t display : displays) {
auto vtsDisplay = VtsDisplay{display};
- auto configs = getDisplayConfigs(display);
- if (!configs.first.isOk()) {
- ALOGE("Unable to get the displays for test, failed to get the configs "
- "for display %" PRId64,
- display);
- return {std::move(configs.first), vtsDisplays};
- }
- for (int config : configs.second) {
- auto status = addDisplayConfig(&vtsDisplay, config);
+ if (getDisplayConfigurationSupported()) {
+ auto [status, configs] = getDisplayConfigurations(display);
if (!status.isOk()) {
- ALOGE("Unable to get the displays for test, failed to add config "
+ ALOGE("Unable to get the displays for test, failed to get the DisplayConfigs "
"for display %" PRId64,
display);
return {std::move(status), vtsDisplays};
}
+ addDisplayConfigs(&vtsDisplay, configs);
+ } else {
+ auto [status, configs] = getDisplayConfigs(display);
+ if (!status.isOk()) {
+ ALOGE("Unable to get the displays for test, failed to get the configs "
+ "for display %" PRId64,
+ display);
+ return {std::move(status), vtsDisplays};
+ }
+ for (int config : configs) {
+ status = addDisplayConfigLegacy(&vtsDisplay, config);
+ if (!status.isOk()) {
+ ALOGE("Unable to get the displays for test, failed to add config "
+ "for display %" PRId64,
+ display);
+ return {std::move(status), vtsDisplays};
+ }
+ }
}
-
- auto config = getActiveConfig(display);
- if (!config.first.isOk()) {
+ auto activeConfig = getActiveConfig(display);
+ if (!activeConfig.first.isOk()) {
ALOGE("Unable to get the displays for test, failed to get active config "
- "for display %" PRId64, display);
- return {std::move(config.first), vtsDisplays};
+ "for display %" PRId64,
+ display);
+ return {std::move(activeConfig.first), vtsDisplays};
}
-
- auto status = updateDisplayProperties(&vtsDisplay, config.second);
+ auto status = updateDisplayProperties(&vtsDisplay, activeConfig.second);
if (!status.isOk()) {
ALOGE("Unable to get the displays for test, "
"failed to update the properties "
@@ -480,39 +507,53 @@
}
}
-ScopedAStatus VtsComposerClient::addDisplayConfig(VtsDisplay* vtsDisplay, int32_t config) {
- const auto width =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::WIDTH);
- const auto height =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::HEIGHT);
+void VtsComposerClient::addDisplayConfigs(VtsDisplay* vtsDisplay,
+ const std::vector<DisplayConfiguration>& configs) {
+ for (const auto& config : configs) {
+ vtsDisplay->addDisplayConfig(config.configId, {config.vsyncPeriod, config.configGroup});
+ }
+}
+
+ScopedAStatus VtsComposerClient::addDisplayConfigLegacy(VtsDisplay* vtsDisplay, int32_t config) {
const auto vsyncPeriod =
getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::VSYNC_PERIOD);
const auto configGroup =
getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::CONFIG_GROUP);
- if (width.first.isOk() && height.first.isOk() && vsyncPeriod.first.isOk() &&
- configGroup.first.isOk()) {
+ if (vsyncPeriod.first.isOk() && configGroup.first.isOk()) {
vtsDisplay->addDisplayConfig(config, {vsyncPeriod.second, configGroup.second});
return ScopedAStatus::ok();
}
- LOG(ERROR) << "Failed to update display property for width: " << width.first.isOk()
- << ", height: " << height.first.isOk() << ", vsync: " << vsyncPeriod.first.isOk()
+ LOG(ERROR) << "Failed to update display property vsync: " << vsyncPeriod.first.isOk()
<< ", config: " << configGroup.first.isOk();
return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_CONFIG);
}
ScopedAStatus VtsComposerClient::updateDisplayProperties(VtsDisplay* vtsDisplay, int32_t config) {
- const auto width =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::WIDTH);
- const auto height =
- getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::HEIGHT);
- if (width.first.isOk() && height.first.isOk()) {
- vtsDisplay->setDimensions(width.second, height.second);
- return ScopedAStatus::ok();
- }
+ if (getDisplayConfigurationSupported()) {
+ auto [status, configs] = getDisplayConfigurations(vtsDisplay->getDisplayId());
+ if (status.isOk()) {
+ for (const auto& displayConfig : configs) {
+ if (displayConfig.configId == config) {
+ vtsDisplay->setDimensions(displayConfig.width, displayConfig.height);
+ return ScopedAStatus::ok();
+ }
+ }
+ }
+ LOG(ERROR) << "Failed to update display property with DisplayConfig";
+ } else {
+ const auto width =
+ getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::WIDTH);
+ const auto height =
+ getDisplayAttribute(vtsDisplay->getDisplayId(), config, DisplayAttribute::HEIGHT);
+ if (width.first.isOk() && height.first.isOk()) {
+ vtsDisplay->setDimensions(width.second, height.second);
+ return ScopedAStatus::ok();
+ }
- LOG(ERROR) << "Failed to update display property for width: " << width.first.isOk()
- << ", height: " << height.first.isOk();
+ LOG(ERROR) << "Failed to update display property for width: " << width.first.isOk()
+ << ", height: " << height.first.isOk();
+ }
return ScopedAStatus::fromServiceSpecificError(IComposerClient::EX_BAD_CONFIG);
}
@@ -576,6 +617,13 @@
return isValid;
}
+bool VtsComposerClient::getDisplayConfigurationSupported() const {
+ auto [status, interfaceVersion] = getInterfaceVersion();
+ EXPECT_TRUE(status.isOk());
+ // getDisplayConfigurations api is supported starting interface version 3
+ return interfaceVersion >= 3;
+}
+
bool VtsComposerClient::destroyAllLayers() {
std::unordered_map<int64_t, DisplayResource> physicalDisplays;
while (!mDisplayResources.empty()) {