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