diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-01-27 21:53:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-01-27 21:53:57 +0000 |
commit | 99684613d99363eb0d16a78251d2bca2923c2a1d (patch) | |
tree | 651dfb2ea0f1d0c22a63f8c72ac9d61d901d78e5 | |
parent | 6a8eda96739e61b50663f8f7a275f6c45ee7cba6 (diff) | |
parent | d40304b574e19a7a458e365d4b8bdf495363179b (diff) |
Merge "composer: adds BufferAhead for the LayerCommand.aidl"
11 files changed, 156 insertions, 0 deletions
diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/BufferAheadResult.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/BufferAheadResult.aidl new file mode 100644 index 0000000000..94fd91b2fa --- /dev/null +++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/BufferAheadResult.aidl @@ -0,0 +1,44 @@ +/** + * 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.composer3; +@VintfStability +parcelable BufferAheadResult { + long display; + android.hardware.graphics.composer3.BufferAheadResult.Layer[] layers; + @VintfStability + parcelable Layer { + long layer; + boolean presented; + } +} 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 9c49583fd2..e989b6c24d 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 @@ -39,4 +39,5 @@ enum Capability { SKIP_CLIENT_COLOR_TRANSFORM = 2, PRESENT_FENCE_IS_NOT_RELIABLE = 3, SKIP_VALIDATE = 4, + BUFFER_AHEAD = 5, } diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/CommandResultPayload.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/CommandResultPayload.aidl index ebbb31e59f..fb39172dd9 100644 --- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/CommandResultPayload.aidl +++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/CommandResultPayload.aidl @@ -39,6 +39,7 @@ union CommandResultPayload { android.hardware.graphics.composer3.DisplayRequest displayRequest; android.hardware.graphics.composer3.PresentFence presentFence; android.hardware.graphics.composer3.ReleaseFences releaseFences; + android.hardware.graphics.composer3.BufferAheadResult bufferAheadResult; android.hardware.graphics.composer3.PresentOrValidate presentOrValidateResult; android.hardware.graphics.composer3.ClientTargetPropertyWithNits clientTargetProperty; } diff --git a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl index c1c01172c1..1429c3511f 100644 --- a/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl +++ b/graphics/composer/aidl/aidl_api/android.hardware.graphics.composer3/current/android/hardware/graphics/composer3/LayerCommand.aidl @@ -37,6 +37,7 @@ parcelable LayerCommand { long layer; @nullable android.hardware.graphics.common.Point cursorPosition; @nullable android.hardware.graphics.composer3.Buffer buffer; + @nullable android.hardware.graphics.composer3.Buffer bufferAhead; @nullable android.hardware.graphics.common.Rect[] damage; @nullable android.hardware.graphics.composer3.ParcelableBlendMode blendMode; @nullable android.hardware.graphics.composer3.Color color; diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/BufferAheadResult.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/BufferAheadResult.aidl new file mode 100644 index 0000000000..7ca45784ec --- /dev/null +++ b/graphics/composer/aidl/android/hardware/graphics/composer3/BufferAheadResult.aidl @@ -0,0 +1,46 @@ +/** + * 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.composer3; + +@VintfStability +parcelable BufferAheadResult { + /** + * The display which this commands refers to. + * @see IComposer.createDisplay + */ + long display; + + @VintfStability + parcelable Layer { + /** + * The layer which this commands refers to. + * @see IComposer.createLayer + */ + long layer; + + /** + * Represents whether BufferAhead was presented as part of the last + * present or not. + */ + boolean presented; + } + + /** + * The layers which has BufferAheadResult populated. + */ + Layer[] layers; +} diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl index ea619aeaf3..77ad1e0645 100644 --- a/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl +++ b/graphics/composer/aidl/android/hardware/graphics/composer3/Capability.aidl @@ -57,4 +57,9 @@ enum Capability { * validateDisplay step is needed. */ SKIP_VALIDATE = 4, + /** + * Specifies that a device is able to use the LayerCommand.bufferAhead + * when provided. + */ + BUFFER_AHEAD = 5 } diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/CommandResultPayload.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/CommandResultPayload.aidl index f2de68e025..fd1e4cc30b 100644 --- a/graphics/composer/aidl/android/hardware/graphics/composer3/CommandResultPayload.aidl +++ b/graphics/composer/aidl/android/hardware/graphics/composer3/CommandResultPayload.aidl @@ -16,6 +16,7 @@ package android.hardware.graphics.composer3; +import android.hardware.graphics.composer3.BufferAheadResult; import android.hardware.graphics.composer3.ChangedCompositionTypes; import android.hardware.graphics.composer3.ClientTargetPropertyWithNits; import android.hardware.graphics.composer3.CommandError; @@ -78,6 +79,13 @@ union CommandResultPayload { ReleaseFences releaseFences; /** + * Represents the result of the LayerCommand.bufferAhead that was + * sent in the last presentDisplay call. That is, the presentDisplay + * call prior to this presentDisplay. + */ + BufferAheadResult bufferAheadResult; + + /** * Sets the state of PRESENT_OR_VALIDATE_DISPLAY command. */ PresentOrValidate presentOrValidateResult; diff --git a/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl b/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl index 0a2711b056..b7b45e287d 100644 --- a/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl +++ b/graphics/composer/aidl/android/hardware/graphics/composer3/LayerCommand.aidl @@ -79,6 +79,30 @@ parcelable LayerCommand { @nullable Buffer buffer; /** + * Sets a buffer handle to be displayed for this layer and a file descriptor + * referring to an acquire sync fence object, which must be signaled when it is + * safe to read from the given buffer. + * + * When bufferAhead is provided, the implementation should try to + * present it on the next scanout as long as its acquire sync fence + * is signaled by that time. Otherwise the bufferAhead should be dropped. + * This allows the client to set an + * unsignaled buffer on the layer without causing the entire display to miss + * an update if the buffer is not ready by the next scanout time. + * + * In case bufferAhead is dropped and LayerCommand.buffer is provided, LayerCommand.buffer + * should be used as the next layer buffer. + * + * The implementation is expected to populate the CommandResultPayload.bufferAheadResult + * with information about whether bufferAhead was presented or dropped. + * Since this information is not known at the current presentDisplay call + * of frame N (as the scanout happens after the call returns), + * the implementation should populate it when presentDisplay is + * called for frame N+1. + */ + @nullable Buffer bufferAhead; + + /** * Provides the region of the source buffer which has been modified since * the last frame. This region does not need to be validated before * calling presentDisplay. 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 32a8ea8a31..026a43143a 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 @@ -1205,6 +1205,7 @@ class GraphicsComposerAidlCommandTest : public GraphicsComposerAidlTest { const auto errors = mReader.takeErrors(); ASSERT_TRUE(mReader.takeErrors().empty()); ASSERT_TRUE(mReader.takeChangedCompositionTypes(mPrimaryDisplay).empty()); + ASSERT_TRUE(mReader.takeBufferAheadResultLayers(mPrimaryDisplay).empty()); ASSERT_NO_FATAL_FAILURE(GraphicsComposerAidlTest::TearDown()); } diff --git a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h index f9e35e94e0..8f8c98f7f0 100644 --- a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h +++ b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientReader.h @@ -77,6 +77,10 @@ class ComposerClientReader { parseSetClientTargetProperty(std::move( result.get<CommandResultPayload::Tag::clientTargetProperty>())); break; + case CommandResultPayload::Tag::bufferAheadResult: + parseSetBufferAheadResultLayers( + result.get<CommandResultPayload::Tag::bufferAheadResult>()); + break; } } } @@ -168,6 +172,16 @@ class ComposerClientReader { return std::move(data.clientTargetProperty); } + std::vector<BufferAheadResult::Layer> takeBufferAheadResultLayers(int64_t display) { + const auto found = mReturnData.find(display); + + if (found == mReturnData.end()) { + return {}; + } + + return std::move(found->second.bufferAheadResultLayers); + } + private: void resetData() { mErrors.clear(); @@ -206,12 +220,18 @@ class ComposerClientReader { data.clientTargetProperty = std::move(clientTargetProperty); } + void parseSetBufferAheadResultLayers(const BufferAheadResult& bufferAheadResult) { + auto& data = mReturnData[bufferAheadResult.display]; + data.bufferAheadResultLayers = std::move(bufferAheadResult.layers); + } + struct ReturnData { DisplayRequest displayRequests; std::vector<ChangedCompositionLayer> changedLayers; ndk::ScopedFileDescriptor presentFence; std::vector<ReleaseFences::Layer> releasedLayers; PresentOrValidate::Result presentOrValidateState; + std::vector<BufferAheadResult::Layer> bufferAheadResultLayers; ClientTargetPropertyWithNits clientTargetProperty = { .clientTargetProperty = {common::PixelFormat::RGBA_8888, Dataspace::UNKNOWN}, diff --git a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h index d3266e7623..d429b76f63 100644 --- a/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h +++ b/graphics/composer/aidl/include/android/hardware/graphics/composer3/ComposerClientWriter.h @@ -131,6 +131,11 @@ class ComposerClientWriter { getLayerCommand(display, layer).buffer = getBuffer(slot, buffer, acquireFence); } + void setLayerBufferAhead(int64_t display, int64_t layer, uint32_t slot, + const native_handle_t* buffer, int acquireFence) { + getLayerCommand(display, layer).bufferAhead = getBuffer(slot, buffer, acquireFence); + } + void setLayerSurfaceDamage(int64_t display, int64_t layer, const std::vector<Rect>& damage) { getLayerCommand(display, layer).damage.emplace(damage.begin(), damage.end()); } |