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