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