Merge "Adjustments to composer apis for HDR:"

This commit is contained in:
Alec Mouri
2022-01-07 22:44:50 +00:00
committed by Android (Google) Code Review
6 changed files with 144 additions and 31 deletions

View File

@@ -0,0 +1,38 @@
/**
* Copyright 2021, 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.composer3;
@VintfStability
parcelable DisplayBrightness {
float brightness;
}

View File

@@ -37,6 +37,7 @@ parcelable DisplayCommand {
long display;
android.hardware.graphics.composer3.LayerCommand[] layers;
@nullable float[] colorTransformMatrix;
@nullable android.hardware.graphics.composer3.DisplayBrightness brightness;
@nullable android.hardware.graphics.composer3.ClientTarget clientTarget;
@nullable android.hardware.graphics.composer3.Buffer virtualDisplayOutputBuffer;
@nullable android.hardware.graphics.composer3.ClockMonotonicTimestamp expectedPresentTime;

View File

@@ -0,0 +1,26 @@
/**
* Copyright 2021, 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.composer3;
@VintfStability
parcelable DisplayBrightness {
/**
* A number between 0.0f (minimum brightness) and 1.0f (maximum brightness), a negative value to
* turn the backlight off.
*/
float brightness;
}

View File

@@ -19,6 +19,7 @@ package android.hardware.graphics.composer3;
import android.hardware.graphics.composer3.Buffer;
import android.hardware.graphics.composer3.ClientTarget;
import android.hardware.graphics.composer3.ClockMonotonicTimestamp;
import android.hardware.graphics.composer3.DisplayBrightness;
import android.hardware.graphics.composer3.LayerCommand;
@VintfStability
@@ -68,6 +69,29 @@ parcelable DisplayCommand {
*/
@nullable float[] colorTransformMatrix;
/**
* Sets the desired brightness of the display.
*
* Ideally, the brightness of the display will take effect within this frame so that it can be
* aligned with color transforms. Some display architectures may take multiple frames to apply
* the display brightness, for example when internally switching the display between multiple
* power modes to achieve higher luminance. In those cases, the underlying display panel's real
* brightness may not be applied atomically; however, layer dimming when mixing HDR and SDR
* content must be synchronized.
*
* As an illustrative example: suppose two layers have white
* points of 200 nits and 1000 nits respectively, the old display luminance is 200 nits, and the
* new display luminance is 1000 nits. If the new display luminance takes two frames to apply,
* then: In the first frame, there must not be any relative dimming of layers (treat both layers
* as 200 nits as the maximum luminance of the display is 200 nits). In the second frame, there
* dimming should be applied to ensure that the first layer does not become perceptually
* brighter during the transition.
*
* The display luminance must be updated by this command even if there is not pending validate
* or present command.
*/
@nullable DisplayBrightness brightness;
/**
* Sets the buffer handle which will receive the output of client
* composition. Layers marked as Composition.CLIENT must be composited

View File

@@ -568,37 +568,6 @@ TEST_P(GraphicsComposerAidlTest, GetDisplayedContentSample) {
}
}
/*
* Test that if brightness operations are supported, setDisplayBrightness works as expected.
*/
TEST_P(GraphicsComposerAidlTest, setDisplayBrightness) {
std::vector<DisplayCapability> capabilities;
auto error = mComposerClient->getDisplayCapabilities(mPrimaryDisplay, &capabilities);
ASSERT_TRUE(error.isOk());
bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
DisplayCapability::BRIGHTNESS) != capabilities.end();
if (!brightnessSupport) {
EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 0.5f)
.getServiceSpecificError(),
IComposerClient::EX_UNSUPPORTED);
GTEST_SUCCEED() << "Brightness operations are not supported";
return;
}
EXPECT_TRUE(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 0.0f).isOk());
EXPECT_TRUE(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 0.5f).isOk());
EXPECT_TRUE(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 1.0f).isOk());
EXPECT_TRUE(mComposerClient->setDisplayBrightness(mPrimaryDisplay, -1.0f).isOk());
error = mComposerClient->setDisplayBrightness(mPrimaryDisplay, +2.0f);
EXPECT_FALSE(error.isOk());
EXPECT_EQ(error.getServiceSpecificError(), IComposerClient::EX_BAD_PARAMETER);
error = mComposerClient->setDisplayBrightness(mPrimaryDisplay, -2.0f);
EXPECT_FALSE(error.isOk());
EXPECT_EQ(error.getServiceSpecificError(), IComposerClient::EX_BAD_PARAMETER);
}
TEST_P(GraphicsComposerAidlTest, getDisplayConnectionType) {
DisplayConnectionType type;
EXPECT_FALSE(mComposerClient->getDisplayConnectionType(mInvalidDisplayId, &type).isOk());
@@ -1494,6 +1463,55 @@ TEST_P(GraphicsComposerAidlCommandTest, SetLayerColorTransform) {
}
}
TEST_P(GraphicsComposerAidlCommandTest, SetDisplayBrightness) {
std::vector<DisplayCapability> capabilities;
auto error = mComposerClient->getDisplayCapabilities(mPrimaryDisplay, &capabilities);
ASSERT_TRUE(error.isOk());
bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
DisplayCapability::BRIGHTNESS) != capabilities.end();
if (!brightnessSupport) {
mWriter.setDisplayBrightness(mPrimaryDisplay, 0.5f);
execute();
const auto errors = mReader.takeErrors();
EXPECT_EQ(1, errors.size());
EXPECT_EQ(EX_UNSUPPORTED_OPERATION, errors[0].errorCode);
GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
return;
}
mWriter.setDisplayBrightness(mPrimaryDisplay, 0.0f);
execute();
EXPECT_TRUE(mReader.takeErrors().empty());
mWriter.setDisplayBrightness(mPrimaryDisplay, 0.5f);
execute();
EXPECT_TRUE(mReader.takeErrors().empty());
mWriter.setDisplayBrightness(mPrimaryDisplay, 1.0f);
execute();
EXPECT_TRUE(mReader.takeErrors().empty());
mWriter.setDisplayBrightness(mPrimaryDisplay, -1.0f);
execute();
EXPECT_TRUE(mReader.takeErrors().empty());
mWriter.setDisplayBrightness(mPrimaryDisplay, 2.0f);
execute();
{
const auto errors = mReader.takeErrors();
EXPECT_EQ(1, errors.size());
EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
}
mWriter.setDisplayBrightness(mPrimaryDisplay, -2.0f);
execute();
{
const auto errors = mReader.takeErrors();
EXPECT_EQ(1, errors.size());
EXPECT_EQ(IComposerClient::EX_BAD_PARAMETER, errors[0].errorCode);
}
}
TEST_P(GraphicsComposerAidlCommandTest, SET_CLIENT_TARGET) {
EXPECT_TRUE(
mComposerClient->setClientTargetSlotCount(mPrimaryDisplay, kBufferSlotCount).isOk());

View File

@@ -29,9 +29,11 @@
#include <aidl/android/hardware/graphics/common/BlendMode.h>
#include <aidl/android/hardware/graphics/composer3/Color.h>
#include <aidl/android/hardware/graphics/composer3/Composition.h>
#include <aidl/android/hardware/graphics/composer3/DisplayBrightness.h>
#include <aidl/android/hardware/graphics/composer3/FloatColor.h>
#include <aidl/android/hardware/graphics/composer3/PerFrameMetadata.h>
#include <aidl/android/hardware/graphics/composer3/PerFrameMetadataBlob.h>
#include <aidl/android/hardware/graphics/composer3/WhitePointNits.h>
#include <aidl/android/hardware/graphics/composer3/DisplayCommand.h>
@@ -79,6 +81,10 @@ class ComposerClientWriter {
getDisplayCommand(display).colorTransformMatrix.emplace(std::move(matVec));
}
void setDisplayBrightness(int64_t display, float brightness) {
getDisplayCommand(display).brightness.emplace(DisplayBrightness{.brightness = brightness});
}
void setClientTarget(int64_t display, uint32_t slot, const native_handle_t* target,
int acquireFence, Dataspace dataspace, const std::vector<Rect>& damage) {
ClientTarget clientTargetCommand;