blob: 0a8cf5b80df03739a48acb28bd5c2c94b2de2d08 [file] [log] [blame]
Ady Abrahame7385f72021-09-05 00:54:25 -07001/*
2 * Copyright 2021 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#undef LOG_TAG
18#define LOG_TAG "HwcComposer"
19#define ATRACE_TAG ATRACE_TAG_GRAPHICS
20
21#include "ComposerHal.h"
22
23#include <android/binder_ibinder_platform.h>
24#include <android/binder_manager.h>
25#include <log/log.h>
26#include <utils/Trace.h>
27
28#include <aidl/android/hardware/graphics/composer3/BnComposerCallback.h>
29
30#include <algorithm>
31#include <cinttypes>
32
33namespace android {
34
35using hardware::hidl_handle;
36using hardware::hidl_vec;
37using hardware::Return;
38
39using aidl::android::hardware::graphics::composer3::BnComposerCallback;
40using aidl::android::hardware::graphics::composer3::Capability;
41using aidl::android::hardware::graphics::composer3::PowerMode;
42using aidl::android::hardware::graphics::composer3::VirtualDisplay;
43
44using AidlColorMode = aidl::android::hardware::graphics::composer3::ColorMode;
45using AidlContentType = aidl::android::hardware::graphics::composer3::ContentType;
46using AidlDisplayIdentification =
47 aidl::android::hardware::graphics::composer3::DisplayIdentification;
48using AidlDisplayContentSample = aidl::android::hardware::graphics::composer3::DisplayContentSample;
49using AidlDisplayAttribute = aidl::android::hardware::graphics::composer3::DisplayAttribute;
50using AidlDisplayCapability = aidl::android::hardware::graphics::composer3::DisplayCapability;
51using AidlExecuteCommandsStatus =
52 aidl::android::hardware::graphics::composer3::ExecuteCommandsStatus;
53using AidlHdrCapabilities = aidl::android::hardware::graphics::composer3::HdrCapabilities;
54using AidlPerFrameMetadata = aidl::android::hardware::graphics::composer3::PerFrameMetadata;
55using AidlPerFrameMetadataKey = aidl::android::hardware::graphics::composer3::PerFrameMetadataKey;
56using AidlPerFrameMetadataBlob = aidl::android::hardware::graphics::composer3::PerFrameMetadataBlob;
57using AidlRenderIntent = aidl::android::hardware::graphics::composer3::RenderIntent;
58using AidlVsyncPeriodChangeConstraints =
59 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeConstraints;
60using AidlVsyncPeriodChangeTimeline =
61 aidl::android::hardware::graphics::composer3::VsyncPeriodChangeTimeline;
62using AidlLayerGenericMetadataKey =
63 aidl::android::hardware::graphics::composer3::LayerGenericMetadataKey;
64using AidlDisplayContentSamplingAttributes =
65 aidl::android::hardware::graphics::composer3::DisplayContentSamplingAttributes;
66using AidlFormatColorComponent = aidl::android::hardware::graphics::composer3::FormatColorComponent;
67using AidlDisplayConnectionType =
68 aidl::android::hardware::graphics::composer3::DisplayConnectionType;
69using AidlIComposerClient = aidl::android::hardware::graphics::composer3::IComposerClient;
70
71using AidlColorTransform = aidl::android::hardware::graphics::common::ColorTransform;
72using AidlDataspace = aidl::android::hardware::graphics::common::Dataspace;
73using AidlFRect = aidl::android::hardware::graphics::common::FRect;
74using AidlRect = aidl::android::hardware::graphics::common::Rect;
75using AidlTransform = aidl::android::hardware::graphics::common::Transform;
76
77namespace Hwc2 {
78
79namespace {
80
81template <typename To, typename From>
82To translate(From x) {
83 return static_cast<To>(x);
84}
85
86template <typename To, typename From>
87std::vector<To> translate(const std::vector<From>& in) {
88 std::vector<To> out;
89 out.reserve(in.size());
90 std::transform(in.begin(), in.end(), std::back_inserter(out),
91 [](From x) { return translate<To>(x); });
92 return out;
93}
94
95template <>
96AidlRect translate(IComposerClient::Rect x) {
97 return AidlRect{
98 .left = x.left,
99 .top = x.top,
100 .right = x.right,
101 .bottom = x.bottom,
102 };
103}
104
105template <>
106AidlFRect translate(IComposerClient::FRect x) {
107 return AidlFRect{
108 .left = x.left,
109 .top = x.top,
110 .right = x.right,
111 .bottom = x.bottom,
112 };
113}
114
115template <>
116Color translate(IComposerClient::Color x) {
117 return Color{
118 .r = static_cast<int8_t>(x.r),
119 .g = static_cast<int8_t>(x.g),
120 .b = static_cast<int8_t>(x.b),
121 .a = static_cast<int8_t>(x.a),
122 };
123}
124
125template <>
126AidlPerFrameMetadataBlob translate(IComposerClient::PerFrameMetadataBlob x) {
127 AidlPerFrameMetadataBlob blob;
128 blob.key = translate<AidlPerFrameMetadataKey>(x.key),
129 std::copy(blob.blob.begin(), blob.blob.end(), x.blob.begin());
130 return blob;
131}
132
133template <>
134AidlPerFrameMetadata translate(IComposerClient::PerFrameMetadata x) {
135 return AidlPerFrameMetadata{
136 .key = translate<AidlPerFrameMetadataKey>(x.key),
137 .value = x.value,
138 };
139}
140
141template <>
142DisplayedFrameStats translate(AidlDisplayContentSample x) {
143 return DisplayedFrameStats{
144 .numFrames = static_cast<uint64_t>(x.frameCount),
145 .component_0_sample = translate<uint64_t>(x.sampleComponent0),
146 .component_1_sample = translate<uint64_t>(x.sampleComponent1),
147 .component_2_sample = translate<uint64_t>(x.sampleComponent2),
148 .component_3_sample = translate<uint64_t>(x.sampleComponent3),
149 };
150}
151
152template <>
153AidlVsyncPeriodChangeConstraints translate(IComposerClient::VsyncPeriodChangeConstraints x) {
154 return AidlVsyncPeriodChangeConstraints{
155 .desiredTimeNanos = x.desiredTimeNanos,
156 .seamlessRequired = x.seamlessRequired,
157 };
158}
159
160template <>
161VsyncPeriodChangeTimeline translate(AidlVsyncPeriodChangeTimeline x) {
162 return VsyncPeriodChangeTimeline{
163 .newVsyncAppliedTimeNanos = x.newVsyncAppliedTimeNanos,
164 .refreshRequired = x.refreshRequired,
165 .refreshTimeNanos = x.refreshTimeNanos,
166 };
167}
168
169template <>
170IComposerClient::LayerGenericMetadataKey translate(AidlLayerGenericMetadataKey x) {
171 return IComposerClient::LayerGenericMetadataKey{
172 .name = x.name,
173 .mandatory = x.mandatory,
174 };
175}
176
177mat4 makeMat4(std::vector<float> in) {
178 return mat4(static_cast<const float*>(in.data()));
179}
180
181} // namespace
182
183class AidlIComposerCallbackWrapper : public BnComposerCallback {
184public:
185 AidlIComposerCallbackWrapper(sp<V2_4::IComposerCallback> callback)
186 : mCallback(std::move(callback)) {}
187
188 ::ndk::ScopedAStatus onHotplug(int64_t in_display, bool in_connected) override {
189 const auto connection = in_connected ? V2_4::IComposerCallback::Connection::CONNECTED
190 : V2_4::IComposerCallback::Connection::DISCONNECTED;
191 mCallback->onHotplug(translate<Display>(in_display), connection);
192 return ::ndk::ScopedAStatus::ok();
193 }
194
195 ::ndk::ScopedAStatus onRefresh(int64_t in_display) override {
196 mCallback->onRefresh(translate<Display>(in_display));
197 return ::ndk::ScopedAStatus::ok();
198 }
199 ::ndk::ScopedAStatus onSeamlessPossible(int64_t in_display) override {
200 mCallback->onSeamlessPossible(translate<Display>(in_display));
201 return ::ndk::ScopedAStatus::ok();
202 }
203 ::ndk::ScopedAStatus onVsync(int64_t in_display, int64_t in_timestamp,
204 int32_t in_vsyncPeriodNanos) override {
205 mCallback->onVsync_2_4(translate<Display>(in_display), in_timestamp,
206 static_cast<uint32_t>(in_vsyncPeriodNanos));
207 return ::ndk::ScopedAStatus::ok();
208 }
209 ::ndk::ScopedAStatus onVsyncPeriodTimingChanged(
210 int64_t in_display, const AidlVsyncPeriodChangeTimeline& in_updatedTimeline) override {
211 mCallback->onVsyncPeriodTimingChanged(translate<Display>(in_display),
212 translate<V2_4::VsyncPeriodChangeTimeline>(
213 in_updatedTimeline));
214 return ::ndk::ScopedAStatus::ok();
215 }
216
217private:
218 sp<V2_4::IComposerCallback> mCallback;
219};
220
221namespace impl {
222
223AidlComposer::AidlComposer(const std::string& serviceName) : mWriter(kWriterInitialSize) {
224 // This only waits if the service is actually declared
225 mAidlComposer = AidlIComposer::fromBinder(ndk::SpAIBinder(
226 AServiceManager_waitForService((AidlIComposer::descriptor + serviceName).c_str())));
227 if (!mAidlComposer) {
228 LOG_ALWAYS_FATAL("Failed to get AIDL composer service");
229 return;
230 }
231
232 if (!mAidlComposer->createClient(&mAidlComposerClient).isOk()) {
233 LOG_ALWAYS_FATAL("Can't create AidlComposerClient, fallback to HIDL");
234 return;
235 }
236
237 ALOGI("Loaded AIDL composer3 HAL service");
238}
239
240AidlComposer::~AidlComposer() = default;
241
242std::vector<IComposer::Capability> AidlComposer::getCapabilities() {
243 std::vector<Capability> capabilities;
244 const auto status = mAidlComposer->getCapabilities(&capabilities);
245 if (!status.isOk()) {
246 ALOGE("getCapabilities failed %s", status.getDescription().c_str());
247 return {};
248 }
249 return translate<IComposer::Capability>(capabilities);
250}
251
252std::string AidlComposer::dumpDebugInfo() {
253 std::string info;
254 const auto status = mAidlComposer->dumpDebugInfo(&info);
255 if (!status.isOk()) {
256 ALOGE("dumpDebugInfo failed %s", status.getDescription().c_str());
257 return {};
258 }
259 return info;
260}
261
262void AidlComposer::registerCallback(const sp<IComposerCallback>& callback) {
263 if (mAidlComposerCallback) {
264 ALOGE("Callback already registered");
265 }
266 mAidlComposerCallback = std::make_shared<AidlIComposerCallbackWrapper>(callback);
267 AIBinder_setMinSchedulerPolicy(mAidlComposerCallback->asBinder().get(), SCHED_FIFO, 2);
268
269 const auto status = mAidlComposerClient->registerCallback(mAidlComposerCallback);
270 if (!status.isOk()) {
271 ALOGE("registerCallback failed %s", status.getDescription().c_str());
272 }
273}
274
275void AidlComposer::resetCommands() {
276 mWriter.reset();
277}
278
279Error AidlComposer::executeCommands() {
280 return execute();
281}
282
283uint32_t AidlComposer::getMaxVirtualDisplayCount() {
284 int32_t count = 0;
285 const auto status = mAidlComposerClient->getMaxVirtualDisplayCount(&count);
286 if (!status.isOk()) {
287 ALOGE("getMaxVirtualDisplayCount failed %s", status.getDescription().c_str());
288 return 0;
289 }
290 return static_cast<uint32_t>(count);
291}
292
293Error AidlComposer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
294 Display* outDisplay) {
295 using AidlPixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
296 const int32_t bufferSlotCount = 1;
297 VirtualDisplay virtualDisplay;
298 const auto status =
299 mAidlComposerClient->createVirtualDisplay(static_cast<int32_t>(width),
300 static_cast<int32_t>(height),
301 static_cast<AidlPixelFormat>(*format),
302 bufferSlotCount, &virtualDisplay);
303
304 if (!status.isOk()) {
305 ALOGE("createVirtualDisplay failed %s", status.getDescription().c_str());
306 return static_cast<Error>(status.getServiceSpecificError());
307 }
308
309 *outDisplay = translate<Display>(virtualDisplay.display);
310 *format = static_cast<PixelFormat>(virtualDisplay.format);
311 return Error::NONE;
312}
313
314Error AidlComposer::destroyVirtualDisplay(Display display) {
315 const auto status = mAidlComposerClient->destroyVirtualDisplay(translate<int64_t>(display));
316 if (!status.isOk()) {
317 ALOGE("destroyVirtualDisplay failed %s", status.getDescription().c_str());
318 return static_cast<Error>(status.getServiceSpecificError());
319 }
320 return Error::NONE;
321}
322
323Error AidlComposer::acceptDisplayChanges(Display display) {
324 mWriter.selectDisplay(translate<int64_t>(display));
325 mWriter.acceptDisplayChanges();
326 return Error::NONE;
327}
328
329Error AidlComposer::createLayer(Display display, Layer* outLayer) {
330 int64_t layer;
331 const auto status = mAidlComposerClient->createLayer(translate<int64_t>(display),
332 kMaxLayerBufferCount, &layer);
333 if (!status.isOk()) {
334 ALOGE("createLayer failed %s", status.getDescription().c_str());
335 return static_cast<Error>(status.getServiceSpecificError());
336 }
337
338 *outLayer = translate<Layer>(layer);
339 return Error::NONE;
340}
341
342Error AidlComposer::destroyLayer(Display display, Layer layer) {
343 const auto status = mAidlComposerClient->destroyLayer(translate<int64_t>(display),
344 translate<int64_t>(layer));
345 if (!status.isOk()) {
346 ALOGE("destroyLayer failed %s", status.getDescription().c_str());
347 return static_cast<Error>(status.getServiceSpecificError());
348 }
349 return Error::NONE;
350}
351
352Error AidlComposer::getActiveConfig(Display display, Config* outConfig) {
353 int32_t config;
354 const auto status = mAidlComposerClient->getActiveConfig(translate<int64_t>(display), &config);
355 if (!status.isOk()) {
356 ALOGE("getActiveConfig failed %s", status.getDescription().c_str());
357 return static_cast<Error>(status.getServiceSpecificError());
358 }
359 *outConfig = translate<Config>(config);
360 return Error::NONE;
361}
362
363Error AidlComposer::getChangedCompositionTypes(
364 Display display, std::vector<Layer>* outLayers,
365 std::vector<IComposerClient::Composition>* outTypes) {
366 mReader.takeChangedCompositionTypes(display, outLayers, outTypes);
367 return Error::NONE;
368}
369
370Error AidlComposer::getColorModes(Display display, std::vector<ColorMode>* outModes) {
371 std::vector<AidlColorMode> modes;
372 const auto status = mAidlComposerClient->getColorModes(translate<int64_t>(display), &modes);
373 if (!status.isOk()) {
374 ALOGE("getColorModes failed %s", status.getDescription().c_str());
375 return static_cast<Error>(status.getServiceSpecificError());
376 }
377 *outModes = translate<ColorMode>(modes);
378 return Error::NONE;
379}
380
381Error AidlComposer::getDisplayAttribute(Display display, Config config,
382 IComposerClient::Attribute attribute, int32_t* outValue) {
383 const auto status =
384 mAidlComposerClient->getDisplayAttribute(translate<int64_t>(display),
385 translate<int32_t>(config),
386 static_cast<AidlDisplayAttribute>(attribute),
387 outValue);
388 if (!status.isOk()) {
389 ALOGE("getDisplayAttribute failed %s", status.getDescription().c_str());
390 return static_cast<Error>(status.getServiceSpecificError());
391 }
392 return Error::NONE;
393}
394
395Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outConfigs) {
396 std::vector<int32_t> configs;
397 const auto status =
398 mAidlComposerClient->getDisplayConfigs(translate<int64_t>(display), &configs);
399 if (!status.isOk()) {
400 ALOGE("getDisplayConfigs failed %s", status.getDescription().c_str());
401 return static_cast<Error>(status.getServiceSpecificError());
402 }
403 *outConfigs = translate<Config>(configs);
404 return Error::NONE;
405}
406
407Error AidlComposer::getDisplayName(Display display, std::string* outName) {
408 const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
409 if (!status.isOk()) {
410 ALOGE("getDisplayName failed %s", status.getDescription().c_str());
411 return static_cast<Error>(status.getServiceSpecificError());
412 }
413 return Error::NONE;
414}
415
416Error AidlComposer::getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
417 std::vector<Layer>* outLayers,
418 std::vector<uint32_t>* outLayerRequestMasks) {
419 mReader.takeDisplayRequests(display, outDisplayRequestMask, outLayers, outLayerRequestMasks);
420 return Error::NONE;
421}
422
423Error AidlComposer::getDozeSupport(Display display, bool* outSupport) {
424 const auto status =
425 mAidlComposerClient->getDozeSupport(translate<int64_t>(display), outSupport);
426 if (!status.isOk()) {
427 ALOGE("getDozeSupport failed %s", status.getDescription().c_str());
428 return static_cast<Error>(status.getServiceSpecificError());
429 }
430 return Error::NONE;
431}
432
433Error AidlComposer::getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
434 float* outMaxLuminance, float* outMaxAverageLuminance,
435 float* outMinLuminance) {
436 AidlHdrCapabilities capabilities;
437 const auto status =
438 mAidlComposerClient->getHdrCapabilities(translate<int64_t>(display), &capabilities);
439 if (!status.isOk()) {
440 ALOGE("getHdrCapabilities failed %s", status.getDescription().c_str());
441 return static_cast<Error>(status.getServiceSpecificError());
442 }
443
444 *outTypes = translate<Hdr>(capabilities.types);
445 *outMaxLuminance = capabilities.maxLuminance;
446 *outMaxAverageLuminance = capabilities.maxAverageLuminance;
447 *outMinLuminance = capabilities.minLuminance;
448 return Error::NONE;
449}
450
451Error AidlComposer::getReleaseFences(Display display, std::vector<Layer>* outLayers,
452 std::vector<int>* outReleaseFences) {
453 mReader.takeReleaseFences(display, outLayers, outReleaseFences);
454 return Error::NONE;
455}
456
457Error AidlComposer::presentDisplay(Display display, int* outPresentFence) {
458 ATRACE_NAME("HwcPresentDisplay");
459 mWriter.selectDisplay(translate<int64_t>(display));
460 mWriter.presentDisplay();
461
462 Error error = execute();
463 if (error != Error::NONE) {
464 return error;
465 }
466
467 mReader.takePresentFence(display, outPresentFence);
468
469 return Error::NONE;
470}
471
472Error AidlComposer::setActiveConfig(Display display, Config config) {
473 const auto status = mAidlComposerClient->setActiveConfig(translate<int64_t>(display),
474 translate<int32_t>(config));
475 if (!status.isOk()) {
476 ALOGE("setActiveConfig failed %s", status.getDescription().c_str());
477 return static_cast<Error>(status.getServiceSpecificError());
478 }
479 return Error::NONE;
480}
481
482Error AidlComposer::setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
483 int acquireFence, Dataspace dataspace,
484 const std::vector<IComposerClient::Rect>& damage) {
485 mWriter.selectDisplay(translate<int64_t>(display));
486
487 const native_handle_t* handle = nullptr;
488 if (target.get()) {
489 handle = target->getNativeBuffer()->handle;
490 }
491
492 mWriter.setClientTarget(slot, handle, acquireFence,
493 translate<aidl::android::hardware::graphics::common::Dataspace>(
494 dataspace),
495 translate<AidlRect>(damage));
496 return Error::NONE;
497}
498
499Error AidlComposer::setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) {
500 const auto status =
501 mAidlComposerClient->setColorMode(translate<int64_t>(display),
502 translate<AidlColorMode>(mode),
503 translate<AidlRenderIntent>(renderIntent));
504 if (!status.isOk()) {
505 ALOGE("setColorMode failed %s", status.getDescription().c_str());
506 return static_cast<Error>(status.getServiceSpecificError());
507 }
508 return Error::NONE;
509}
510
511Error AidlComposer::setColorTransform(Display display, const float* matrix, ColorTransform hint) {
512 mWriter.selectDisplay(translate<int64_t>(display));
513 mWriter.setColorTransform(matrix, translate<AidlColorTransform>(hint));
514 return Error::NONE;
515}
516
517Error AidlComposer::setOutputBuffer(Display display, const native_handle_t* buffer,
518 int releaseFence) {
519 mWriter.selectDisplay(translate<int64_t>(display));
520 mWriter.setOutputBuffer(0, buffer, dup(releaseFence));
521 return Error::NONE;
522}
523
524Error AidlComposer::setPowerMode(Display display, IComposerClient::PowerMode mode) {
525 const auto status = mAidlComposerClient->setPowerMode(translate<int64_t>(display),
526 translate<PowerMode>(mode));
527 if (!status.isOk()) {
528 ALOGE("setPowerMode failed %s", status.getDescription().c_str());
529 return static_cast<Error>(status.getServiceSpecificError());
530 }
531 return Error::NONE;
532}
533
534Error AidlComposer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
535 const bool enableVsync = enabled == IComposerClient::Vsync::ENABLE;
536 const auto status =
537 mAidlComposerClient->setVsyncEnabled(translate<int64_t>(display), enableVsync);
538 if (!status.isOk()) {
539 ALOGE("setVsyncEnabled failed %s", status.getDescription().c_str());
540 return static_cast<Error>(status.getServiceSpecificError());
541 }
542 return Error::NONE;
543}
544
545Error AidlComposer::setClientTargetSlotCount(Display display) {
546 const int32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS;
547 const auto status = mAidlComposerClient->setClientTargetSlotCount(translate<int64_t>(display),
548 bufferSlotCount);
549 if (!status.isOk()) {
550 ALOGE("setClientTargetSlotCount failed %s", status.getDescription().c_str());
551 return static_cast<Error>(status.getServiceSpecificError());
552 }
553 return Error::NONE;
554}
555
556Error AidlComposer::validateDisplay(Display display, uint32_t* outNumTypes,
557 uint32_t* outNumRequests) {
558 ATRACE_NAME("HwcValidateDisplay");
559 mWriter.selectDisplay(translate<int64_t>(display));
560 mWriter.validateDisplay();
561
562 Error error = execute();
563 if (error != Error::NONE) {
564 return error;
565 }
566
567 mReader.hasChanges(display, outNumTypes, outNumRequests);
568
569 return Error::NONE;
570}
571
572Error AidlComposer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
573 uint32_t* outNumRequests, int* outPresentFence,
574 uint32_t* state) {
575 ATRACE_NAME("HwcPresentOrValidateDisplay");
576 mWriter.selectDisplay(translate<int64_t>(display));
577 mWriter.presentOrvalidateDisplay();
578
579 Error error = execute();
580 if (error != Error::NONE) {
581 return error;
582 }
583
584 mReader.takePresentOrValidateStage(display, state);
585
586 if (*state == 1) { // Present succeeded
587 mReader.takePresentFence(display, outPresentFence);
588 }
589
590 if (*state == 0) { // Validate succeeded.
591 mReader.hasChanges(display, outNumTypes, outNumRequests);
592 }
593
594 return Error::NONE;
595}
596
597Error AidlComposer::setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) {
598 mWriter.selectDisplay(translate<int64_t>(display));
599 mWriter.selectLayer(translate<int64_t>(layer));
600 mWriter.setLayerCursorPosition(x, y);
601 return Error::NONE;
602}
603
604Error AidlComposer::setLayerBuffer(Display display, Layer layer, uint32_t slot,
605 const sp<GraphicBuffer>& buffer, int acquireFence) {
606 mWriter.selectDisplay(translate<int64_t>(display));
607 mWriter.selectLayer(translate<int64_t>(layer));
608
609 const native_handle_t* handle = nullptr;
610 if (buffer.get()) {
611 handle = buffer->getNativeBuffer()->handle;
612 }
613
614 mWriter.setLayerBuffer(slot, handle, acquireFence);
615 return Error::NONE;
616}
617
618Error AidlComposer::setLayerSurfaceDamage(Display display, Layer layer,
619 const std::vector<IComposerClient::Rect>& damage) {
620 mWriter.selectDisplay(translate<int64_t>(display));
621 mWriter.selectLayer(translate<int64_t>(layer));
622 mWriter.setLayerSurfaceDamage(translate<AidlRect>(damage));
623 return Error::NONE;
624}
625
626Error AidlComposer::setLayerBlendMode(Display display, Layer layer,
627 IComposerClient::BlendMode mode) {
628 mWriter.selectDisplay(translate<int64_t>(display));
629 mWriter.selectLayer(translate<int64_t>(layer));
630 mWriter.setLayerBlendMode(translate<BlendMode>(mode));
631 return Error::NONE;
632}
633
634Error AidlComposer::setLayerColor(Display display, Layer layer,
635 const IComposerClient::Color& color) {
636 mWriter.selectDisplay(translate<int64_t>(display));
637 mWriter.selectLayer(translate<int64_t>(layer));
638 mWriter.setLayerColor(translate<Color>(color));
639 return Error::NONE;
640}
641
642Error AidlComposer::setLayerCompositionType(Display display, Layer layer,
643 IComposerClient::Composition type) {
644 mWriter.selectDisplay(translate<int64_t>(display));
645 mWriter.selectLayer(translate<int64_t>(layer));
646 mWriter.setLayerCompositionType(translate<Composition>(type));
647 return Error::NONE;
648}
649
650Error AidlComposer::setLayerDataspace(Display display, Layer layer, Dataspace dataspace) {
651 mWriter.selectDisplay(translate<int64_t>(display));
652 mWriter.selectLayer(translate<int64_t>(layer));
653 mWriter.setLayerDataspace(translate<AidlDataspace>(dataspace));
654 return Error::NONE;
655}
656
657Error AidlComposer::setLayerDisplayFrame(Display display, Layer layer,
658 const IComposerClient::Rect& frame) {
659 mWriter.selectDisplay(translate<int64_t>(display));
660 mWriter.selectLayer(translate<int64_t>(layer));
661 mWriter.setLayerDisplayFrame(translate<AidlRect>(frame));
662 return Error::NONE;
663}
664
665Error AidlComposer::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
666 mWriter.selectDisplay(translate<int64_t>(display));
667 mWriter.selectLayer(translate<int64_t>(layer));
668 mWriter.setLayerPlaneAlpha(alpha);
669 return Error::NONE;
670}
671
672Error AidlComposer::setLayerSidebandStream(Display display, Layer layer,
673 const native_handle_t* stream) {
674 mWriter.selectDisplay(translate<int64_t>(display));
675 mWriter.selectLayer(translate<int64_t>(layer));
676 mWriter.setLayerSidebandStream(stream);
677 return Error::NONE;
678}
679
680Error AidlComposer::setLayerSourceCrop(Display display, Layer layer,
681 const IComposerClient::FRect& crop) {
682 mWriter.selectDisplay(translate<int64_t>(display));
683 mWriter.selectLayer(translate<int64_t>(layer));
684 mWriter.setLayerSourceCrop(translate<AidlFRect>(crop));
685 return Error::NONE;
686}
687
688Error AidlComposer::setLayerTransform(Display display, Layer layer, Transform transform) {
689 mWriter.selectDisplay(translate<int64_t>(display));
690 mWriter.selectLayer(translate<int64_t>(layer));
691 mWriter.setLayerTransform(translate<AidlTransform>(transform));
692 return Error::NONE;
693}
694
695Error AidlComposer::setLayerVisibleRegion(Display display, Layer layer,
696 const std::vector<IComposerClient::Rect>& visible) {
697 mWriter.selectDisplay(translate<int64_t>(display));
698 mWriter.selectLayer(translate<int64_t>(layer));
699 mWriter.setLayerVisibleRegion(translate<AidlRect>(visible));
700 return Error::NONE;
701}
702
703Error AidlComposer::setLayerZOrder(Display display, Layer layer, uint32_t z) {
704 mWriter.selectDisplay(translate<int64_t>(display));
705 mWriter.selectLayer(translate<int64_t>(layer));
706 mWriter.setLayerZOrder(z);
707 return Error::NONE;
708}
709
710Error AidlComposer::execute() {
711 // prepare input command queue
712 bool queueChanged = false;
713 int32_t commandLength = 0;
714 std::vector<aidl::android::hardware::common::NativeHandle> commandHandles;
715 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) {
716 mWriter.reset();
717 return Error::NO_RESOURCES;
718 }
719
720 // set up new input command queue if necessary
721 if (queueChanged) {
722 const auto status = mAidlComposerClient->setInputCommandQueue(mWriter.getMQDescriptor());
723 if (!status.isOk()) {
724 ALOGE("setInputCommandQueue failed %s", status.getDescription().c_str());
725 mWriter.reset();
726 return static_cast<Error>(status.getServiceSpecificError());
727 }
728 }
729
730 if (commandLength == 0) {
731 mWriter.reset();
732 return Error::NONE;
733 }
734
735 AidlExecuteCommandsStatus commandStatus;
736 auto status =
737 mAidlComposerClient->executeCommands(commandLength, commandHandles, &commandStatus);
738 // executeCommands can fail because of out-of-fd and we do not want to
739 // abort() in that case
740 if (!status.isOk()) {
741 ALOGE("executeCommands failed %s", status.getDescription().c_str());
742 return static_cast<Error>(status.getServiceSpecificError());
743 }
744
745 // set up new output command queue if necessary
746 if (commandStatus.queueChanged) {
747 ::aidl::android::hardware::common::fmq::MQDescriptor<
748 int32_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>
749 outputCommandQueue;
750 status = mAidlComposerClient->getOutputCommandQueue(&outputCommandQueue);
751 if (!status.isOk()) {
752 ALOGE("getOutputCommandQueue failed %s", status.getDescription().c_str());
753 return static_cast<Error>(status.getServiceSpecificError());
754 }
755
756 mReader.setMQDescriptor(outputCommandQueue);
757 }
758
759 Error error;
760 if (mReader.readQueue(commandStatus.length, std::move(commandStatus.handles))) {
761 error = static_cast<Error>(mReader.parse());
762 mReader.reset();
763 } else {
764 error = Error::NO_RESOURCES;
765 }
766
767 if (error == Error::NONE) {
768 std::vector<AidlCommandReader::CommandError> commandErrors = mReader.takeErrors();
769
770 for (const auto& cmdErr : commandErrors) {
771 auto command = mWriter.getCommand(cmdErr.location);
772 if (command == Command::VALIDATE_DISPLAY || command == Command::PRESENT_DISPLAY ||
773 command == Command::PRESENT_OR_VALIDATE_DISPLAY) {
774 error = cmdErr.error;
775 } else {
776 ALOGW("command 0x%x generated error %d", command, cmdErr.error);
777 }
778 }
779 }
780
781 mWriter.reset();
782
783 return error;
784}
785
786Error AidlComposer::setLayerPerFrameMetadata(
787 Display display, Layer layer,
788 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) {
789 mWriter.selectDisplay(translate<int64_t>(display));
790 mWriter.selectLayer(translate<int64_t>(layer));
791 mWriter.setLayerPerFrameMetadata(translate<AidlPerFrameMetadata>(perFrameMetadatas));
792 return Error::NONE;
793}
794
795std::vector<IComposerClient::PerFrameMetadataKey> AidlComposer::getPerFrameMetadataKeys(
796 Display display) {
797 std::vector<AidlPerFrameMetadataKey> keys;
798 const auto status =
799 mAidlComposerClient->getPerFrameMetadataKeys(translate<int64_t>(display), &keys);
800 if (!status.isOk()) {
801 ALOGE("getPerFrameMetadataKeys failed %s", status.getDescription().c_str());
802 return {};
803 }
804 return translate<IComposerClient::PerFrameMetadataKey>(keys);
805}
806
807Error AidlComposer::getRenderIntents(Display display, ColorMode colorMode,
808 std::vector<RenderIntent>* outRenderIntents) {
809 std::vector<AidlRenderIntent> renderIntents;
810 const auto status = mAidlComposerClient->getRenderIntents(translate<int64_t>(display),
811 translate<AidlColorMode>(colorMode),
812 &renderIntents);
813 if (!status.isOk()) {
814 ALOGE("getRenderIntents failed %s", status.getDescription().c_str());
815 return static_cast<Error>(status.getServiceSpecificError());
816 }
817 *outRenderIntents = translate<RenderIntent>(renderIntents);
818 return Error::NONE;
819}
820
821Error AidlComposer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) {
822 std::vector<float> matrix;
823 const auto status =
824 mAidlComposerClient->getDataspaceSaturationMatrix(translate<AidlDataspace>(dataspace),
825 &matrix);
826 if (!status.isOk()) {
827 ALOGE("getDataspaceSaturationMatrix failed %s", status.getDescription().c_str());
828 return static_cast<Error>(status.getServiceSpecificError());
829 }
830 *outMatrix = makeMat4(matrix);
831 return Error::NONE;
832}
833
834Error AidlComposer::getDisplayIdentificationData(Display display, uint8_t* outPort,
835 std::vector<uint8_t>* outData) {
836 AidlDisplayIdentification displayIdentification;
837 const auto status =
838 mAidlComposerClient->getDisplayIdentificationData(translate<int64_t>(display),
839 &displayIdentification);
840 if (!status.isOk()) {
841 ALOGE("getDisplayIdentificationData failed %s", status.getDescription().c_str());
842 return static_cast<Error>(status.getServiceSpecificError());
843 }
844
845 *outPort = static_cast<uint8_t>(displayIdentification.port);
846 *outData = displayIdentification.data;
847
848 return Error::NONE;
849}
850
851Error AidlComposer::setLayerColorTransform(Display display, Layer layer, const float* matrix) {
852 mWriter.selectDisplay(translate<int64_t>(display));
853 mWriter.selectLayer(translate<int64_t>(layer));
854 mWriter.setLayerColorTransform(matrix);
855 return Error::NONE;
856}
857
858Error AidlComposer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat,
859 Dataspace* outDataspace,
860 uint8_t* outComponentMask) {
861 if (!outFormat || !outDataspace || !outComponentMask) {
862 return Error::BAD_PARAMETER;
863 }
864
865 AidlDisplayContentSamplingAttributes attributes;
866 const auto status =
867 mAidlComposerClient->getDisplayedContentSamplingAttributes(translate<int64_t>(display),
868 &attributes);
869 if (!status.isOk()) {
870 ALOGE("getDisplayedContentSamplingAttributes failed %s", status.getDescription().c_str());
871 return static_cast<Error>(status.getServiceSpecificError());
872 }
873
874 *outFormat = translate<PixelFormat>(attributes.format);
875 *outDataspace = translate<Dataspace>(attributes.dataspace);
876 *outComponentMask = static_cast<uint8_t>(attributes.componentMask);
877 return Error::NONE;
878}
879
880Error AidlComposer::setDisplayContentSamplingEnabled(Display display, bool enabled,
881 uint8_t componentMask, uint64_t maxFrames) {
882 const auto status =
883 mAidlComposerClient
884 ->setDisplayedContentSamplingEnabled(translate<int64_t>(display), enabled,
885 static_cast<AidlFormatColorComponent>(
886 componentMask),
887 static_cast<int64_t>(maxFrames));
888 if (!status.isOk()) {
889 ALOGE("setDisplayedContentSamplingEnabled failed %s", status.getDescription().c_str());
890 return static_cast<Error>(status.getServiceSpecificError());
891 }
892 return Error::NONE;
893}
894
895Error AidlComposer::getDisplayedContentSample(Display display, uint64_t maxFrames,
896 uint64_t timestamp, DisplayedFrameStats* outStats) {
897 if (!outStats) {
898 return Error::BAD_PARAMETER;
899 }
900
901 AidlDisplayContentSample sample;
902 const auto status =
903 mAidlComposerClient->getDisplayedContentSample(translate<int64_t>(display),
904 static_cast<int64_t>(maxFrames),
905 static_cast<int64_t>(timestamp),
906 &sample);
907 if (!status.isOk()) {
908 ALOGE("getDisplayedContentSample failed %s", status.getDescription().c_str());
909 return static_cast<Error>(status.getServiceSpecificError());
910 }
911 *outStats = translate<DisplayedFrameStats>(sample);
912 return Error::NONE;
913}
914
915Error AidlComposer::setLayerPerFrameMetadataBlobs(
916 Display display, Layer layer,
917 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) {
918 mWriter.selectDisplay(translate<int64_t>(display));
919 mWriter.selectLayer(translate<int64_t>(layer));
920 mWriter.setLayerPerFrameMetadataBlobs(translate<AidlPerFrameMetadataBlob>(metadata));
921 return Error::NONE;
922}
923
924Error AidlComposer::setDisplayBrightness(Display display, float brightness) {
925 const auto status =
926 mAidlComposerClient->setDisplayBrightness(translate<int64_t>(display), brightness);
927 if (!status.isOk()) {
928 ALOGE("setDisplayBrightness failed %s", status.getDescription().c_str());
929 return static_cast<Error>(status.getServiceSpecificError());
930 }
931 return Error::NONE;
932}
933
934Error AidlComposer::getDisplayCapabilities(Display display,
935 std::vector<DisplayCapability>* outCapabilities) {
936 std::vector<AidlDisplayCapability> capabilities;
937 const auto status =
938 mAidlComposerClient->getDisplayCapabilities(translate<int64_t>(display), &capabilities);
939 if (!status.isOk()) {
940 ALOGE("getDisplayCapabilities failed %s", status.getDescription().c_str());
941 return static_cast<Error>(status.getServiceSpecificError());
942 }
943 *outCapabilities = translate<DisplayCapability>(capabilities);
944 return Error::NONE;
945}
946
947V2_4::Error AidlComposer::getDisplayConnectionType(
948 Display display, IComposerClient::DisplayConnectionType* outType) {
949 AidlDisplayConnectionType type;
950 const auto status =
951 mAidlComposerClient->getDisplayConnectionType(translate<int64_t>(display), &type);
952 if (!status.isOk()) {
953 ALOGE("getDisplayConnectionType failed %s", status.getDescription().c_str());
954 return static_cast<V2_4::Error>(status.getServiceSpecificError());
955 }
956 *outType = translate<IComposerClient::DisplayConnectionType>(type);
957 return V2_4::Error::NONE;
958}
959
960V2_4::Error AidlComposer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) {
961 int32_t vsyncPeriod;
962 const auto status =
963 mAidlComposerClient->getDisplayVsyncPeriod(translate<int64_t>(display), &vsyncPeriod);
964 if (!status.isOk()) {
965 ALOGE("getDisplayVsyncPeriod failed %s", status.getDescription().c_str());
966 return static_cast<V2_4::Error>(status.getServiceSpecificError());
967 }
968 *outVsyncPeriod = translate<VsyncPeriodNanos>(vsyncPeriod);
969 return V2_4::Error::NONE;
970}
971
972V2_4::Error AidlComposer::setActiveConfigWithConstraints(
973 Display display, Config config,
974 const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
975 VsyncPeriodChangeTimeline* outTimeline) {
976 AidlVsyncPeriodChangeTimeline timeline;
977 const auto status =
978 mAidlComposerClient
979 ->setActiveConfigWithConstraints(translate<int64_t>(display),
980 translate<int32_t>(config),
981 translate<AidlVsyncPeriodChangeConstraints>(
982 vsyncPeriodChangeConstraints),
983 &timeline);
984 if (!status.isOk()) {
985 ALOGE("setActiveConfigWithConstraints failed %s", status.getDescription().c_str());
986 return static_cast<V2_4::Error>(status.getServiceSpecificError());
987 }
988 *outTimeline = translate<VsyncPeriodChangeTimeline>(timeline);
989 return V2_4::Error::NONE;
990}
991
992V2_4::Error AidlComposer::setAutoLowLatencyMode(Display display, bool on) {
993 const auto status = mAidlComposerClient->setAutoLowLatencyMode(translate<int64_t>(display), on);
994 if (!status.isOk()) {
995 ALOGE("setAutoLowLatencyMode failed %s", status.getDescription().c_str());
996 return static_cast<V2_4::Error>(status.getServiceSpecificError());
997 }
998 return V2_4::Error::NONE;
999}
1000
1001V2_4::Error AidlComposer::getSupportedContentTypes(
1002 Display displayId, std::vector<IComposerClient::ContentType>* outSupportedContentTypes) {
1003 std::vector<AidlContentType> types;
1004 const auto status =
1005 mAidlComposerClient->getSupportedContentTypes(translate<int64_t>(displayId), &types);
1006 if (!status.isOk()) {
1007 ALOGE("getSupportedContentTypes failed %s", status.getDescription().c_str());
1008 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1009 }
1010 *outSupportedContentTypes = translate<IComposerClient::ContentType>(types);
1011 return V2_4::Error::NONE;
1012}
1013
1014V2_4::Error AidlComposer::setContentType(Display display,
1015 IComposerClient::ContentType contentType) {
1016 const auto status =
1017 mAidlComposerClient->setContentType(translate<int64_t>(display),
1018 translate<AidlContentType>(contentType));
1019 if (!status.isOk()) {
1020 ALOGE("setContentType failed %s", status.getDescription().c_str());
1021 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1022 }
1023 return V2_4::Error::NONE;
1024}
1025
1026V2_4::Error AidlComposer::setLayerGenericMetadata(Display display, Layer layer,
1027 const std::string& key, bool mandatory,
1028 const std::vector<uint8_t>& value) {
1029 mWriter.selectDisplay(translate<int64_t>(display));
1030 mWriter.selectLayer(translate<int64_t>(layer));
1031 mWriter.setLayerGenericMetadata(key, mandatory, value);
1032 return V2_4::Error::NONE;
1033}
1034
1035V2_4::Error AidlComposer::getLayerGenericMetadataKeys(
1036 std::vector<IComposerClient::LayerGenericMetadataKey>* outKeys) {
1037 std::vector<AidlLayerGenericMetadataKey> keys;
1038 const auto status = mAidlComposerClient->getLayerGenericMetadataKeys(&keys);
1039 if (!status.isOk()) {
1040 ALOGE("getLayerGenericMetadataKeys failed %s", status.getDescription().c_str());
1041 return static_cast<V2_4::Error>(status.getServiceSpecificError());
1042 }
1043 *outKeys = translate<IComposerClient::LayerGenericMetadataKey>(keys);
1044 return V2_4::Error::NONE;
1045}
1046
1047Error AidlComposer::getClientTargetProperty(
1048 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1049 mReader.takeClientTargetProperty(display, outClientTargetProperty);
1050 return Error::NONE;
1051}
1052
1053AidlCommandReader::~AidlCommandReader() {
1054 resetData();
1055}
1056
1057int AidlCommandReader::parse() {
1058 resetData();
1059
1060 Command command;
1061 uint16_t length = 0;
1062
1063 while (!isEmpty()) {
1064 if (!beginCommand(&command, &length)) {
1065 break;
1066 }
1067
1068 bool parsed = false;
1069 switch (command) {
1070 case Command::SELECT_DISPLAY:
1071 parsed = parseSelectDisplay(length);
1072 break;
1073 case Command::SET_ERROR:
1074 parsed = parseSetError(length);
1075 break;
1076 case Command::SET_CHANGED_COMPOSITION_TYPES:
1077 parsed = parseSetChangedCompositionTypes(length);
1078 break;
1079 case Command::SET_DISPLAY_REQUESTS:
1080 parsed = parseSetDisplayRequests(length);
1081 break;
1082 case Command::SET_PRESENT_FENCE:
1083 parsed = parseSetPresentFence(length);
1084 break;
1085 case Command::SET_RELEASE_FENCES:
1086 parsed = parseSetReleaseFences(length);
1087 break;
1088 case Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT:
1089 parsed = parseSetPresentOrValidateDisplayResult(length);
1090 break;
1091 case Command::SET_CLIENT_TARGET_PROPERTY:
1092 parsed = parseSetClientTargetProperty(length);
1093 break;
1094 default:
1095 parsed = false;
1096 break;
1097 }
1098
1099 endCommand();
1100
1101 if (!parsed) {
1102 ALOGE("failed to parse command 0x%x length %" PRIu16, command, length);
1103 break;
1104 }
1105 }
1106
1107 return isEmpty() ? 0 : AidlIComposerClient::EX_NO_RESOURCES;
1108}
1109
1110bool AidlCommandReader::parseSelectDisplay(uint16_t length) {
1111 if (length != CommandWriterBase::kSelectDisplayLength) {
1112 return false;
1113 }
1114
1115 mCurrentReturnData = &mReturnData[read64()];
1116
1117 return true;
1118}
1119
1120bool AidlCommandReader::parseSetError(uint16_t length) {
1121 if (length != CommandWriterBase::kSetErrorLength) {
1122 return false;
1123 }
1124
1125 auto location = read();
1126 auto error = static_cast<Error>(readSigned());
1127
1128 mErrors.emplace_back(CommandError{location, error});
1129
1130 return true;
1131}
1132
1133bool AidlCommandReader::parseSetChangedCompositionTypes(uint16_t length) {
1134 // (layer id [64bit], composition type [32bit]) pairs
1135 static constexpr int kCommandWords = 3;
1136
1137 if (length % kCommandWords != 0 || !mCurrentReturnData) {
1138 return false;
1139 }
1140
1141 uint32_t count = length / kCommandWords;
1142 mCurrentReturnData->changedLayers.reserve(count);
1143 mCurrentReturnData->compositionTypes.reserve(count);
1144 while (count > 0) {
1145 auto layer = read64();
1146 auto type = static_cast<IComposerClient::Composition>(readSigned());
1147
1148 mCurrentReturnData->changedLayers.push_back(layer);
1149 mCurrentReturnData->compositionTypes.push_back(type);
1150
1151 count--;
1152 }
1153
1154 return true;
1155}
1156
1157bool AidlCommandReader::parseSetDisplayRequests(uint16_t length) {
1158 // display requests [32 bit] followed by
1159 // (layer id [64bit], layer requests [32bit]) pairs
1160 static constexpr int kDisplayRequestsWords = 1;
1161 static constexpr int kCommandWords = 3;
1162 if (length % kCommandWords != kDisplayRequestsWords || !mCurrentReturnData) {
1163 return false;
1164 }
1165
1166 mCurrentReturnData->displayRequests = read();
1167
1168 uint32_t count = (length - kDisplayRequestsWords) / kCommandWords;
1169 mCurrentReturnData->requestedLayers.reserve(count);
1170 mCurrentReturnData->requestMasks.reserve(count);
1171 while (count > 0) {
1172 auto layer = read64();
1173 auto layerRequestMask = read();
1174
1175 mCurrentReturnData->requestedLayers.push_back(layer);
1176 mCurrentReturnData->requestMasks.push_back(layerRequestMask);
1177
1178 count--;
1179 }
1180
1181 return true;
1182}
1183
1184bool AidlCommandReader::parseSetPresentFence(uint16_t length) {
1185 if (length != CommandWriterBase::kSetPresentFenceLength || !mCurrentReturnData) {
1186 return false;
1187 }
1188
1189 if (mCurrentReturnData->presentFence >= 0) {
1190 close(mCurrentReturnData->presentFence);
1191 }
1192 mCurrentReturnData->presentFence = readFence();
1193
1194 return true;
1195}
1196
1197bool AidlCommandReader::parseSetReleaseFences(uint16_t length) {
1198 // (layer id [64bit], release fence index [32bit]) pairs
1199 static constexpr int kCommandWords = 3;
1200
1201 if (length % kCommandWords != 0 || !mCurrentReturnData) {
1202 return false;
1203 }
1204
1205 uint32_t count = length / kCommandWords;
1206 mCurrentReturnData->releasedLayers.reserve(count);
1207 mCurrentReturnData->releaseFences.reserve(count);
1208 while (count > 0) {
1209 auto layer = read64();
1210 auto fence = readFence();
1211
1212 mCurrentReturnData->releasedLayers.push_back(layer);
1213 mCurrentReturnData->releaseFences.push_back(fence);
1214
1215 count--;
1216 }
1217
1218 return true;
1219}
1220
1221bool AidlCommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) {
1222 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) {
1223 return false;
1224 }
1225 mCurrentReturnData->presentOrValidateState = read();
1226 return true;
1227}
1228
1229bool AidlCommandReader::parseSetClientTargetProperty(uint16_t length) {
1230 if (length != CommandWriterBase::kSetClientTargetPropertyLength || !mCurrentReturnData) {
1231 return false;
1232 }
1233 mCurrentReturnData->clientTargetProperty.pixelFormat = static_cast<PixelFormat>(readSigned());
1234 mCurrentReturnData->clientTargetProperty.dataspace = static_cast<Dataspace>(readSigned());
1235 return true;
1236}
1237
1238void AidlCommandReader::resetData() {
1239 mErrors.clear();
1240
1241 for (auto& data : mReturnData) {
1242 if (data.second.presentFence >= 0) {
1243 close(data.second.presentFence);
1244 }
1245 for (auto fence : data.second.releaseFences) {
1246 if (fence >= 0) {
1247 close(fence);
1248 }
1249 }
1250 }
1251
1252 mReturnData.clear();
1253 mCurrentReturnData = nullptr;
1254}
1255
1256std::vector<AidlCommandReader::CommandError> AidlCommandReader::takeErrors() {
1257 return std::move(mErrors);
1258}
1259
1260bool AidlCommandReader::hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
1261 uint32_t* outNumLayerRequestMasks) const {
1262 auto found = mReturnData.find(display);
1263 if (found == mReturnData.end()) {
1264 *outNumChangedCompositionTypes = 0;
1265 *outNumLayerRequestMasks = 0;
1266 return false;
1267 }
1268
1269 const ReturnData& data = found->second;
1270
1271 *outNumChangedCompositionTypes = static_cast<uint32_t>(data.compositionTypes.size());
1272 *outNumLayerRequestMasks = static_cast<uint32_t>(data.requestMasks.size());
1273
1274 return !(data.compositionTypes.empty() && data.requestMasks.empty());
1275}
1276
1277void AidlCommandReader::takeChangedCompositionTypes(
1278 Display display, std::vector<Layer>* outLayers,
1279 std::vector<IComposerClient::Composition>* outTypes) {
1280 auto found = mReturnData.find(display);
1281 if (found == mReturnData.end()) {
1282 outLayers->clear();
1283 outTypes->clear();
1284 return;
1285 }
1286
1287 ReturnData& data = found->second;
1288
1289 *outLayers = std::move(data.changedLayers);
1290 *outTypes = std::move(data.compositionTypes);
1291}
1292
1293void AidlCommandReader::takeDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
1294 std::vector<Layer>* outLayers,
1295 std::vector<uint32_t>* outLayerRequestMasks) {
1296 auto found = mReturnData.find(display);
1297 if (found == mReturnData.end()) {
1298 *outDisplayRequestMask = 0;
1299 outLayers->clear();
1300 outLayerRequestMasks->clear();
1301 return;
1302 }
1303
1304 ReturnData& data = found->second;
1305
1306 *outDisplayRequestMask = data.displayRequests;
1307 *outLayers = std::move(data.requestedLayers);
1308 *outLayerRequestMasks = std::move(data.requestMasks);
1309}
1310
1311void AidlCommandReader::takeReleaseFences(Display display, std::vector<Layer>* outLayers,
1312 std::vector<int>* outReleaseFences) {
1313 auto found = mReturnData.find(display);
1314 if (found == mReturnData.end()) {
1315 outLayers->clear();
1316 outReleaseFences->clear();
1317 return;
1318 }
1319
1320 ReturnData& data = found->second;
1321
1322 *outLayers = std::move(data.releasedLayers);
1323 *outReleaseFences = std::move(data.releaseFences);
1324}
1325
1326void AidlCommandReader::takePresentFence(Display display, int* outPresentFence) {
1327 auto found = mReturnData.find(display);
1328 if (found == mReturnData.end()) {
1329 *outPresentFence = -1;
1330 return;
1331 }
1332
1333 ReturnData& data = found->second;
1334
1335 *outPresentFence = data.presentFence;
1336 data.presentFence = -1;
1337}
1338
1339void AidlCommandReader::takePresentOrValidateStage(Display display, uint32_t* state) {
1340 auto found = mReturnData.find(display);
1341 if (found == mReturnData.end()) {
1342 *state = static_cast<uint32_t>(-1);
1343 return;
1344 }
1345 ReturnData& data = found->second;
1346 *state = data.presentOrValidateState;
1347}
1348
1349void AidlCommandReader::takeClientTargetProperty(
1350 Display display, IComposerClient::ClientTargetProperty* outClientTargetProperty) {
1351 auto found = mReturnData.find(display);
1352
1353 // If not found, return the default values.
1354 if (found == mReturnData.end()) {
1355 outClientTargetProperty->pixelFormat = PixelFormat::RGBA_8888;
1356 outClientTargetProperty->dataspace = Dataspace::UNKNOWN;
1357 return;
1358 }
1359
1360 ReturnData& data = found->second;
1361 *outClientTargetProperty = data.clientTargetProperty;
1362}
1363
1364} // namespace impl
1365} // namespace Hwc2
1366} // namespace android