blob: 42ba9a957b59c438075d595507db8257bd679a27 [file] [log] [blame]
Ady Abraham9fc28052021-10-14 17:21:38 -07001/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include "ComposerHal.h"
20
21#include <optional>
22#include <string>
23#include <unordered_map>
24#include <utility>
25#include <vector>
26
27// TODO(b/129481165): remove the #pragma below and fix conversion issues
28#pragma clang diagnostic push
29#pragma clang diagnostic ignored "-Wconversion"
30#pragma clang diagnostic ignored "-Wextra"
31
32#include <composer-command-buffer/2.4/ComposerCommandBuffer.h>
33#include <gui/BufferQueue.h>
34#include <gui/HdrMetadata.h>
35#include <math/mat4.h>
36#include <ui/DisplayedFrameStats.h>
37#include <ui/GraphicBuffer.h>
38#include <utils/StrongPointer.h>
39
Leon Scroggins III2e1aa182021-12-01 17:33:12 -050040#include <aidl/android/hardware/graphics/composer3/Composition.h>
41
Ady Abraham9fc28052021-10-14 17:21:38 -070042// TODO(b/129481165): remove the #pragma below and fix conversion issues
43#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"
44
45namespace android::Hwc2 {
46
47namespace types = hardware::graphics::common;
48
49namespace V2_1 = hardware::graphics::composer::V2_1;
50namespace V2_2 = hardware::graphics::composer::V2_2;
51namespace V2_3 = hardware::graphics::composer::V2_3;
52namespace V2_4 = hardware::graphics::composer::V2_4;
53
54using types::V1_0::ColorTransform;
55using types::V1_0::Transform;
56using types::V1_1::RenderIntent;
57using types::V1_2::ColorMode;
58using types::V1_2::Dataspace;
Ady Abraham9fc28052021-10-14 17:21:38 -070059using types::V1_2::PixelFormat;
60
61using V2_1::Config;
62using V2_1::Display;
Ady Abraham9fc28052021-10-14 17:21:38 -070063using V2_1::Layer;
64using V2_4::CommandReaderBase;
65using V2_4::CommandWriterBase;
66using V2_4::IComposer;
67using V2_4::IComposerCallback;
68using V2_4::IComposerClient;
69using V2_4::VsyncPeriodChangeTimeline;
70using V2_4::VsyncPeriodNanos;
Ady Abraham9fc28052021-10-14 17:21:38 -070071using PerFrameMetadata = IComposerClient::PerFrameMetadata;
72using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey;
73using PerFrameMetadataBlob = IComposerClient::PerFrameMetadataBlob;
74
75class CommandReader : public CommandReaderBase {
76public:
77 ~CommandReader();
78
79 // Parse and execute commands from the command queue. The commands are
80 // actually return values from the server and will be saved in ReturnData.
81 Error parse();
82
83 // Get and clear saved errors.
84 struct CommandError {
85 uint32_t location;
86 Error error;
87 };
88 std::vector<CommandError> takeErrors();
89
90 bool hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
91 uint32_t* outNumLayerRequestMasks) const;
92
93 // Get and clear saved changed composition types.
Leon Scroggins III2e1aa182021-12-01 17:33:12 -050094 void takeChangedCompositionTypes(
95 Display display, std::vector<Layer>* outLayers,
96 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes);
Ady Abraham9fc28052021-10-14 17:21:38 -070097
98 // Get and clear saved display requests.
99 void takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
100 std::vector<Layer>* outLayers,
101 std::vector<uint32_t>* outLayerRequestMasks);
102
103 // Get and clear saved release fences.
104 void takeReleaseFences(Display display, std::vector<Layer>* outLayers,
105 std::vector<int>* outReleaseFences);
106
107 // Get and clear saved present fence.
108 void takePresentFence(Display display, int* outPresentFence);
109
110 // Get what stage succeeded during PresentOrValidate: Present or Validate
111 void takePresentOrValidateStage(Display display, uint32_t* state);
112
113 // Get the client target properties requested by hardware composer.
114 void takeClientTargetProperty(Display display,
115 IComposerClient::ClientTargetProperty* outClientTargetProperty);
116
117private:
118 void resetData();
119
120 bool parseSelectDisplay(uint16_t length);
121 bool parseSetError(uint16_t length);
122 bool parseSetChangedCompositionTypes(uint16_t length);
123 bool parseSetDisplayRequests(uint16_t length);
124 bool parseSetPresentFence(uint16_t length);
125 bool parseSetReleaseFences(uint16_t length);
126 bool parseSetPresentOrValidateDisplayResult(uint16_t length);
127 bool parseSetClientTargetProperty(uint16_t length);
128
129 struct ReturnData {
130 uint32_t displayRequests = 0;
131
132 std::vector<Layer> changedLayers;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500133 std::vector<aidl::android::hardware::graphics::composer3::Composition> compositionTypes;
Ady Abraham9fc28052021-10-14 17:21:38 -0700134
135 std::vector<Layer> requestedLayers;
136 std::vector<uint32_t> requestMasks;
137
138 int presentFence = -1;
139
140 std::vector<Layer> releasedLayers;
141 std::vector<int> releaseFences;
142
143 uint32_t presentOrValidateState;
144
145 // Composer 2.4 implementation can return a client target property
146 // structure to indicate the client target properties that hardware
147 // composer requests. The composer client must change the client target
148 // properties to match this request.
149 IComposerClient::ClientTargetProperty clientTargetProperty{PixelFormat::RGBA_8888,
150 Dataspace::UNKNOWN};
151 };
152
153 std::vector<CommandError> mErrors;
154 std::unordered_map<Display, ReturnData> mReturnData;
155
156 // When SELECT_DISPLAY is parsed, this is updated to point to the
157 // display's return data in mReturnData. We use it to avoid repeated
158 // map lookups.
159 ReturnData* mCurrentReturnData;
160};
161
162// Composer is a wrapper to IComposer, a proxy to server-side composer.
163class HidlComposer final : public Composer {
164public:
165 explicit HidlComposer(const std::string& serviceName);
166 ~HidlComposer() override;
167
Ady Abraham4d211cf2021-12-14 16:19:03 -0800168 bool isSupported(OptionalFeature) const;
ramindani19919ff2023-12-07 11:27:06 -0800169 bool isVrrSupported() const;
Ady Abraham4d211cf2021-12-14 16:19:03 -0800170
Ady Abrahamde549d42022-01-26 19:19:17 -0800171 std::vector<aidl::android::hardware::graphics::composer3::Capability> getCapabilities()
172 override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700173 std::string dumpDebugInfo() override;
174
Yichi Chen3401b562022-01-17 15:42:35 +0800175 void registerCallback(HWC2::ComposerCallback& callback) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700176
Ady Abraham9fc28052021-10-14 17:21:38 -0700177 // Explicitly flush all pending commands in the command buffer.
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400178 Error executeCommands(Display) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700179
180 uint32_t getMaxVirtualDisplayCount() override;
181 Error createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
182 Display* outDisplay) override;
183 Error destroyVirtualDisplay(Display display) override;
184
185 Error acceptDisplayChanges(Display display) override;
186
187 Error createLayer(Display display, Layer* outLayer) override;
188 Error destroyLayer(Display display, Layer layer) override;
189
190 Error getActiveConfig(Display display, Config* outConfig) override;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500191 Error getChangedCompositionTypes(
192 Display display, std::vector<Layer>* outLayers,
193 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes)
194 override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700195 Error getColorModes(Display display, std::vector<ColorMode>* outModes) override;
196 Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute,
197 int32_t* outValue) override;
198 Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs);
ramindani263a3f12023-07-18 20:44:49 -0700199 Error getDisplayConfigurations(Display, int32_t maxFrameIntervalNs,
200 std::vector<DisplayConfiguration>*);
Ady Abraham9fc28052021-10-14 17:21:38 -0700201 Error getDisplayName(Display display, std::string* outName) override;
202
203 Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
204 std::vector<Layer>* outLayers,
205 std::vector<uint32_t>* outLayerRequestMasks) override;
206
207 Error getDozeSupport(Display display, bool* outSupport) override;
ramindani32cf0602022-03-02 02:30:29 +0000208 Error hasDisplayIdleTimerCapability(Display display, bool* outSupport) override;
Marc Kassisbdf7e4b2022-11-04 17:26:48 +0100209 Error getHdrCapabilities(Display display, std::vector<Hdr>* outHdrTypes, float* outMaxLuminance,
Ady Abraham9fc28052021-10-14 17:21:38 -0700210 float* outMaxAverageLuminance, float* outMinLuminance) override;
Sally Qi0cbd08b2022-08-17 12:12:28 -0700211 Error getOverlaySupport(aidl::android::hardware::graphics::composer3::OverlayProperties*
212 outProperties) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700213
214 Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
215 std::vector<int>* outReleaseFences) override;
216
217 Error presentDisplay(Display display, int* outPresentFence) override;
218
219 Error setActiveConfig(Display display, Config config) override;
220
221 /*
222 * The composer caches client targets internally. When target is nullptr,
223 * the composer uses slot to look up the client target from its cache.
224 * When target is not nullptr, the cache is updated with the new target.
225 */
226 Error setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
227 int acquireFence, Dataspace dataspace,
Alec Mourif97df4d2023-09-06 02:10:05 +0000228 const std::vector<IComposerClient::Rect>& damage,
229 float hdrSdrRatio) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700230 Error setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) override;
Ady Abrahamdc011a92021-12-21 14:06:44 -0800231 Error setColorTransform(Display display, const float* matrix) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700232 Error setOutputBuffer(Display display, const native_handle_t* buffer,
233 int releaseFence) override;
234 Error setPowerMode(Display display, IComposerClient::PowerMode mode) override;
235 Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override;
236
237 Error setClientTargetSlotCount(Display display) override;
238
ramindani09acbb82023-11-03 09:02:38 -0700239 Error validateDisplay(Display display, nsecs_t expectedPresentTime, int32_t frameIntervalNs,
240 uint32_t* outNumTypes, uint32_t* outNumRequests) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700241
Ady Abraham43065bd2021-12-10 17:22:15 -0800242 Error presentOrValidateDisplay(Display display, nsecs_t expectedPresentTime,
ramindani4aac32c2023-10-30 14:13:30 -0700243 int32_t frameIntervalNs, uint32_t* outNumTypes,
244 uint32_t* outNumRequests, int* outPresentFence,
245 uint32_t* state) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700246
247 Error setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) override;
248 /* see setClientTarget for the purpose of slot */
249 Error setLayerBuffer(Display display, Layer layer, uint32_t slot,
250 const sp<GraphicBuffer>& buffer, int acquireFence) override;
Brian Lindahlb158a5c2022-12-15 15:21:13 -0700251 Error setLayerBufferSlotsToClear(Display display, Layer layer,
252 const std::vector<uint32_t>& slotsToClear,
253 uint32_t activeBufferSlot) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700254 Error setLayerSurfaceDamage(Display display, Layer layer,
255 const std::vector<IComposerClient::Rect>& damage) override;
256 Error setLayerBlendMode(Display display, Layer layer, IComposerClient::BlendMode mode) override;
Ady Abraham6e60b142022-01-06 18:10:35 -0800257 Error setLayerColor(Display display, Layer layer,
258 const aidl::android::hardware::graphics::composer3::Color& color) override;
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500259 Error setLayerCompositionType(
260 Display display, Layer layer,
261 aidl::android::hardware::graphics::composer3::Composition type) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700262 Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) override;
263 Error setLayerDisplayFrame(Display display, Layer layer,
264 const IComposerClient::Rect& frame) override;
265 Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
266 Error setLayerSidebandStream(Display display, Layer layer,
267 const native_handle_t* stream) override;
268 Error setLayerSourceCrop(Display display, Layer layer,
269 const IComposerClient::FRect& crop) override;
270 Error setLayerTransform(Display display, Layer layer, Transform transform) override;
271 Error setLayerVisibleRegion(Display display, Layer layer,
272 const std::vector<IComposerClient::Rect>& visible) override;
273 Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
274
275 // Composer HAL 2.2
276 Error setLayerPerFrameMetadata(
277 Display display, Layer layer,
278 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) override;
279 std::vector<IComposerClient::PerFrameMetadataKey> getPerFrameMetadataKeys(
280 Display display) override;
281 Error getRenderIntents(Display display, ColorMode colorMode,
282 std::vector<RenderIntent>* outRenderIntents) override;
283 Error getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) override;
284
285 // Composer HAL 2.3
286 Error getDisplayIdentificationData(Display display, uint8_t* outPort,
287 std::vector<uint8_t>* outData) override;
288 Error setLayerColorTransform(Display display, Layer layer, const float* matrix) override;
289 Error getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
290 Dataspace* outDataspace,
291 uint8_t* outComponentMask) override;
292 Error setDisplayContentSamplingEnabled(Display display, bool enabled, uint8_t componentMask,
293 uint64_t maxFrames) override;
294 Error getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp,
295 DisplayedFrameStats* outStats) override;
296 Error setLayerPerFrameMetadataBlobs(
297 Display display, Layer layer,
298 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) override;
Alec Mouri4d8a05d2022-03-23 18:14:26 +0000299 Error setDisplayBrightness(Display display, float brightness, float brightnessNits,
Alec Mouricdf16792021-12-10 13:16:06 -0800300 const DisplayBrightnessOptions& options) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700301
302 // Composer HAL 2.4
Leon Scroggins III5967aec2021-12-29 11:14:22 -0500303 Error getDisplayCapabilities(
304 Display display,
305 std::vector<aidl::android::hardware::graphics::composer3::DisplayCapability>*
306 outCapabilities) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700307 V2_4::Error getDisplayConnectionType(Display display,
308 IComposerClient::DisplayConnectionType* outType) override;
309 V2_4::Error getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) override;
Manasi Navarefc2a4a72024-11-12 23:59:21 +0000310 Error setActiveConfigWithConstraints(
Ady Abraham9fc28052021-10-14 17:21:38 -0700311 Display display, Config config,
312 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
313 VsyncPeriodChangeTimeline* outTimeline) override;
314 V2_4::Error setAutoLowLatencyMode(Display displayId, bool on) override;
315 V2_4::Error getSupportedContentTypes(
316 Display displayId,
317 std::vector<IComposerClient::ContentType>* outSupportedContentTypes) override;
318 V2_4::Error setContentType(Display displayId,
319 IComposerClient::ContentType contentType) override;
320 V2_4::Error setLayerGenericMetadata(Display display, Layer layer, const std::string& key,
321 bool mandatory, const std::vector<uint8_t>& value) override;
322 V2_4::Error getLayerGenericMetadataKeys(
323 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) override;
Alec Mouri85065692022-03-18 00:58:26 +0000324 Error getClientTargetProperty(
325 Display display,
326 aidl::android::hardware::graphics::composer3::ClientTargetPropertyWithBrightness*
327 outClientTargetProperty) override;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -0500328
329 // AIDL Composer HAL
Alec Mouri6da0e272022-02-07 12:45:57 -0800330 Error setLayerBrightness(Display display, Layer layer, float brightness) override;
Leon Scroggins IIId77d3162022-01-05 10:42:28 -0500331 Error setLayerBlockingRegion(Display display, Layer layer,
332 const std::vector<IComposerClient::Rect>& blocking) override;
Kriti Dang7defaf32021-11-15 11:55:43 +0100333 Error setBootDisplayConfig(Display displayId, Config) override;
334 Error clearBootDisplayConfig(Display displayId) override;
335 Error getPreferredBootDisplayConfig(Display displayId, Config*) override;
Leon Scroggins IIIe7c51c62022-02-01 15:53:54 -0500336 Error getDisplayDecorationSupport(
337 Display display,
338 std::optional<aidl::android::hardware::graphics::common::DisplayDecorationSupport>*
339 support) override;
ramindani32cf0602022-03-02 02:30:29 +0000340 Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) override;
Ady Abraham9fc28052021-10-14 17:21:38 -0700341
ramindani06e518e2022-03-14 18:47:53 +0000342 Error getPhysicalDisplayOrientation(Display displayId,
343 AidlTransform* outDisplayOrientation) override;
Leon Scroggins IIIe24d78f2022-09-20 16:38:19 -0400344 void onHotplugConnect(Display) override;
345 void onHotplugDisconnect(Display) override;
Kriti Dang674b9372022-11-18 10:58:44 +0100346 Error getHdrConversionCapabilities(
347 std::vector<aidl::android::hardware::graphics::common::HdrConversionCapability>*)
348 override;
Kriti Dangd432bb52023-02-09 18:21:04 +0100349 Error setHdrConversionStrategy(aidl::android::hardware::graphics::common::HdrConversionStrategy,
350 Hdr*) override;
ramindanib2158ee2023-02-13 20:29:59 -0800351 Error setRefreshRateChangedCallbackDebugEnabled(Display, bool) override;
ramindani3acaaf52023-09-25 10:31:27 -0700352 Error notifyExpectedPresent(Display, nsecs_t, int32_t) override;
Sally Qi11dcd582024-08-16 18:11:27 -0700353 Error getRequestedLuts(
Sally Qi95f669a2024-08-27 11:31:42 -0700354 Display, std::vector<Layer>*,
Sally Qi11dcd582024-08-16 18:11:27 -0700355 std::vector<aidl::android::hardware::graphics::composer3::DisplayLuts::LayerLut>*)
356 override;
357 Error setLayerLuts(Display, Layer,
Sally Qi0abc4a52024-09-26 16:13:06 -0700358 aidl::android::hardware::graphics::composer3::Luts&) override;
Brian Lindahl7a4cb7e2024-10-30 10:42:21 -0600359 Error getMaxLayerPictureProfiles(Display, int32_t* outMaxProfiles) override;
360 Error setDisplayPictureProfileId(Display, PictureProfileId) override;
361 Error setLayerPictureProfileId(Display, Layer, PictureProfileId) override;
ramindani06e518e2022-03-14 18:47:53 +0000362
Ady Abraham9fc28052021-10-14 17:21:38 -0700363private:
364 class CommandWriter : public CommandWriterBase {
365 public:
366 explicit CommandWriter(uint32_t initialMaxSize) : CommandWriterBase(initialMaxSize) {}
367 ~CommandWriter() override {}
368 };
369
Yichi Chen3401b562022-01-17 15:42:35 +0800370 void registerCallback(const sp<IComposerCallback>& callback);
371
Ady Abraham9fc28052021-10-14 17:21:38 -0700372 // Many public functions above simply write a command into the command
373 // queue to batch the calls. validateDisplay and presentDisplay will call
374 // this function to execute the command queue.
375 Error execute();
376
377 sp<V2_1::IComposer> mComposer;
378
379 sp<V2_1::IComposerClient> mClient;
380 sp<V2_2::IComposerClient> mClient_2_2;
381 sp<V2_3::IComposerClient> mClient_2_3;
382 sp<IComposerClient> mClient_2_4;
383
Brian Lindahl90553da2022-12-06 13:36:30 -0700384 // Buffer slots for layers are cleared by setting the slot buffer to this buffer.
385 sp<GraphicBuffer> mClearSlotBuffer;
386
Ady Abraham9fc28052021-10-14 17:21:38 -0700387 // 64KiB minus a small space for metadata such as read/write pointers
388 static constexpr size_t kWriterInitialSize = 64 * 1024 / sizeof(uint32_t) - 16;
389 // Max number of buffers that may be cached for a given layer
390 // We obtain this number by:
391 // 1. Tightly coupling this cache to the max size of BufferQueue
392 // 2. Adding an additional slot for the layer caching feature in SurfaceFlinger (see: Planner.h)
393 static const constexpr uint32_t kMaxLayerBufferCount = BufferQueue::NUM_BUFFER_SLOTS + 1;
394 CommandWriter mWriter;
395 CommandReader mReader;
396};
397
398} // namespace android::Hwc2