blob: d3acecb46c4e2cf8e329500b3b832b3e7a2cd059 [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// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
20
21#undef LOG_TAG
22#define LOG_TAG "HwcComposer"
23#define ATRACE_TAG ATRACE_TAG_GRAPHICS
24
25#include "HidlComposerHal.h"
26
27#include <android/binder_manager.h>
28#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
29#include <hidl/HidlTransportSupport.h>
30#include <hidl/HidlTransportUtils.h>
31#include <log/log.h>
32#include <utils/Trace.h>
Leon Scroggins III09c25412021-12-02 14:49:56 -050033#include "Hal.h"
Ady Abraham9fc28052021-10-14 17:21:38 -070034
35#include <algorithm>
36#include <cinttypes>
37
Leon Scroggins III5967aec2021-12-29 11:14:22 -050038using aidl::android::hardware::graphics::composer3::DisplayCapability;
39
Ady Abraham9fc28052021-10-14 17:21:38 -070040namespace android {
41
42using hardware::hidl_handle;
43using hardware::hidl_vec;
44using hardware::Return;
45
46namespace Hwc2 {
47
48HidlComposer::~HidlComposer() = default;
49
50namespace {
51
52class BufferHandle {
53public:
54 explicit BufferHandle(const native_handle_t* buffer) {
55 // nullptr is not a valid handle to HIDL
56 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0);
57 }
58
59 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
60 {
61 return mHandle;
62 }
63
64private:
65 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0);
66 hidl_handle mHandle;
67};
68
69class FenceHandle {
70public:
71 FenceHandle(int fd, bool owned) : mOwned(owned) {
72 native_handle_t* handle;
73 if (fd >= 0) {
74 handle = native_handle_init(mStorage, 1, 0);
75 handle->data[0] = fd;
76 } else {
77 // nullptr is not a valid handle to HIDL
78 handle = native_handle_init(mStorage, 0, 0);
79 }
80 mHandle = handle;
81 }
82
83 ~FenceHandle() {
84 if (mOwned) {
85 native_handle_close(mHandle);
86 }
87 }
88
89 operator const hidl_handle&() const // NOLINT(google-explicit-constructor)
90 {
91 return mHandle;
92 }
93
94private:
95 bool mOwned;
96 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0);
97 hidl_handle mHandle;
98};
99
100// assume NO_RESOURCES when Status::isOk returns false
101constexpr Error kDefaultError = Error::NO_RESOURCES;
102constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError);
103
104template <typename T, typename U>
105T unwrapRet(Return<T>& ret, const U& default_val) {
106 return (ret.isOk()) ? static_cast<T>(ret) : static_cast<T>(default_val);
107}
108
109Error unwrapRet(Return<Error>& ret) {
110 return unwrapRet(ret, kDefaultError);
111}
112
113} // anonymous namespace
114
115HidlComposer::HidlComposer(const std::string& serviceName) : mWriter(kWriterInitialSize) {
116 mComposer = V2_1::IComposer::getService(serviceName);
117
118 if (mComposer == nullptr) {
119 LOG_ALWAYS_FATAL("failed to get hwcomposer service");
120 }
121
122 if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) {
123 composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) {
124 if (tmpError == V2_4::Error::NONE) {
125 mClient = tmpClient;
126 mClient_2_2 = tmpClient;
127 mClient_2_3 = tmpClient;
128 mClient_2_4 = tmpClient;
129 }
130 });
131 } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) {
132 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) {
133 if (tmpError == Error::NONE) {
134 mClient = tmpClient;
135 mClient_2_2 = tmpClient;
136 mClient_2_3 = tmpClient;
137 }
138 });
139 } else {
140 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) {
141 if (tmpError != Error::NONE) {
142 return;
143 }
144
145 mClient = tmpClient;
146 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) {
147 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient);
148 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr,
149 "IComposer 2.2 did not return IComposerClient 2.2");
150 }
151 });
152 }
153
154 if (mClient == nullptr) {
155 LOG_ALWAYS_FATAL("failed to create composer client");
156 }
157}
158
Ady Abraham4d211cf2021-12-14 16:19:03 -0800159bool HidlComposer::isSupported(OptionalFeature feature) const {
160 switch (feature) {
161 case OptionalFeature::RefreshRateSwitching:
162 return mClient_2_4 != nullptr;
Ady Abraham43065bd2021-12-10 17:22:15 -0800163 case OptionalFeature::ExpectedPresentTime:
Alec Mouricdf16792021-12-10 13:16:06 -0800164 case OptionalFeature::DisplayBrightnessCommand:
Kriti Dang7defaf32021-11-15 11:55:43 +0100165 case OptionalFeature::BootDisplayConfig:
Ady Abraham43065bd2021-12-10 17:22:15 -0800166 return false;
Ady Abraham4d211cf2021-12-14 16:19:03 -0800167 }
168}
169
Ady Abraham9fc28052021-10-14 17:21:38 -0700170std::vector<IComposer::Capability> HidlComposer::getCapabilities() {
171 std::vector<IComposer::Capability> capabilities;
172 mComposer->getCapabilities(
173 [&](const auto& tmpCapabilities) { capabilities = tmpCapabilities; });
174 return capabilities;
175}
176
177std::string HidlComposer::dumpDebugInfo() {
178 std::string info;
179 mComposer->dumpDebugInfo([&](const auto& tmpInfo) { info = tmpInfo.c_str(); });
180
181 return info;
182}
183
184void HidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
185 android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2);
186
187 auto ret = [&]() {
188 if (mClient_2_4) {
189 return mClient_2_4->registerCallback_2_4(callback);
190 }
191 return mClient->registerCallback(callback);
192 }();
193 if (!ret.isOk()) {
194 ALOGE("failed to register IComposerCallback");
195 }
196}
197
198void HidlComposer::resetCommands() {
199 mWriter.reset();
200}
201
202Error HidlComposer::executeCommands() {
203 return execute();
204}
205
206uint32_t HidlComposer::getMaxVirtualDisplayCount() {
207 auto ret = mClient->getMaxVirtualDisplayCount();
208 return unwrapRet(ret, 0);
209}
210
211Error HidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
212 Display* outDisplay) {
213 const uint32_t bufferSlotCount = 1;
214 Error error = kDefaultError;
215 if (mClient_2_2) {
216 mClient_2_2->createVirtualDisplay_2_2(width, height,
217 static_cast<types::V1_1::PixelFormat>(*format),
218 bufferSlotCount,
219 [&](const auto& tmpError, const auto& tmpDisplay,
220 const auto& tmpFormat) {
221 error = tmpError;
222 if (error != Error::NONE) {
223 return;
224 }
225
226 *outDisplay = tmpDisplay;
227 *format = static_cast<types::V1_2::PixelFormat>(
228 tmpFormat);
229 });
230 } else {
231 mClient->createVirtualDisplay(width, height, static_cast<types::V1_0::PixelFormat>(*format),
232 bufferSlotCount,
233 [&](const auto& tmpError, const auto& tmpDisplay,
234 const auto& tmpFormat) {
235 error = tmpError;
236 if (error != Error::NONE) {
237 return;
238 }
239
240 *outDisplay = tmpDisplay;
241 *format = static_cast<PixelFormat>(tmpFormat);
242 });
243 }
244
245 return error;
246}
247
248Error HidlComposer::destroyVirtualDisplay(Display display) {
249 auto ret = mClient->destroyVirtualDisplay(display);
250 return unwrapRet(ret);
251}
252
253Error HidlComposer::acceptDisplayChanges(Display display) {
254 mWriter.selectDisplay(display);
255 mWriter.acceptDisplayChanges();
256 return Error::NONE;
257}
258
259Error HidlComposer::createLayer(Display display, Layer* outLayer) {
260 Error error = kDefaultError;
261 mClient->createLayer(display, kMaxLayerBufferCount,
262 [&](const auto& tmpError, const auto& tmpLayer) {
263 error = tmpError;
264 if (error != Error::NONE) {
265 return;
266 }
267
268 *outLayer = tmpLayer;
269 });
270
271 return error;
272}
273
274Error HidlComposer::destroyLayer(Display display, Layer layer) {
275 auto ret = mClient->destroyLayer(display, layer);
276 return unwrapRet(ret);
277}
278
279Error HidlComposer::getActiveConfig(Display display, Config* outConfig) {
280 Error error = kDefaultError;
281 mClient->getActiveConfig(display, [&](const auto& tmpError, const auto& tmpConfig) {
282 error = tmpError;
283 if (error != Error::NONE) {
284 return;
285 }
286
287 *outConfig = tmpConfig;
288 });
289
290 return error;
291}
292
293Error HidlComposer::getChangedCompositionTypes(
294 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500295 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700296 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
297 return Error::NONE;
298}
299
300Error HidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
301 Error error = kDefaultError;
302
303 if (mClient_2_3) {
304 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) {
305 error = tmpError;
306 if (error != Error::NONE) {
307 return;
308 }
309
310 *outModes = tmpModes;
311 });
312 } else if (mClient_2_2) {
313 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) {
314 error = tmpError;
315 if (error != Error::NONE) {
316 return;
317 }
318
319 for (types::V1_1::ColorMode colorMode : tmpModes) {
320 outModes->push_back(static_cast<ColorMode>(colorMode));
321 }
322 });
323 } else {
324 mClient->getColorModes(display, [&](const auto& tmpError, const auto& tmpModes) {
325 error = tmpError;
326 if (error != Error::NONE) {
327 return;
328 }
329 for (types::V1_0::ColorMode colorMode : tmpModes) {
330 outModes->push_back(static_cast<ColorMode>(colorMode));
331 }
332 });
333 }
334
335 return error;
336}
337
338Error HidlComposer::getDisplayAttribute(Display display, Config config,
339 IComposerClient::Attribute attribute, int32_t* outValue) {
340 Error error = kDefaultError;
341 if (mClient_2_4) {
342 mClient_2_4->getDisplayAttribute_2_4(display, config, attribute,
343 [&](const auto& tmpError, const auto& tmpValue) {
344 error = static_cast<Error>(tmpError);
345 if (error != Error::NONE) {
346 return;
347 }
348
349 *outValue = tmpValue;
350 });
351 } else {
352 mClient->getDisplayAttribute(display, config,
353 static_cast<V2_1::IComposerClient::Attribute>(attribute),
354 [&](const auto& tmpError, const auto& tmpValue) {
355 error = tmpError;
356 if (error != Error::NONE) {
357 return;
358 }
359
360 *outValue = tmpValue;
361 });
362 }
363
364 return error;
365}
366
367Error HidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
368 Error error = kDefaultError;
369 mClient->getDisplayConfigs(display, [&](const auto& tmpError, const auto& tmpConfigs) {
370 error = tmpError;
371 if (error != Error::NONE) {
372 return;
373 }
374
375 *outConfigs = tmpConfigs;
376 });
377
378 return error;
379}
380
381Error HidlComposer::getDisplayName(Display display, std::string* outName) {
382 Error error = kDefaultError;
383 mClient->getDisplayName(display, [&](const auto& tmpError, const auto& tmpName) {
384 error = tmpError;
385 if (error != Error::NONE) {
386 return;
387 }
388
389 *outName = tmpName.c_str();
390 });
391
392 return error;
393}
394
395Error HidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
396 std::vector<Layer>* outLayers,
397 std::vector<uint32_t>* outLayerRequestMasks) {
398 mReader.takeDisplayRequests(display, outDisplayRequestMask, outLayers, outLayerRequestMasks);
399 return Error::NONE;
400}
401
402Error HidlComposer::getDozeSupport(Display display, bool* outSupport) {
403 Error error = kDefaultError;
404 mClient->getDozeSupport(display, [&](const auto& tmpError, const auto& tmpSupport) {
405 error = tmpError;
406 if (error != Error::NONE) {
407 return;
408 }
409
410 *outSupport = tmpSupport;
411 });
412
413 return error;
414}
415
416Error HidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
417 float* outMaxLuminance, float* outMaxAverageLuminance,
418 float* outMinLuminance) {
419 Error error = kDefaultError;
420 if (mClient_2_3) {
421 mClient_2_3->getHdrCapabilities_2_3(display,
422 [&](const auto& tmpError, const auto& tmpTypes,
423 const auto& tmpMaxLuminance,
424 const auto& tmpMaxAverageLuminance,
425 const auto& tmpMinLuminance) {
426 error = tmpError;
427 if (error != Error::NONE) {
428 return;
429 }
430
431 *outTypes = tmpTypes;
432 *outMaxLuminance = tmpMaxLuminance;
433 *outMaxAverageLuminance = tmpMaxAverageLuminance;
434 *outMinLuminance = tmpMinLuminance;
435 });
436 } else {
437 mClient->getHdrCapabilities(display,
438 [&](const auto& tmpError, const auto& tmpTypes,
439 const auto& tmpMaxLuminance,
440 const auto& tmpMaxAverageLuminance,
441 const auto& tmpMinLuminance) {
442 error = tmpError;
443 if (error != Error::NONE) {
444 return;
445 }
446
447 outTypes->clear();
448 for (auto type : tmpTypes) {
449 outTypes->push_back(static_cast<Hdr>(type));
450 }
451
452 *outMaxLuminance = tmpMaxLuminance;
453 *outMaxAverageLuminance = tmpMaxAverageLuminance;
454 *outMinLuminance = tmpMinLuminance;
455 });
456 }
457
458 return error;
459}
460
461Error HidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
462 std::vector<int>* outReleaseFences) {
463 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
464 return Error::NONE;
465}
466
467Error HidlComposer::presentDisplay(Display display, int* outPresentFence) {
468 ATRACE_NAME("HwcPresentDisplay");
469 mWriter.selectDisplay(display);
470 mWriter.presentDisplay();
471
472 Error error = execute();
473 if (error != Error::NONE) {
474 return error;
475 }
476
477 mReader.takePresentFence(display, outPresentFence);
478
479 return Error::NONE;
480}
481
482Error HidlComposer::setActiveConfig(Display display, Config config) {
483 auto ret = mClient->setActiveConfig(display, config);
484 return unwrapRet(ret);
485}
486
487Error HidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
488 int acquireFence, Dataspace dataspace,
489 const std::vector<IComposerClient::Rect>& damage) {
490 mWriter.selectDisplay(display);
491
492 const native_handle_t* handle = nullptr;
493 if (target.get()) {
494 handle = target->getNativeBuffer()->handle;
495 }
496
497 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage);
498 return Error::NONE;
499}
500
501Error HidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
502 hardware::Return<Error> ret(kDefaultError);
503 if (mClient_2_3) {
504 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent);
505 } else if (mClient_2_2) {
506 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode),
507 renderIntent);
508 } else {
509 ret = mClient->setColorMode(display, static_cast<types::V1_0::ColorMode>(mode));
510 }
511 return unwrapRet(ret);
512}
513
Ady Abrahamdc011a92021-12-21 14:06:44 -0800514Error HidlComposer::setColorTransform(Display display, const float* matrix) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700515 mWriter.selectDisplay(display);
Ady Abrahamdc011a92021-12-21 14:06:44 -0800516 const bool isIdentity = (mat4(matrix) == mat4());
517 mWriter.setColorTransform(matrix,
518 isIdentity ? ColorTransform::IDENTITY
519 : ColorTransform::ARBITRARY_MATRIX);
Ady Abraham9fc28052021-10-14 17:21:38 -0700520 return Error::NONE;
521}
522
523Error HidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
524 int releaseFence) {
525 mWriter.selectDisplay(display);
526 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
527 return Error::NONE;
528}
529
530Error HidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
531 Return<Error> ret(Error::UNSUPPORTED);
532 if (mClient_2_2) {
533 ret = mClient_2_2->setPowerMode_2_2(display, mode);
534 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
535 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode));
536 }
537
538 return unwrapRet(ret);
539}
540
541Error HidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
542 auto ret = mClient->setVsyncEnabled(display, enabled);
543 return unwrapRet(ret);
544}
545
546Error HidlComposer::setClientTargetSlotCount(Display display) {
547 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
548 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount);
549 return unwrapRet(ret);
550}
551
Ady Abraham43065bd2021-12-10 17:22:15 -0800552Error HidlComposer::validateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
553 uint32_t* outNumTypes, uint32_t* outNumRequests) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700554 ATRACE_NAME("HwcValidateDisplay");
555 mWriter.selectDisplay(display);
556 mWriter.validateDisplay();
557
558 Error error = execute();
559 if (error != Error::NONE) {
560 return error;
561 }
562
563 mReader.hasChanges(display, outNumTypes, outNumRequests);
564
565 return Error::NONE;
566}
567
Ady Abraham43065bd2021-12-10 17:22:15 -0800568Error HidlComposer::presentOrValidateDisplay(Display display, nsecs_t /*expectedPresentTime*/,
569 uint32_t* outNumTypes, uint32_t* outNumRequests,
570 int* outPresentFence, uint32_t* state) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700571 ATRACE_NAME("HwcPresentOrValidateDisplay");
572 mWriter.selectDisplay(display);
573 mWriter.presentOrvalidateDisplay();
574
575 Error error = execute();
576 if (error != Error::NONE) {
577 return error;
578 }
579
580 mReader.takePresentOrValidateStage(display, state);
581
582 if (*state == 1) { // Present succeeded
583 mReader.takePresentFence(display, outPresentFence);
584 }
585
586 if (*state == 0) { // Validate succeeded.
587 mReader.hasChanges(display, outNumTypes, outNumRequests);
588 }
589
590 return Error::NONE;
591}
592
593Error HidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
594 mWriter.selectDisplay(display);
595 mWriter.selectLayer(layer);
596 mWriter.setLayerCursorPosition(x, y);
597 return Error::NONE;
598}
599
600Error HidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
601 const sp<GraphicBuffer>& buffer, int acquireFence) {
602 mWriter.selectDisplay(display);
603 mWriter.selectLayer(layer);
604
605 const native_handle_t* handle = nullptr;
606 if (buffer.get()) {
607 handle = buffer->getNativeBuffer()->handle;
608 }
609
610 mWriter.setLayerBuffer(slot, handle, acquireFence);
611 return Error::NONE;
612}
613
614Error HidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
615 const std::vector<IComposerClient::Rect>& damage) {
616 mWriter.selectDisplay(display);
617 mWriter.selectLayer(layer);
618 mWriter.setLayerSurfaceDamage(damage);
619 return Error::NONE;
620}
621
622Error HidlComposer::setLayerBlendMode(Display display, Layer layer,
623 IComposerClient::BlendMode mode) {
624 mWriter.selectDisplay(display);
625 mWriter.selectLayer(layer);
626 mWriter.setLayerBlendMode(mode);
627 return Error::NONE;
628}
629
Ady Abraham6e60b142022-01-06 18:10:35 -0800630static IComposerClient::Color to_hidl_type(
631 aidl::android::hardware::graphics::composer3::Color color) {
632 const auto floatColorToUint8Clamped = [](float val) -> uint8_t {
633 const auto intVal = static_cast<uint64_t>(std::round(255.0f * val));
634 const auto minVal = static_cast<uint64_t>(0);
635 const auto maxVal = static_cast<uint64_t>(255);
636 return std::clamp(intVal, minVal, maxVal);
637 };
638
639 return IComposerClient::Color{
640 floatColorToUint8Clamped(color.r),
641 floatColorToUint8Clamped(color.g),
642 floatColorToUint8Clamped(color.b),
643 floatColorToUint8Clamped(color.a),
644 };
645}
646
647Error HidlComposer::setLayerColor(
648 Display display, Layer layer,
649 const aidl::android::hardware::graphics::composer3::Color& color) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700650 mWriter.selectDisplay(display);
651 mWriter.selectLayer(layer);
Ady Abraham6e60b142022-01-06 18:10:35 -0800652 mWriter.setLayerColor(to_hidl_type(color));
Ady Abraham9fc28052021-10-14 17:21:38 -0700653 return Error::NONE;
654}
655
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500656static IComposerClient::Composition to_hidl_type(
657 aidl::android::hardware::graphics::composer3::Composition type) {
Leon Scroggins III09c25412021-12-02 14:49:56 -0500658 LOG_ALWAYS_FATAL_IF(static_cast<int32_t>(type) >
659 static_cast<int32_t>(IComposerClient::Composition::SIDEBAND),
660 "Trying to use %s, which is not supported by HidlComposer!",
661 android::to_string(type).c_str());
662
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500663 return static_cast<IComposerClient::Composition>(type);
664}
665
666Error HidlComposer::setLayerCompositionType(
667 Display display, Layer layer,
668 aidl::android::hardware::graphics::composer3::Composition type) {
Ady Abraham9fc28052021-10-14 17:21:38 -0700669 mWriter.selectDisplay(display);
670 mWriter.selectLayer(layer);
Leon Scroggins III2e1aa182021-12-01 17:33:12 -0500671 mWriter.setLayerCompositionType(to_hidl_type(type));
Ady Abraham9fc28052021-10-14 17:21:38 -0700672 return Error::NONE;
673}
674
675Error HidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
676 mWriter.selectDisplay(display);
677 mWriter.selectLayer(layer);
678 mWriter.setLayerDataspace(dataspace);
679 return Error::NONE;
680}
681
682Error HidlComposer::setLayerDisplayFrame(Display display, Layer layer,
683 const IComposerClient::Rect& frame) {
684 mWriter.selectDisplay(display);
685 mWriter.selectLayer(layer);
686 mWriter.setLayerDisplayFrame(frame);
687 return Error::NONE;
688}
689
690Error HidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
691 mWriter.selectDisplay(display);
692 mWriter.selectLayer(layer);
693 mWriter.setLayerPlaneAlpha(alpha);
694 return Error::NONE;
695}
696
697Error HidlComposer::setLayerSidebandStream(Display display, Layer layer,
698 const native_handle_t* stream) {
699 mWriter.selectDisplay(display);
700 mWriter.selectLayer(layer);
701 mWriter.setLayerSidebandStream(stream);
702 return Error::NONE;
703}
704
705Error HidlComposer::setLayerSourceCrop(Display display, Layer layer,
706 const IComposerClient::FRect& crop) {
707 mWriter.selectDisplay(display);
708 mWriter.selectLayer(layer);
709 mWriter.setLayerSourceCrop(crop);
710 return Error::NONE;
711}
712
713Error HidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
714 mWriter.selectDisplay(display);
715 mWriter.selectLayer(layer);
716 mWriter.setLayerTransform(transform);
717 return Error::NONE;
718}
719
720Error HidlComposer::setLayerVisibleRegion(Display display, Layer layer,
721 const std::vector<IComposerClient::Rect>& visible) {
722 mWriter.selectDisplay(display);
723 mWriter.selectLayer(layer);
724 mWriter.setLayerVisibleRegion(visible);
725 return Error::NONE;
726}
727
728Error HidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
729 mWriter.selectDisplay(display);
730 mWriter.selectLayer(layer);
731 mWriter.setLayerZOrder(z);
732 return Error::NONE;
733}
734
735Error HidlComposer::execute() {
736 // prepare input command queue
737 bool queueChanged = false;
738 uint32_t commandLength = 0;
739 hidl_vec<hidl_handle> commandHandles;
740 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
741 mWriter.reset();
742 return Error::NO_RESOURCES;
743 }
744
745 // set up new input command queue if necessary
746 if (queueChanged) {
747 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor());
748 auto error = unwrapRet(ret);
749 if (error != Error::NONE) {
750 mWriter.reset();
751 return error;
752 }
753 }
754
755 if (commandLength == 0) {
756 mWriter.reset();
757 return Error::NONE;
758 }
759
760 Error error = kDefaultError;
761 hardware::Return<void> ret;
762 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
763 const auto& tmpOutLength, const auto& tmpOutHandles) {
764 error = tmpError;
765
766 // set up new output command queue if necessary
767 if (error == Error::NONE && tmpOutChanged) {
768 error = kDefaultError;
769 mClient->getOutputCommandQueue([&](const auto& tmpError, const auto& tmpDescriptor) {
770 error = tmpError;
771 if (error != Error::NONE) {
772 return;
773 }
774
775 mReader.setMQDescriptor(tmpDescriptor);
776 });
777 }
778
779 if (error != Error::NONE) {
780 return;
781 }
782
783 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) {
784 error = mReader.parse();
785 mReader.reset();
786 } else {
787 error = Error::NO_RESOURCES;
788 }
789 };
790 if (mClient_2_2) {
791 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
792 } else {
793 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
794 }
795 // executeCommands can fail because of out-of-fd and we do not want to
796 // abort() in that case
797 if (!ret.isOk()) {
798 ALOGE("executeCommands failed because of %s", ret.description().c_str());
799 }
800
801 if (error == Error::NONE) {
802 std::vector<CommandReader::CommandError> commandErrors = mReader.takeErrors();
803
804 for (const auto& cmdErr : commandErrors) {
805 auto command =
806 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));
807
808 if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
809 command == IComposerClient::Command::PRESENT_DISPLAY ||
810 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) {
811 error = cmdErr.error;
812 } else {
813 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
814 }
815 }
816 }
817
818 mWriter.reset();
819
820 return error;
821}
822
823// Composer HAL 2.2
824
825Error HidlComposer::setLayerPerFrameMetadata(
826 Display display, Layer layer,
827 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
828 if (!mClient_2_2) {
829 return Error::UNSUPPORTED;
830 }
831
832 mWriter.selectDisplay(display);
833 mWriter.selectLayer(layer);
834 mWriter.setLayerPerFrameMetadata(perFrameMetadatas);
835 return Error::NONE;
836}
837
838std::vector<IComposerClient::PerFrameMetadataKey> HidlComposer::getPerFrameMetadataKeys(
839 Display display) {
840 std::vector<IComposerClient::PerFrameMetadataKey> keys;
841 if (!mClient_2_2) {
842 return keys;
843 }
844
845 Error error = kDefaultError;
846 if (mClient_2_3) {
847 mClient_2_3->getPerFrameMetadataKeys_2_3(display,
848 [&](const auto& tmpError, const auto& tmpKeys) {
849 error = tmpError;
850 if (error != Error::NONE) {
851 ALOGW("getPerFrameMetadataKeys failed "
852 "with %d",
853 tmpError);
854 return;
855 }
856 keys = tmpKeys;
857 });
858 } else {
859 mClient_2_2
860 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
861 error = tmpError;
862 if (error != Error::NONE) {
863 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError);
864 return;
865 }
866
867 keys.clear();
868 for (auto key : tmpKeys) {
869 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key));
870 }
871 });
872 }
873
874 return keys;
875}
876
877Error HidlComposer::getRenderIntents(Display display, ColorMode colorMode,
878 std::vector<RenderIntent>* outRenderIntents) {
879 if (!mClient_2_2) {
880 outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
881 return Error::NONE;
882 }
883
884 Error error = kDefaultError;
885
886 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) {
887 error = tmpError;
888 if (error != Error::NONE) {
889 return;
890 }
891
892 *outRenderIntents = tmpKeys;
893 };
894
895 if (mClient_2_3) {
896 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda);
897 } else {
898 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode),
899 getRenderIntentsLambda);
900 }
901
902 return error;
903}
904
905Error HidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
906 if (!mClient_2_2) {
907 *outMatrix = mat4();
908 return Error::NONE;
909 }
910
911 Error error = kDefaultError;
912 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace),
913 [&](const auto& tmpError, const auto& tmpMatrix) {
914 error = tmpError;
915 if (error != Error::NONE) {
916 return;
917 }
918 *outMatrix = mat4(tmpMatrix.data());
919 });
920
921 return error;
922}
923
924// Composer HAL 2.3
925
926Error HidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
927 std::vector<uint8_t>* outData) {
928 if (!mClient_2_3) {
929 return Error::UNSUPPORTED;
930 }
931
932 Error error = kDefaultError;
933 mClient_2_3->getDisplayIdentificationData(display,
934 [&](const auto& tmpError, const auto& tmpPort,
935 const auto& tmpData) {
936 error = tmpError;
937 if (error != Error::NONE) {
938 return;
939 }
940
941 *outPort = tmpPort;
942 *outData = tmpData;
943 });
944
945 return error;
946}
947
948Error HidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
949 if (!mClient_2_3) {
950 return Error::UNSUPPORTED;
951 }
952
953 mWriter.selectDisplay(display);
954 mWriter.selectLayer(layer);
955 mWriter.setLayerColorTransform(matrix);
956 return Error::NONE;
957}
958
959Error HidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
960 Dataspace* outDataspace,
961 uint8_t* outComponentMask) {
962 if (!outFormat || !outDataspace || !outComponentMask) {
963 return Error::BAD_PARAMETER;
964 }
965 if (!mClient_2_3) {
966 return Error::UNSUPPORTED;
967 }
968 Error error = kDefaultError;
969 mClient_2_3->getDisplayedContentSamplingAttributes(display,
970 [&](const auto tmpError,
971 const auto& tmpFormat,
972 const auto& tmpDataspace,
973 const auto& tmpComponentMask) {
974 error = tmpError;
975 if (error == Error::NONE) {
976 *outFormat = tmpFormat;
977 *outDataspace = tmpDataspace;
978 *outComponentMask =
979 static_cast<uint8_t>(
980 tmpComponentMask);
981 }
982 });
983 return error;
984}
985
986Error HidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
987 uint8_t componentMask, uint64_t maxFrames) {
988 if (!mClient_2_3) {
989 return Error::UNSUPPORTED;
990 }
991
992 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE
993 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE;
994 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask,
995 maxFrames);
996}
997
998Error HidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
999 uint64_t timestamp, DisplayedFrameStats* outStats) {
1000 if (!outStats) {
1001 return Error::BAD_PARAMETER;
1002 }
1003 if (!mClient_2_3) {
1004 return Error::UNSUPPORTED;
1005 }
1006 Error error = kDefaultError;
1007 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp,
1008 [&](const auto tmpError, auto tmpNumFrames,
1009 const auto& tmpSamples0, const auto& tmpSamples1,
1010 const auto& tmpSamples2, const auto& tmpSamples3) {
1011 error = tmpError;
1012 if (error == Error::NONE) {
1013 outStats->numFrames = tmpNumFrames;
1014 outStats->component_0_sample = tmpSamples0;
1015 outStats->component_1_sample = tmpSamples1;
1016 outStats->component_2_sample = tmpSamples2;
1017 outStats->component_3_sample = tmpSamples3;
1018 }
1019 });
1020 return error;
1021}
1022
1023Error HidlComposer::setLayerPerFrameMetadataBlobs(
1024 Display display, Layer layer,
1025 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
1026 if (!mClient_2_3) {
1027 return Error::UNSUPPORTED;
1028 }
1029
1030 mWriter.selectDisplay(display);
1031 mWriter.selectLayer(layer);
1032 mWriter.setLayerPerFrameMetadataBlobs(metadata);
1033 return Error::NONE;
1034}
1035
Alec Mouricdf16792021-12-10 13:16:06 -08001036Error HidlComposer::setDisplayBrightness(Display display, float brightness,
1037 const DisplayBrightnessOptions&) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001038 if (!mClient_2_3) {
1039 return Error::UNSUPPORTED;
1040 }
1041 return mClient_2_3->setDisplayBrightness(display, brightness);
1042}
1043
1044// Composer HAL 2.4
1045
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001046namespace {
1047template <typename T>
1048void copyCapabilities(const T& tmpCaps, std::vector<DisplayCapability>* outCapabilities) {
1049 outCapabilities->resize(tmpCaps.size());
1050 std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(),
1051 [](auto cap) { return static_cast<DisplayCapability>(cap); });
1052}
1053} // anonymous namespace
1054
Ady Abraham9fc28052021-10-14 17:21:38 -07001055Error HidlComposer::getDisplayCapabilities(Display display,
1056 std::vector<DisplayCapability>* outCapabilities) {
1057 if (!mClient_2_3) {
1058 return Error::UNSUPPORTED;
1059 }
1060
1061 V2_4::Error error = kDefaultError_2_4;
1062 if (mClient_2_4) {
1063 mClient_2_4->getDisplayCapabilities_2_4(display,
1064 [&](const auto& tmpError, const auto& tmpCaps) {
1065 error = tmpError;
1066 if (error != V2_4::Error::NONE) {
1067 return;
1068 }
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001069 copyCapabilities(tmpCaps, outCapabilities);
Ady Abraham9fc28052021-10-14 17:21:38 -07001070 });
1071 } else {
1072 mClient_2_3
1073 ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) {
1074 error = static_cast<V2_4::Error>(tmpError);
1075 if (error != V2_4::Error::NONE) {
1076 return;
1077 }
1078
Leon Scroggins III5967aec2021-12-29 11:14:22 -05001079 copyCapabilities(tmpCaps, outCapabilities);
Ady Abraham9fc28052021-10-14 17:21:38 -07001080 });
1081 }
1082
1083 return static_cast<Error>(error);
1084}
1085
1086V2_4::Error HidlComposer::getDisplayConnectionType(
1087 Display display, IComposerClient::DisplayConnectionType* outType) {
1088 using Error = V2_4::Error;
1089 if (!mClient_2_4) {
1090 return Error::UNSUPPORTED;
1091 }
1092
1093 Error error = kDefaultError_2_4;
1094 mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) {
1095 error = tmpError;
1096 if (error != V2_4::Error::NONE) {
1097 return;
1098 }
1099
1100 *outType = tmpType;
1101 });
1102
1103 return error;
1104}
1105
1106V2_4::Error HidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
1107 using Error = V2_4::Error;
1108 if (!mClient_2_4) {
1109 return Error::UNSUPPORTED;
1110 }
1111
1112 Error error = kDefaultError_2_4;
1113 mClient_2_4->getDisplayVsyncPeriod(display,
1114 [&](const auto& tmpError, const auto& tmpVsyncPeriod) {
1115 error = tmpError;
1116 if (error != Error::NONE) {
1117 return;
1118 }
1119
1120 *outVsyncPeriod = tmpVsyncPeriod;
1121 });
1122
1123 return error;
1124}
1125
1126V2_4::Error HidlComposer::setActiveConfigWithConstraints(
1127 Display display, Config config,
1128 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
1129 VsyncPeriodChangeTimeline* outTimeline) {
1130 using Error = V2_4::Error;
1131 if (!mClient_2_4) {
1132 return Error::UNSUPPORTED;
1133 }
1134
1135 Error error = kDefaultError_2_4;
1136 mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints,
1137 [&](const auto& tmpError, const auto& tmpTimeline) {
1138 error = tmpError;
1139 if (error != Error::NONE) {
1140 return;
1141 }
1142
1143 *outTimeline = tmpTimeline;
1144 });
1145
1146 return error;
1147}
1148
1149V2_4::Error HidlComposer::setAutoLowLatencyMode(Display display, bool on) {
1150 using Error = V2_4::Error;
1151 if (!mClient_2_4) {
1152 return Error::UNSUPPORTED;
1153 }
1154
1155 return mClient_2_4->setAutoLowLatencyMode(display, on);
1156}
1157
1158V2_4::Error HidlComposer::getSupportedContentTypes(
1159 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1160 using Error = V2_4::Error;
1161 if (!mClient_2_4) {
1162 return Error::UNSUPPORTED;
1163 }
1164
1165 Error error = kDefaultError_2_4;
1166 mClient_2_4->getSupportedContentTypes(displayId,
1167 [&](const auto& tmpError,
1168 const auto& tmpSupportedContentTypes) {
1169 error = tmpError;
1170 if (error != Error::NONE) {
1171 return;
1172 }
1173
1174 *outSupportedContentTypes = tmpSupportedContentTypes;
1175 });
1176 return error;
1177}
1178
1179V2_4::Error HidlComposer::setContentType(Display display,
1180 IComposerClient::ContentType contentType) {
1181 using Error = V2_4::Error;
1182 if (!mClient_2_4) {
1183 return Error::UNSUPPORTED;
1184 }
1185
1186 return mClient_2_4->setContentType(display, contentType);
1187}
1188
1189V2_4::Error HidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1190 const std::string& key, bool mandatory,
1191 const std::vector<uint8_t>& value) {
1192 using Error = V2_4::Error;
1193 if (!mClient_2_4) {
1194 return Error::UNSUPPORTED;
1195 }
1196 mWriter.selectDisplay(display);
1197 mWriter.selectLayer(layer);
1198 mWriter.setLayerGenericMetadata(key, mandatory, value);
1199 return Error::NONE;
1200}
1201
1202V2_4::Error HidlComposer::getLayerGenericMetadataKeys(
1203 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1204 using Error = V2_4::Error;
1205 if (!mClient_2_4) {
1206 return Error::UNSUPPORTED;
1207 }
1208 Error error = kDefaultError_2_4;
1209 mClient_2_4->getLayerGenericMetadataKeys([&](const auto& tmpError, const auto& tmpKeys) {
1210 error = tmpError;
1211 if (error != Error::NONE) {
1212 return;
1213 }
1214
1215 *outKeys = tmpKeys;
1216 });
1217 return error;
1218}
1219
Kriti Dang7defaf32021-11-15 11:55:43 +01001220Error HidlComposer::setBootDisplayConfig(Display /*displayId*/, Config) {
1221 return Error::UNSUPPORTED;
1222}
1223
1224Error HidlComposer::clearBootDisplayConfig(Display /*displayId*/) {
1225 return Error::UNSUPPORTED;
1226}
1227
1228Error HidlComposer::getPreferredBootDisplayConfig(Display /*displayId*/, Config*) {
1229 return Error::UNSUPPORTED;
1230}
1231
Ady Abraham9fc28052021-10-14 17:21:38 -07001232Error HidlComposer::getClientTargetProperty(
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001233 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty,
1234 float* outWhitePointNits) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001235 mReader.takeClientTargetProperty(display, outClientTargetProperty);
Alec Mouricdf6cbc2021-11-01 17:21:15 -07001236 *outWhitePointNits = -1.f;
1237 return Error::NONE;
1238}
1239
1240Error HidlComposer::setLayerWhitePointNits(Display, Layer, float) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001241 return Error::NONE;
1242}
1243
Leon Scroggins IIId77d3162022-01-05 10:42:28 -05001244Error HidlComposer::setLayerBlockingRegion(Display, Layer,
1245 const std::vector<IComposerClient::Rect>&) {
1246 return Error::NONE;
1247}
1248
Ady Abraham9fc28052021-10-14 17:21:38 -07001249CommandReader::~CommandReader() {
1250 resetData();
1251}
1252
1253Error CommandReader::parse() {
1254 resetData();
1255
1256 IComposerClient::Command command;
1257 uint16_t length = 0;
1258
1259 while (!isEmpty()) {
1260 if (!beginCommand(&command, &length)) {
1261 break;
1262 }
1263
1264 bool parsed = false;
1265 switch (command) {
1266 case IComposerClient::Command::SELECT_DISPLAY:
1267 parsed = parseSelectDisplay(length);
1268 break;
1269 case IComposerClient::Command::SET_ERROR:
1270 parsed = parseSetError(length);
1271 break;
1272 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES:
1273 parsed = parseSetChangedCompositionTypes(length);
1274 break;
1275 case IComposerClient::Command::SET_DISPLAY_REQUESTS:
1276 parsed = parseSetDisplayRequests(length);
1277 break;
1278 case IComposerClient::Command::SET_PRESENT_FENCE:
1279 parsed = parseSetPresentFence(length);
1280 break;
1281 case IComposerClient::Command::SET_RELEASE_FENCES:
1282 parsed = parseSetReleaseFences(length);
1283 break;
1284 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1285 parsed = parseSetPresentOrValidateDisplayResult(length);
1286 break;
1287 case IComposerClient::Command::SET_CLIENT_TARGET_PROPERTY:
1288 parsed = parseSetClientTargetProperty(length);
1289 break;
1290 default:
1291 parsed = false;
1292 break;
1293 }
1294
1295 endCommand();
1296
1297 if (!parsed) {
1298 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1299 break;
1300 }
1301 }
1302
1303 return isEmpty() ? Error::NONE : Error::NO_RESOURCES;
1304}
1305
1306bool CommandReader::parseSelectDisplay(uint16_t length) {
1307 if (length != CommandWriterBase::kSelectDisplayLength) {
1308 return false;
1309 }
1310
1311 mCurrentReturnData = &mReturnData[read64()];
1312
1313 return true;
1314}
1315
1316bool CommandReader::parseSetError(uint16_t length) {
1317 if (length != CommandWriterBase::kSetErrorLength) {
1318 return false;
1319 }
1320
1321 auto location = read();
1322 auto error = static_cast<Error>(readSigned());
1323
1324 mErrors.emplace_back(CommandError{location, error});
1325
1326 return true;
1327}
1328
1329bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1330 // (layer id, composition type) pairs
1331 if (length % 3 != 0 || !mCurrentReturnData) {
1332 return false;
1333 }
1334
1335 uint32_t count = length / 3;
1336 mCurrentReturnData->changedLayers.reserve(count);
1337 mCurrentReturnData->compositionTypes.reserve(count);
1338 while (count > 0) {
1339 auto layer = read64();
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001340 auto type = static_cast<aidl::android::hardware::graphics::composer3::Composition>(
1341 readSigned());
Ady Abraham9fc28052021-10-14 17:21:38 -07001342
1343 mCurrentReturnData->changedLayers.push_back(layer);
1344 mCurrentReturnData->compositionTypes.push_back(type);
1345
1346 count--;
1347 }
1348
1349 return true;
1350}
1351
1352bool CommandReader::parseSetDisplayRequests(uint16_t length) {
1353 // display requests followed by (layer id, layer requests) pairs
1354 if (length % 3 != 1 || !mCurrentReturnData) {
1355 return false;
1356 }
1357
1358 mCurrentReturnData->displayRequests = read();
1359
1360 uint32_t count = (length - 1) / 3;
1361 mCurrentReturnData->requestedLayers.reserve(count);
1362 mCurrentReturnData->requestMasks.reserve(count);
1363 while (count > 0) {
1364 auto layer = read64();
1365 auto layerRequestMask = read();
1366
1367 mCurrentReturnData->requestedLayers.push_back(layer);
1368 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1369
1370 count--;
1371 }
1372
1373 return true;
1374}
1375
1376bool CommandReader::parseSetPresentFence(uint16_t length) {
1377 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1378 return false;
1379 }
1380
1381 if (mCurrentReturnData->presentFence >= 0) {
1382 close(mCurrentReturnData->presentFence);
1383 }
1384 mCurrentReturnData->presentFence = readFence();
1385
1386 return true;
1387}
1388
1389bool CommandReader::parseSetReleaseFences(uint16_t length) {
1390 // (layer id, release fence index) pairs
1391 if (length % 3 != 0 || !mCurrentReturnData) {
1392 return false;
1393 }
1394
1395 uint32_t count = length / 3;
1396 mCurrentReturnData->releasedLayers.reserve(count);
1397 mCurrentReturnData->releaseFences.reserve(count);
1398 while (count > 0) {
1399 auto layer = read64();
1400 auto fence = readFence();
1401
1402 mCurrentReturnData->releasedLayers.push_back(layer);
1403 mCurrentReturnData->releaseFences.push_back(fence);
1404
1405 count--;
1406 }
1407
1408 return true;
1409}
1410
1411bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1412 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1413 return false;
1414 }
1415 mCurrentReturnData->presentOrValidateState = read();
1416 return true;
1417}
1418
1419bool CommandReader::parseSetClientTargetProperty(uint16_t length) {
1420 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1421 return false;
1422 }
1423 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1424 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1425 return true;
1426}
1427
1428void CommandReader::resetData() {
1429 mErrors.clear();
1430
1431 for (auto& data : mReturnData) {
1432 if (data.second.presentFence >= 0) {
1433 close(data.second.presentFence);
1434 }
1435 for (auto fence : data.second.releaseFences) {
1436 if (fence >= 0) {
1437 close(fence);
1438 }
1439 }
1440 }
1441
1442 mReturnData.clear();
1443 mCurrentReturnData = nullptr;
1444}
1445
1446std::vector<CommandReader::CommandError> CommandReader::takeErrors() {
1447 return std::move(mErrors);
1448}
1449
1450bool CommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1451 uint32_t* outNumLayerRequestMasks) const {
1452 auto found = mReturnData.find(display);
1453 if (found == mReturnData.end()) {
1454 *outNumChangedCompositionTypes = 0;
1455 *outNumLayerRequestMasks = 0;
1456 return false;
1457 }
1458
1459 const ReturnData& data = found->second;
1460
1461 *outNumChangedCompositionTypes = data.compositionTypes.size();
1462 *outNumLayerRequestMasks = data.requestMasks.size();
1463
1464 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1465}
1466
1467void CommandReader::takeChangedCompositionTypes(
1468 Display display, std::vector<Layer>* outLayers,
Leon Scroggins III2e1aa182021-12-01 17:33:12 -05001469 std::vector<aidl::android::hardware::graphics::composer3::Composition>* outTypes) {
Ady Abraham9fc28052021-10-14 17:21:38 -07001470 auto found = mReturnData.find(display);
1471 if (found == mReturnData.end()) {
1472 outLayers->clear();
1473 outTypes->clear();
1474 return;
1475 }
1476
1477 ReturnData& data = found->second;
1478
1479 *outLayers = std::move(data.changedLayers);
1480 *outTypes = std::move(data.compositionTypes);
1481}
1482
1483void CommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1484 std::vector<Layer>* outLayers,
1485 std::vector<uint32_t>* outLayerRequestMasks) {
1486 auto found = mReturnData.find(display);
1487 if (found == mReturnData.end()) {
1488 *outDisplayRequestMask = 0;
1489 outLayers->clear();
1490 outLayerRequestMasks->clear();
1491 return;
1492 }
1493
1494 ReturnData& data = found->second;
1495
1496 *outDisplayRequestMask = data.displayRequests;
1497 *outLayers = std::move(data.requestedLayers);
1498 *outLayerRequestMasks = std::move(data.requestMasks);
1499}
1500
1501void CommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1502 std::vector<int>* outReleaseFences) {
1503 auto found = mReturnData.find(display);
1504 if (found == mReturnData.end()) {
1505 outLayers->clear();
1506 outReleaseFences->clear();
1507 return;
1508 }
1509
1510 ReturnData& data = found->second;
1511
1512 *outLayers = std::move(data.releasedLayers);
1513 *outReleaseFences = std::move(data.releaseFences);
1514}
1515
1516void CommandReader::takePresentFence(Display display, int* outPresentFence) {
1517 auto found = mReturnData.find(display);
1518 if (found == mReturnData.end()) {
1519 *outPresentFence = -1;
1520 return;
1521 }
1522
1523 ReturnData& data = found->second;
1524
1525 *outPresentFence = data.presentFence;
1526 data.presentFence = -1;
1527}
1528
1529void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1530 auto found = mReturnData.find(display);
1531 if (found == mReturnData.end()) {
1532 *state = -1;
1533 return;
1534 }
1535 ReturnData& data = found->second;
1536 *state = data.presentOrValidateState;
1537}
1538
1539void CommandReader::takeClientTargetProperty(
1540 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1541 auto found = mReturnData.find(display);
1542
1543 // If not found, return the default values.
1544 if (found == mReturnData.end()) {
1545 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1546 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1547 return;
1548 }
1549
1550 ReturnData& data = found->second;
1551 *outClientTargetProperty = data.clientTargetProperty;
1552}
1553
1554} // namespace Hwc2
1555} // namespace android
1556
1557// TODO(b/129481165): remove the #pragma below and fix conversion issues
1558#pragma clang diagnostic pop // ignored "-Wconversion"