diff --git a/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/HdrConversionCapability.aidl b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/HdrConversionCapability.aidl new file mode 100644 index 0000000000..66151ca1ae --- /dev/null +++ b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/HdrConversionCapability.aidl @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.graphics.common; +@VintfStability +parcelable HdrConversionCapability { + android.hardware.graphics.common.ParcelableHdr sourceType; + @nullable android.hardware.graphics.common.ParcelableHdr outputType; + boolean addsLatency; +} diff --git a/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/HdrConversionStrategy.aidl b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/HdrConversionStrategy.aidl new file mode 100644 index 0000000000..db785cf63f --- /dev/null +++ b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/HdrConversionStrategy.aidl @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.graphics.common; +@VintfStability +union HdrConversionStrategy { + boolean passthrough = true; + android.hardware.graphics.common.Hdr[] autoAllowedHdrTypes; + android.hardware.graphics.common.Hdr forceHdrConversion; +} diff --git a/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/ParcelableHdr.aidl b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/ParcelableHdr.aidl new file mode 100644 index 0000000000..788bd4e9fa --- /dev/null +++ b/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current/android/hardware/graphics/common/ParcelableHdr.aidl @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2023, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.graphics.common; +@VintfStability +parcelable ParcelableHdr { + android.hardware.graphics.common.Hdr hdr; +} diff --git a/graphics/common/aidl/android/hardware/graphics/common/HdrConversionCapability.aidl b/graphics/common/aidl/android/hardware/graphics/common/HdrConversionCapability.aidl new file mode 100644 index 0000000000..53b3256cf2 --- /dev/null +++ b/graphics/common/aidl/android/hardware/graphics/common/HdrConversionCapability.aidl @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.graphics.common; + +import android.hardware.graphics.common.ParcelableHdr; + +/** + * Output parameter for IComposerClient.getHdrConversionCapabilities + * + * @param sourceType is the HDR type that can be converted to outputType. + * + * @param outputType is the HDR type/ SDR that the source type can be converted to. The value null + * is used to depict SDR outputType. + * + * @param addsLatency is false if no latency added due to HDR conversion from sourceType to + * outputType, otherwise true. + */ +@VintfStability +parcelable HdrConversionCapability { + ParcelableHdr sourceType; + @nullable ParcelableHdr outputType; + boolean addsLatency; +} diff --git a/graphics/common/aidl/android/hardware/graphics/common/HdrConversionStrategy.aidl b/graphics/common/aidl/android/hardware/graphics/common/HdrConversionStrategy.aidl new file mode 100644 index 0000000000..f564e9f008 --- /dev/null +++ b/graphics/common/aidl/android/hardware/graphics/common/HdrConversionStrategy.aidl @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.graphics.common; +/** + * Input parameter for IComposerClient.setHdrConversionStrategy + * + * @param passthrough - When this parameter is set to true, HDR conversion is disabled by the + * implementation. The output HDR type will change dynamically to match the content. This value is + * never set to false, as other union values will be present in the false case. + * + * @param autoAllowedHdrTypes - When this parameter is set, the output HDR type is selected by the + * implementation. The implementation is only allowed to set the output HDR type to the HDR types + * present in this list. If conversion to any of the autoHdrTypes types is not possible, the + * implementation should do no conversion. + * + * @param forceHdrConversion - When this parameter is set, the implementation should convert all + * content to this HDR type, when possible. If not possible, the functionality should be similar to + * passthrough=true. + */ +@VintfStability +union HdrConversionStrategy { + boolean passthrough = true; + android.hardware.graphics.common.Hdr[] autoAllowedHdrTypes; + android.hardware.graphics.common.Hdr forceHdrConversion; +} diff --git a/graphics/common/aidl/android/hardware/graphics/common/ParcelableHdr.aidl b/graphics/common/aidl/android/hardware/graphics/common/ParcelableHdr.aidl new file mode 100644 index 0000000000..9aff2770c9 --- /dev/null +++ b/graphics/common/aidl/android/hardware/graphics/common/ParcelableHdr.aidl @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2023, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.graphics.common; + +import android.hardware.graphics.common.Hdr; + +@VintfStability +parcelable ParcelableHdr { + Hdr hdr; +} diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Capability.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Capability.aidl index b89f7d5105..c0569ce004 100644 --- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Capability.aidl +++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/Capability.aidl @@ -40,4 +40,5 @@ enum Capability { PRESENT_FENCE_IS_NOT_RELIABLE = 3, SKIP_VALIDATE = 4, BOOT_DISPLAY_CONFIG = 5, + HDR_OUTPUT_CONVERSION_CONFIG = 6, } 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 a7e65353e1..f5f63e0edc 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 @@ -76,6 +76,8 @@ interface IComposerClient { void setVsyncEnabled(long display, boolean enabled); void setIdleTimerEnabled(long display, int timeoutMs); android.hardware.graphics.composer3.OverlayProperties getOverlaySupport(); + android.hardware.graphics.common.HdrConversionCapability[] getHdrConversionCapabilities(); + void setHdrConversionStrategy(in android.hardware.graphics.common.HdrConversionStrategy conversionStrategy); const int EX_BAD_CONFIG = 1; const int EX_BAD_DISPLAY = 2; const int EX_BAD_LAYER = 3; diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl index 2f9eab937c..89c929805e 100644 --- a/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl +++ b/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl @@ -66,4 +66,12 @@ enum Capability { * @see IComposerClient.getPreferredBootDisplayConfig */ BOOT_DISPLAY_CONFIG = 5, + + /** + * Specifies that the device supports HDR output conversion. + * + * @see IComposerClient.getHdrConversionCapabilities + * @see IComposerClient.setHdrConversionStrategy + */ + HDR_OUTPUT_CONVERSION_CONFIG = 6, } diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl index 88bb3a47ff..8091491ae2 100644 --- a/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl +++ b/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl @@ -17,6 +17,8 @@ package android.hardware.graphics.composer3; import android.hardware.graphics.common.DisplayDecorationSupport; +import android.hardware.graphics.common.HdrConversionCapability; +import android.hardware.graphics.common.HdrConversionStrategy; import android.hardware.graphics.common.Transform; import android.hardware.graphics.composer3.ClientTargetProperty; import android.hardware.graphics.composer3.ColorMode; @@ -825,4 +827,25 @@ interface IComposerClient { * @return the overlay properties of the device. */ OverlayProperties getOverlaySupport(); + + /** + * Returns the array of HDR conversion capability. Each HdrConversionCapability depicts that + * HDR conversion is possible from sourceType to outputType. This doesn't change after + * initialization. + * + * @exception EX_UNSUPPORTED when not supported by the underlying HAL + * + * @see setHdrConversionStrategy + */ + HdrConversionCapability[] getHdrConversionCapabilities(); + + /** + * Sets the of HDR conversion strategy. + * + * + * @exception EX_UNSUPPORTED when not supported by the underlying HAL + * + * @see getHdrConversionCapabilities + */ + void setHdrConversionStrategy(in HdrConversionStrategy conversionStrategy); } diff --git a/graphics/composer/aidl/vts/VtsComposerClient.cpp b/graphics/composer/aidl/vts/VtsComposerClient.cpp index 00b578b3f9..9d6ee17139 100644 --- a/graphics/composer/aidl/vts/VtsComposerClient.cpp +++ b/graphics/composer/aidl/vts/VtsComposerClient.cpp @@ -337,6 +337,18 @@ std::pair VtsComposerClient::getPreferredBootDisplayConf return {mComposerClient->getPreferredBootDisplayConfig(display, &outConfig), outConfig}; } +std::pair> +VtsComposerClient::getHdrConversionCapabilities() { + std::vector hdrConversionCapability; + return {mComposerClient->getHdrConversionCapabilities(&hdrConversionCapability), + hdrConversionCapability}; +} + +ScopedAStatus VtsComposerClient::setHdrConversionStrategy( + const common::HdrConversionStrategy& conversionStrategy) { + return mComposerClient->setHdrConversionStrategy(conversionStrategy); +} + std::pair VtsComposerClient::getDisplayPhysicalOrientation( int64_t display) { common::Transform outDisplayOrientation; diff --git a/graphics/composer/aidl/vts/VtsComposerClient.h b/graphics/composer/aidl/vts/VtsComposerClient.h index e61fde9571..cf4b47dd5f 100644 --- a/graphics/composer/aidl/vts/VtsComposerClient.h +++ b/graphics/composer/aidl/vts/VtsComposerClient.h @@ -163,6 +163,11 @@ class VtsComposerClient { std::pair getPreferredBootDisplayConfig(int64_t display); + std::pair> + getHdrConversionCapabilities(); + + ScopedAStatus setHdrConversionStrategy(const common::HdrConversionStrategy& conversionStrategy); + std::pair getDisplayPhysicalOrientation(int64_t display); ScopedAStatus setIdleTimerEnabled(int64_t display, int32_t timeoutMs); diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp index 7b852e029d..b0df5e88d9 100644 --- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp +++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp @@ -621,6 +621,63 @@ TEST_P(GraphicsComposerAidlTest, BootDisplayConfig_Unsupported) { } } +TEST_P(GraphicsComposerAidlTest, GetHdrConversionCapabilities) { + if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) { + GTEST_SUCCEED() << "HDR output conversion not supported"; + return; + } + const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities(); + EXPECT_TRUE(status.isOk()); +} + +TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Passthrough) { + if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) { + GTEST_SUCCEED() << "HDR output conversion not supported"; + return; + } + common::HdrConversionStrategy hdrConversionStrategy; + hdrConversionStrategy.set(true); + const auto& status = mComposerClient->setHdrConversionStrategy(hdrConversionStrategy); + EXPECT_TRUE(status.isOk()); +} + +TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Force) { + if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) { + GTEST_SUCCEED() << "HDR output conversion not supported"; + return; + } + const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities(); + for (auto conversionCapability : conversionCapabilities) { + if (conversionCapability.outputType) { + common::HdrConversionStrategy hdrConversionStrategy; + hdrConversionStrategy.set( + conversionCapability.outputType->hdr); + const auto& statusSet = + mComposerClient->setHdrConversionStrategy(hdrConversionStrategy); + EXPECT_TRUE(status.isOk()); + } + } +} + +TEST_P(GraphicsComposerAidlTest, SetHdrConversionStrategy_Auto) { + if (!hasCapability(Capability::HDR_OUTPUT_CONVERSION_CONFIG)) { + GTEST_SUCCEED() << "HDR output conversion not supported"; + return; + } + const auto& [status, conversionCapabilities] = mComposerClient->getHdrConversionCapabilities(); + std::vector autoHdrTypes; + for (auto conversionCapability : conversionCapabilities) { + if (conversionCapability.outputType) { + autoHdrTypes.push_back(conversionCapability.outputType->hdr); + } + } + common::HdrConversionStrategy hdrConversionStrategy; + hdrConversionStrategy.set( + autoHdrTypes); + const auto& statusSet = mComposerClient->setHdrConversionStrategy(hdrConversionStrategy); + EXPECT_TRUE(status.isOk()); +} + TEST_P(GraphicsComposerAidlTest, SetAutoLowLatencyMode_BadDisplay) { auto status = mComposerClient->setAutoLowLatencyMode(getInvalidDisplayId(), /*isEnabled*/ true); EXPECT_FALSE(status.isOk());