Composer hal changes for boot time display mode
Bug: 203520442
Test: m
Test: atest VtsHalGraphicsComposer3_TargetTest
Change-Id: I530d7f52acaaee8c728dbd9a95ecca017804304a
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl
index e9d9745..a8239cd 100644
--- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl
+++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/IComposerClient.aidl
@@ -61,6 +61,9 @@
void registerCallback(in android.hardware.graphics.composer3.IComposerCallback callback);
void setActiveConfig(long display, int config);
android.hardware.graphics.composer3.VsyncPeriodChangeTimeline setActiveConfigWithConstraints(long display, int config, in android.hardware.graphics.composer3.VsyncPeriodChangeConstraints vsyncPeriodChangeConstraints);
+ void setBootDisplayConfig(long display, int config);
+ void clearBootDisplayConfig(long display);
+ int getPreferredBootDisplayConfig(long display);
void setAutoLowLatencyMode(long display, boolean on);
void setClientTargetSlotCount(long display, int clientTargetSlotCount);
void setColorMode(long display, android.hardware.graphics.composer3.ColorMode mode, android.hardware.graphics.composer3.RenderIntent intent);
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
index 3ab6329..9a29e7e 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl
@@ -549,6 +549,58 @@
long display, int config, in VsyncPeriodChangeConstraints vsyncPeriodChangeConstraints);
/**
+ * Sets the display config in which the device boots.
+ *
+ * If the device is unable to boot in this config for any reason (example HDMI display changed),
+ * the implementation should try to find a config which matches the resolution and refresh-rate
+ * of this config. If no such config exists, the implementation's preferred display config
+ * should be used.
+ *
+ * @param display is the display for which the boot config is set.
+ * @param config is the new boot config for the display.
+ *
+ * @exception EX_BAD_DISPLAY when an invalid display handle was passed in.
+ * @exception EX_BAD_CONFIG when an invalid config id was passed in.
+ *
+ * @see getDisplayConfigs
+ * @see clearBootDisplayConfig
+ * @see getPreferredBootDisplayConfig
+ */
+ void setBootDisplayConfig(long display, int config);
+
+ /**
+ * Clears the boot display config.
+ *
+ * The device should boot in the implementation's preferred display config.
+ *
+ * @param display is the display for which the cached boot config is cleared.
+ *
+ * @exception EX_BAD_DISPLAY when an invalid display handle was passed in.
+ *
+ * @see getDisplayConfigs
+ * @see setBootDisplayConfig
+ * @see getPreferredBootDisplayConfig
+ */
+ void clearBootDisplayConfig(long display);
+
+ /**
+ * Returns the implementation's preferred display config.
+ *
+ * This is the display config used by the implementation at boot time, if the boot display
+ * config has not been requested yet, or if it has been previously cleared.
+ *
+ * @param display is the display to which the preferred config is queried.
+ * @return the implementation's preferred display config.
+ *
+ * @exception EX_BAD_DISPLAY when an invalid display handle was passed in.
+ *
+ * @see getDisplayConfigs
+ * @see setBootDisplayConfig
+ * @see clearBootDisplayConfig
+ */
+ int getPreferredBootDisplayConfig(long display);
+
+ /**
* Requests the display to enable/disable its low latency mode.
*
* If the display is connected via HDMI 2.1, then Auto Low Latency Mode should be triggered. If
diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/vts/functional/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/android/hardware/graphics/composer3/vts/functional/VtsHalGraphicsComposer3_TargetTest.cpp
index c61693e..a59a090 100644
--- a/graphics/composer/aidl/android/hardware/graphics/composer3/vts/functional/VtsHalGraphicsComposer3_TargetTest.cpp
+++ b/graphics/composer/aidl/android/hardware/graphics/composer3/vts/functional/VtsHalGraphicsComposer3_TargetTest.cpp
@@ -716,6 +716,61 @@
}
}
+TEST_P(GraphicsComposerAidlTest, setBootDisplayConfig_BadDisplay) {
+ int32_t config = 0;
+ auto const error = mComposerClient->setBootDisplayConfig(mInvalidDisplayId, config);
+
+ EXPECT_FALSE(error.isOk());
+ EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, error.getServiceSpecificError());
+}
+
+TEST_P(GraphicsComposerAidlTest, setBootDisplayConfig_BadConfig) {
+ for (VtsDisplay& display : mDisplays) {
+ int32_t invalidConfigId = GetInvalidConfigId();
+ const auto error = mComposerClient->setBootDisplayConfig(display.get(), invalidConfigId);
+ EXPECT_FALSE(error.isOk());
+ EXPECT_EQ(IComposerClient::EX_BAD_CONFIG, error.getServiceSpecificError());
+ }
+}
+
+TEST_P(GraphicsComposerAidlTest, setBootDisplayConfig) {
+ std::vector<int32_t> configs;
+ EXPECT_TRUE(mComposerClient->getDisplayConfigs(mPrimaryDisplay, &configs).isOk());
+ for (auto config : configs) {
+ EXPECT_TRUE(mComposerClient->setBootDisplayConfig(mPrimaryDisplay, config).isOk());
+ }
+}
+
+TEST_P(GraphicsComposerAidlTest, clearBootDisplayConfig_BadDisplay) {
+ auto const error = mComposerClient->clearBootDisplayConfig(mInvalidDisplayId);
+
+ EXPECT_FALSE(error.isOk());
+ EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, error.getServiceSpecificError());
+}
+
+TEST_P(GraphicsComposerAidlTest, clearBootDisplayConfig) {
+ EXPECT_TRUE(mComposerClient->clearBootDisplayConfig(mPrimaryDisplay).isOk());
+}
+
+TEST_P(GraphicsComposerAidlTest, getPreferredBootDisplayConfig_BadDisplay) {
+ int32_t config;
+ auto const error = mComposerClient->getPreferredBootDisplayConfig(mInvalidDisplayId, &config);
+
+ EXPECT_FALSE(error.isOk());
+ EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY, error.getServiceSpecificError());
+}
+
+TEST_P(GraphicsComposerAidlTest, getPreferredBootDisplayConfig) {
+ int32_t preferredDisplayConfig = 0;
+ auto const error = mComposerClient->getPreferredBootDisplayConfig(mPrimaryDisplay,
+ &preferredDisplayConfig);
+ EXPECT_TRUE(error.isOk());
+
+ std::vector<int32_t> configs;
+ EXPECT_TRUE(mComposerClient->getDisplayConfigs(mPrimaryDisplay, &configs).isOk());
+ EXPECT_NE(configs.end(), std::find(configs.begin(), configs.end(), preferredDisplayConfig));
+}
+
TEST_P(GraphicsComposerAidlTest, setAutoLowLatencyModeBadDisplay) {
EXPECT_EQ(IComposerClient::EX_BAD_DISPLAY,
mComposerClient->setAutoLowLatencyMode(mInvalidDisplayId, true)