ComposerHAL APIs for HDR output control

Bug: 251168514
Test: atest VtsHalGraphicsComposer3_TargetTest
Change-Id: Icf5437c6dab2c8ce9247617f6e6006051fc206fb
This commit is contained in:
Kriti Dang
2022-12-05 13:03:49 +01:00
parent 76820d67aa
commit 3793ebdaea
13 changed files with 326 additions and 0 deletions

View File

@@ -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 <name>-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;
}

View File

@@ -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 <name>-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;
}

View File

@@ -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 <name>-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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -40,4 +40,5 @@ enum Capability {
PRESENT_FENCE_IS_NOT_RELIABLE = 3,
SKIP_VALIDATE = 4,
BOOT_DISPLAY_CONFIG = 5,
HDR_OUTPUT_CONVERSION_CONFIG = 6,
}

View File

@@ -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;

View File

@@ -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,
}

View File

@@ -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);
}

View File

@@ -337,6 +337,18 @@ std::pair<ScopedAStatus, int32_t> VtsComposerClient::getPreferredBootDisplayConf
return {mComposerClient->getPreferredBootDisplayConfig(display, &outConfig), outConfig};
}
std::pair<ScopedAStatus, std::vector<common::HdrConversionCapability>>
VtsComposerClient::getHdrConversionCapabilities() {
std::vector<common::HdrConversionCapability> hdrConversionCapability;
return {mComposerClient->getHdrConversionCapabilities(&hdrConversionCapability),
hdrConversionCapability};
}
ScopedAStatus VtsComposerClient::setHdrConversionStrategy(
const common::HdrConversionStrategy& conversionStrategy) {
return mComposerClient->setHdrConversionStrategy(conversionStrategy);
}
std::pair<ScopedAStatus, common::Transform> VtsComposerClient::getDisplayPhysicalOrientation(
int64_t display) {
common::Transform outDisplayOrientation;

View File

@@ -163,6 +163,11 @@ class VtsComposerClient {
std::pair<ScopedAStatus, int32_t> getPreferredBootDisplayConfig(int64_t display);
std::pair<ScopedAStatus, std::vector<common::HdrConversionCapability>>
getHdrConversionCapabilities();
ScopedAStatus setHdrConversionStrategy(const common::HdrConversionStrategy& conversionStrategy);
std::pair<ScopedAStatus, common::Transform> getDisplayPhysicalOrientation(int64_t display);
ScopedAStatus setIdleTimerEnabled(int64_t display, int32_t timeoutMs);

View File

@@ -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<common::HdrConversionStrategy::Tag::passthrough>(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<common::HdrConversionStrategy::Tag::forceHdrConversion>(
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<aidl::android::hardware::graphics::common::Hdr> autoHdrTypes;
for (auto conversionCapability : conversionCapabilities) {
if (conversionCapability.outputType) {
autoHdrTypes.push_back(conversionCapability.outputType->hdr);
}
}
common::HdrConversionStrategy hdrConversionStrategy;
hdrConversionStrategy.set<common::HdrConversionStrategy::Tag::autoAllowedHdrTypes>(
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());