1 /*
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 #include "HalImpl.h"
18
19 #include <aidl/android/hardware/graphics/composer3/IComposerCallback.h>
20 #include <android-base/logging.h>
21 #include <hardware/hwcomposer2.h>
22
23 #include "ExynosDevice.h"
24 #include "ExynosDeviceModule.h"
25 #include "ExynosDisplay.h"
26 #include "ExynosHWCService.h"
27 #include "ExynosLayer.h"
28 #include "TranslateHwcAidl.h"
29 #include "Util.h"
30
31 using namespace SOC_VERSION;
32
33 namespace aidl::android::hardware::graphics::composer3::impl {
34
create()35 std::unique_ptr<IComposerHal> IComposerHal::create() {
36 auto device = std::make_unique<ExynosDeviceModule>();
37 if (!device) {
38 return nullptr;
39 }
40
41 return std::make_unique<HalImpl>(std::move(device));
42 }
43
44 namespace hook {
45
hotplug(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,int32_t connected)46 void hotplug(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
47 int32_t connected) {
48 auto hal = static_cast<HalImpl*>(callbackData);
49 int64_t display;
50
51 h2a::translate(hwcDisplay, display);
52 hal->getEventCallback()->onHotplug(display, connected == HWC2_CONNECTION_CONNECTED);
53 }
54
refresh(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)55 void refresh(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) {
56 auto hal = static_cast<HalImpl*>(callbackData);
57 int64_t display;
58
59 h2a::translate(hwcDisplay, display);
60 hal->getEventCallback()->onRefresh(display);
61 }
62
vsync(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,int64_t timestamp,hwc2_vsync_period_t hwcVsyncPeriodNanos)63 void vsync(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
64 int64_t timestamp, hwc2_vsync_period_t hwcVsyncPeriodNanos) {
65 auto hal = static_cast<HalImpl*>(callbackData);
66 int64_t display;
67 int32_t vsyncPeriodNanos;
68
69 h2a::translate(hwcDisplay, display);
70 h2a::translate(hwcVsyncPeriodNanos, vsyncPeriodNanos);
71 hal->getEventCallback()->onVsync(display, timestamp, vsyncPeriodNanos);
72 }
73
vsyncPeriodTimingChanged(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,hwc_vsync_period_change_timeline_t * hwcTimeline)74 void vsyncPeriodTimingChanged(hwc2_callback_data_t callbackData,
75 hwc2_display_t hwcDisplay,
76 hwc_vsync_period_change_timeline_t* hwcTimeline) {
77 auto hal = static_cast<HalImpl*>(callbackData);
78 int64_t display;
79 VsyncPeriodChangeTimeline timeline;
80
81 h2a::translate(hwcDisplay, display);
82 h2a::translate(*hwcTimeline, timeline);
83 hal->getEventCallback()->onVsyncPeriodTimingChanged(display, timeline);
84 }
85
vsyncIdle(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)86 void vsyncIdle(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) {
87 auto hal = static_cast<HalImpl*>(callbackData);
88 int64_t display;
89
90 h2a::translate(hwcDisplay, display);
91 hal->getEventCallback()->onVsyncIdle(display);
92 }
93
seamlessPossible(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)94 void seamlessPossible(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) {
95 auto hal = static_cast<HalImpl*>(callbackData);
96 int64_t display;
97
98 h2a::translate(hwcDisplay, display);
99 hal->getEventCallback()->onSeamlessPossible(display);
100 }
101
102 } // nampesapce hook
103
HalImpl(std::unique_ptr<ExynosDevice> device)104 HalImpl::HalImpl(std::unique_ptr<ExynosDevice> device) : mDevice(std::move(device)) {
105 initCaps();
106 #ifdef USES_HWC_SERVICES
107 LOG(DEBUG) << "Start HWCService";
108 mHwcCtx = std::make_unique<ExynosHWCCtx>();
109 memset(&mHwcCtx->base, 0, sizeof(mHwcCtx->base));
110 mHwcCtx->device = mDevice.get();
111
112 auto hwcService = ::android::ExynosHWCService::getExynosHWCService();
113 hwcService->setExynosHWCCtx(mHwcCtx.get());
114 // This callback is for DP hotplug event if connected
115 // hwcService->setBootFinishedCallback(...);
116 #endif
117 }
118
initCaps()119 void HalImpl::initCaps() {
120 uint32_t count = 0;
121 mDevice->getCapabilities(&count, nullptr);
122
123 std::vector<int32_t> halCaps(count);
124 mDevice->getCapabilities(&count, halCaps.data());
125
126 for (auto hwcCap : halCaps) {
127 Capability cap;
128 h2a::translate(hwcCap, cap);
129 mCaps.insert(cap);
130 }
131
132 mCaps.insert(Capability::BOOT_DISPLAY_CONFIG);
133 }
134
getHalDisplay(int64_t display,ExynosDisplay * & halDisplay)135 int32_t HalImpl::getHalDisplay(int64_t display, ExynosDisplay*& halDisplay) {
136 hwc2_display_t hwcDisplay;
137 a2h::translate(display, hwcDisplay);
138 halDisplay = mDevice->getDisplay(static_cast<uint32_t>(hwcDisplay));
139
140 if (!halDisplay) { [[unlikely]]
141 return HWC2_ERROR_BAD_DISPLAY;
142 }
143 return HWC2_ERROR_NONE;
144 }
145
getHalLayer(int64_t display,int64_t layer,ExynosLayer * & halLayer)146 int32_t HalImpl::getHalLayer(int64_t display, int64_t layer, ExynosLayer*& halLayer) {
147 ExynosDisplay* halDisplay;
148 RET_IF_ERR(getHalDisplay(display, halDisplay));
149
150 hwc2_layer_t hwcLayer;
151 a2h::translate(layer, hwcLayer);
152 halLayer = halDisplay->checkLayer(hwcLayer);
153 if (!halLayer) { [[unlikely]]
154 return HWC2_ERROR_BAD_LAYER;
155 }
156
157 return HWC2_ERROR_NONE;
158 }
159
hasCapability(Capability cap)160 bool HalImpl::hasCapability(Capability cap) {
161 return mCaps.find(cap) != mCaps.end();
162 }
163
getCapabilities(std::vector<Capability> * caps)164 void HalImpl::getCapabilities(std::vector<Capability>* caps) {
165 caps->clear();
166 caps->insert(caps->begin(), mCaps.begin(), mCaps.end());
167 }
168
dumpDebugInfo(std::string * output)169 void HalImpl::dumpDebugInfo(std::string* output) {
170 if (output == nullptr) return;
171
172 String8 result;
173 mDevice->dump(result);
174
175 output->resize(result.size());
176 output->assign(result.c_str());
177 }
178
registerEventCallback(EventCallback * callback)179 void HalImpl::registerEventCallback(EventCallback* callback) {
180 mEventCallback = callback;
181
182 mDevice->registerCallback(HWC2_CALLBACK_HOTPLUG, this,
183 reinterpret_cast<hwc2_function_pointer_t>(hook::hotplug));
184 mDevice->registerCallback(HWC2_CALLBACK_REFRESH, this,
185 reinterpret_cast<hwc2_function_pointer_t>(hook::refresh));
186 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_2_4, this,
187 reinterpret_cast<hwc2_function_pointer_t>(hook::vsync));
188 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this,
189 reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncPeriodTimingChanged));
190 mDevice->registerCallback(HWC2_CALLBACK_SEAMLESS_POSSIBLE, this,
191 reinterpret_cast<hwc2_function_pointer_t>(hook::seamlessPossible));
192
193 // register HWC3 Callback
194 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this,
195 reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncIdle));
196 }
197
unregisterEventCallback()198 void HalImpl::unregisterEventCallback() {
199 mDevice->registerCallback(HWC2_CALLBACK_HOTPLUG, this, nullptr);
200 mDevice->registerCallback(HWC2_CALLBACK_REFRESH, this, nullptr);
201 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_2_4, this, nullptr);
202 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this, nullptr);
203 mDevice->registerCallback(HWC2_CALLBACK_SEAMLESS_POSSIBLE, this, nullptr);
204
205 // unregister HWC3 Callback
206 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this, nullptr);
207
208 mEventCallback = nullptr;
209 }
210
acceptDisplayChanges(int64_t display)211 int32_t HalImpl::acceptDisplayChanges(int64_t display) {
212 ExynosDisplay* halDisplay;
213 RET_IF_ERR(getHalDisplay(display, halDisplay));
214
215 return halDisplay->acceptDisplayChanges();
216 }
217
createLayer(int64_t display,int64_t * outLayer)218 int32_t HalImpl::createLayer(int64_t display, int64_t* outLayer) {
219 ExynosDisplay* halDisplay;
220 RET_IF_ERR(getHalDisplay(display, halDisplay));
221
222 hwc2_layer_t hwcLayer = 0;
223 RET_IF_ERR(halDisplay->createLayer(&hwcLayer));
224
225 h2a::translate(hwcLayer, *outLayer);
226 return HWC2_ERROR_NONE;
227 }
228
destroyLayer(int64_t display,int64_t layer)229 int32_t HalImpl::destroyLayer(int64_t display, int64_t layer) {
230 ExynosDisplay* halDisplay;
231 RET_IF_ERR(getHalDisplay(display, halDisplay));
232
233 ExynosLayer *halLayer;
234 RET_IF_ERR(getHalLayer(display, layer, halLayer));
235
236 return halDisplay->destroyLayer(reinterpret_cast<hwc2_layer_t>(halLayer));
237 }
238
createVirtualDisplay(uint32_t width,uint32_t height,AidlPixelFormat format,VirtualDisplay * outDisplay)239 int32_t HalImpl::createVirtualDisplay(uint32_t width, uint32_t height, AidlPixelFormat format,
240 VirtualDisplay* outDisplay) {
241 int32_t hwcFormat;
242 a2h::translate(format, hwcFormat);
243 hwc2_display_t hwcDisplay = getDisplayId(HWC_DISPLAY_VIRTUAL, 0);
244 auto halDisplay = mDevice->getDisplay(static_cast<uint32_t>(hwcDisplay));
245 if (!halDisplay) {
246 return HWC2_ERROR_BAD_PARAMETER;
247 }
248
249 RET_IF_ERR(mDevice->createVirtualDisplay(width, height, &hwcFormat, halDisplay));
250
251 h2a::translate(hwcDisplay, outDisplay->display);
252 h2a::translate(hwcFormat, outDisplay->format);
253
254 return HWC2_ERROR_NONE;
255 }
256
destroyVirtualDisplay(int64_t display)257 int32_t HalImpl::destroyVirtualDisplay(int64_t display) {
258 ExynosDisplay* halDisplay;
259 RET_IF_ERR(getHalDisplay(display, halDisplay));
260
261 return mDevice->destroyVirtualDisplay(halDisplay);
262 }
263
getActiveConfig(int64_t display,int32_t * outConfig)264 int32_t HalImpl::getActiveConfig(int64_t display, int32_t* outConfig) {
265 ExynosDisplay* halDisplay;
266 RET_IF_ERR(getHalDisplay(display, halDisplay));
267
268 hwc2_config_t hwcConfig;
269 RET_IF_ERR(halDisplay->getActiveConfig(&hwcConfig));
270
271 h2a::translate(hwcConfig, *outConfig);
272 return HWC2_ERROR_NONE;
273 }
274
getColorModes(int64_t display,std::vector<ColorMode> * outModes)275 int32_t HalImpl::getColorModes(int64_t display, std::vector<ColorMode>* outModes) {
276 ExynosDisplay* halDisplay;
277 RET_IF_ERR(getHalDisplay(display, halDisplay));
278
279 uint32_t count = 0;
280 RET_IF_ERR(halDisplay->getColorModes(&count, nullptr));
281
282 std::vector<int32_t> hwcModes(count);
283 RET_IF_ERR(halDisplay->getColorModes(&count, hwcModes.data()));
284
285 h2a::translate(hwcModes, *outModes);
286 return HWC2_ERROR_NONE;
287 }
288
getDataspaceSaturationMatrix(common::Dataspace dataspace,std::vector<float> * matrix)289 int32_t HalImpl::getDataspaceSaturationMatrix([[maybe_unused]] common::Dataspace dataspace,
290 std::vector<float>* matrix) {
291 // Pixel HWC does not support dataspace saturation matrix, return unit matrix.
292 std::vector<float> unitMatrix = {
293 1.0f, 0.0f, 0.0f, 0.0f,
294 0.0f, 1.0f, 0.0f, 0.0f,
295 0.0f, 0.0f, 1.0f, 0.0f,
296 0.0f, 0.0f, 0.0f, 1.0f,
297 };
298
299 *matrix = std::move(unitMatrix);
300 return HWC2_ERROR_NONE;
301 }
302
getDisplayAttribute(int64_t display,int32_t config,DisplayAttribute attribute,int32_t * outValue)303 int32_t HalImpl::getDisplayAttribute(int64_t display, int32_t config,
304 DisplayAttribute attribute, int32_t* outValue) {
305 ExynosDisplay* halDisplay;
306 RET_IF_ERR(getHalDisplay(display, halDisplay));
307
308 hwc2_config_t hwcConfig;
309 int32_t hwcAttr;
310 a2h::translate(config, hwcConfig);
311 a2h::translate(attribute, hwcAttr);
312
313 auto err = halDisplay->getDisplayAttribute(hwcConfig, hwcAttr, outValue);
314 if (err != HWC2_ERROR_NONE && *outValue == -1) {
315 return HWC2_ERROR_BAD_PARAMETER;
316 }
317 return HWC2_ERROR_NONE;
318 }
319
getDisplayBrightnessSupport(int64_t display,bool & outSupport)320 int32_t HalImpl::getDisplayBrightnessSupport(int64_t display, bool& outSupport) {
321 ExynosDisplay* halDisplay;
322 RET_IF_ERR(getHalDisplay(display, halDisplay));
323
324 return halDisplay->getDisplayBrightnessSupport(&outSupport);
325 }
326
getDisplayCapabilities(int64_t display,std::vector<DisplayCapability> * caps)327 int32_t HalImpl::getDisplayCapabilities(int64_t display,
328 std::vector<DisplayCapability>* caps) {
329 ExynosDisplay* halDisplay;
330 RET_IF_ERR(getHalDisplay(display, halDisplay));
331
332 uint32_t count = 0;
333 RET_IF_ERR(halDisplay->getDisplayCapabilities(&count, nullptr));
334
335 std::vector<uint32_t> hwcCaps(count);
336 RET_IF_ERR(halDisplay->getDisplayCapabilities(&count, hwcCaps.data()));
337
338 h2a::translate(hwcCaps, *caps);
339 return HWC2_ERROR_NONE;
340 }
341
getDisplayConfigs(int64_t display,std::vector<int32_t> * configs)342 int32_t HalImpl::getDisplayConfigs(int64_t display, std::vector<int32_t>* configs) {
343 ExynosDisplay* halDisplay;
344 RET_IF_ERR(getHalDisplay(display, halDisplay));
345
346 uint32_t count = 0;
347 RET_IF_ERR(halDisplay->getDisplayConfigs(&count, nullptr));
348
349 std::vector<hwc2_config_t> hwcConfigs(count);
350 RET_IF_ERR(halDisplay->getDisplayConfigs(&count, hwcConfigs.data()));
351
352 h2a::translate(hwcConfigs, *configs);
353 return HWC2_ERROR_NONE;
354 }
355
getDisplayConnectionType(int64_t display,DisplayConnectionType * outType)356 int32_t HalImpl::getDisplayConnectionType(int64_t display, DisplayConnectionType* outType) {
357 ExynosDisplay* halDisplay;
358 RET_IF_ERR(getHalDisplay(display, halDisplay));
359
360 uint32_t hwcType = HWC2_DISPLAY_CONNECTION_TYPE_INTERNAL;
361 RET_IF_ERR(halDisplay->getDisplayConnectionType(&hwcType));
362 h2a::translate(hwcType, *outType);
363
364 return HWC2_ERROR_NONE;
365 }
366
getDisplayIdentificationData(int64_t display,DisplayIdentification * id)367 int32_t HalImpl::getDisplayIdentificationData(int64_t display, DisplayIdentification *id) {
368 ExynosDisplay* halDisplay;
369 RET_IF_ERR(getHalDisplay(display, halDisplay));
370
371 uint8_t port;
372 uint32_t count = 0;
373 RET_IF_ERR(halDisplay->getDisplayIdentificationData(&port, &count, nullptr));
374
375 id->data.resize(count);
376 RET_IF_ERR(halDisplay->getDisplayIdentificationData(&port, &count, id->data.data()));
377
378 h2a::translate(port, id->port);
379 return HWC2_ERROR_NONE;
380 }
381
getDisplayName(int64_t display,std::string * outName)382 int32_t HalImpl::getDisplayName(int64_t display, std::string* outName) {
383 ExynosDisplay* halDisplay;
384 RET_IF_ERR(getHalDisplay(display, halDisplay));
385
386 uint32_t count = 0;
387 RET_IF_ERR(halDisplay->getDisplayName(&count, nullptr));
388
389 outName->resize(count);
390 RET_IF_ERR(halDisplay->getDisplayName(&count, outName->data()));
391
392 return HWC2_ERROR_NONE;
393 }
394
getDisplayVsyncPeriod(int64_t display,int32_t * outVsyncPeriod)395 int32_t HalImpl::getDisplayVsyncPeriod(int64_t display, int32_t* outVsyncPeriod) {
396 ExynosDisplay* halDisplay;
397 RET_IF_ERR(getHalDisplay(display, halDisplay));
398
399 hwc2_vsync_period_t hwcVsyncPeriod;
400 RET_IF_ERR(halDisplay->getDisplayVsyncPeriod(&hwcVsyncPeriod));
401
402 h2a::translate(hwcVsyncPeriod, *outVsyncPeriod);
403 return HWC2_ERROR_NONE;
404 }
405
getDisplayedContentSample(int64_t display,int64_t maxFrames,int64_t timestamp,DisplayContentSample * samples)406 int32_t HalImpl::getDisplayedContentSample([[maybe_unused]] int64_t display,
407 [[maybe_unused]] int64_t maxFrames,
408 [[maybe_unused]] int64_t timestamp,
409 [[maybe_unused]] DisplayContentSample* samples) {
410 return HWC2_ERROR_UNSUPPORTED;
411 }
412
getDisplayedContentSamplingAttributes(int64_t display,DisplayContentSamplingAttributes * attrs)413 int32_t HalImpl::getDisplayedContentSamplingAttributes(
414 [[maybe_unused]] int64_t display,
415 [[maybe_unused]] DisplayContentSamplingAttributes* attrs) {
416 return HWC2_ERROR_UNSUPPORTED;
417 }
418
getDisplayPhysicalOrientation(int64_t display,common::Transform * orientation)419 int32_t HalImpl::getDisplayPhysicalOrientation(int64_t display,
420 common::Transform* orientation) {
421 ExynosDisplay* halDisplay;
422 RET_IF_ERR(getHalDisplay(display, halDisplay));
423
424 HwcMountOrientation hwcOrientation;
425 RET_IF_ERR(halDisplay->getMountOrientation(&hwcOrientation));
426 h2a::translate(hwcOrientation, *orientation);
427
428 return HWC2_ERROR_NONE;
429 }
430
getDozeSupport(int64_t display,bool & support)431 int32_t HalImpl::getDozeSupport(int64_t display, bool& support) {
432 ExynosDisplay* halDisplay;
433 RET_IF_ERR(getHalDisplay(display, halDisplay));
434
435 int32_t hwcSupport;
436 RET_IF_ERR(halDisplay->getDozeSupport(&hwcSupport));
437
438 h2a::translate(hwcSupport, support);
439 return HWC2_ERROR_NONE;
440 }
441
getHdrCapabilities(int64_t display,HdrCapabilities * caps)442 int32_t HalImpl::getHdrCapabilities(int64_t display, HdrCapabilities* caps) {
443 ExynosDisplay* halDisplay;
444 RET_IF_ERR(getHalDisplay(display, halDisplay));
445
446 uint32_t count = 0;
447 RET_IF_ERR(halDisplay->getHdrCapabilities(&count, nullptr, &caps->maxLuminance,
448 &caps->maxAverageLuminance,
449 &caps->minLuminance));
450 std::vector<int32_t> hwcHdrTypes(count);
451 RET_IF_ERR(halDisplay->getHdrCapabilities(&count, hwcHdrTypes.data(),
452 &caps->maxLuminance,
453 &caps->maxAverageLuminance,
454 &caps->minLuminance));
455
456 h2a::translate(hwcHdrTypes, caps->types);
457 return HWC2_ERROR_NONE;
458 }
459
getMaxVirtualDisplayCount(int32_t * count)460 int32_t HalImpl::getMaxVirtualDisplayCount(int32_t* count) {
461 uint32_t hwcCount = mDevice->getMaxVirtualDisplayCount();
462 h2a::translate(hwcCount, *count);
463
464 return HWC2_ERROR_NONE;
465 }
466
getPerFrameMetadataKeys(int64_t display,std::vector<PerFrameMetadataKey> * keys)467 int32_t HalImpl::getPerFrameMetadataKeys(int64_t display,
468 std::vector<PerFrameMetadataKey>* keys) {
469 ExynosDisplay* halDisplay;
470 RET_IF_ERR(getHalDisplay(display, halDisplay));
471
472 uint32_t numKeys = 0;
473 auto resManager = mDevice->mResourceManager;
474 if (resManager->hasHDR10PlusMPP()) {
475 numKeys = HWC2_HDR10_PLUS_SEI + 1;
476 } else {
477 numKeys = HWC2_MAX_FRAME_AVERAGE_LIGHT_LEVEL + 1;
478 }
479 for (uint32_t i = 0; i < numKeys; ++i) {
480 PerFrameMetadataKey key;
481 h2a::translate(i, key);
482 keys->push_back(key);
483 }
484
485 return HWC2_ERROR_NONE;
486 }
487
getReadbackBufferAttributes(int64_t display,ReadbackBufferAttributes * attrs)488 int32_t HalImpl::getReadbackBufferAttributes(int64_t display,
489 ReadbackBufferAttributes* attrs) {
490 ExynosDisplay* halDisplay;
491 RET_IF_ERR(getHalDisplay(display, halDisplay));
492
493 int32_t format = -1;
494 int32_t dataspace = -1;
495 RET_IF_ERR(halDisplay->getReadbackBufferAttributes(&format, &dataspace));
496
497 h2a::translate(format, attrs->format);
498 h2a::translate(dataspace, attrs->dataspace);
499
500 return HWC2_ERROR_NONE;
501 }
502
getReadbackBufferFence(int64_t display,ndk::ScopedFileDescriptor * acquireFence)503 int32_t HalImpl::getReadbackBufferFence(int64_t display,
504 ndk::ScopedFileDescriptor* acquireFence) {
505 ExynosDisplay* halDisplay;
506 RET_IF_ERR(getHalDisplay(display, halDisplay));
507
508 int32_t fd = -1;
509 RET_IF_ERR(halDisplay->getReadbackBufferFence(&fd));
510
511 h2a::translate(fd, *acquireFence);
512 return HWC2_ERROR_NONE;
513 }
514
getRenderIntents(int64_t display,ColorMode mode,std::vector<RenderIntent> * intents)515 int32_t HalImpl::getRenderIntents(int64_t display, ColorMode mode,
516 std::vector<RenderIntent>* intents) {
517 ExynosDisplay* halDisplay;
518 RET_IF_ERR(getHalDisplay(display, halDisplay));
519
520 int32_t hwcMode;
521 uint32_t count = 0;
522 a2h::translate(mode, hwcMode);
523 RET_IF_ERR(halDisplay->getRenderIntents(hwcMode, &count, nullptr));
524
525 std::vector<int32_t> hwcIntents(count);
526 RET_IF_ERR(halDisplay->getRenderIntents(hwcMode, &count, hwcIntents.data()));
527
528 h2a::translate(hwcIntents, *intents);
529 return HWC2_ERROR_NONE;
530 }
531
getSupportedContentTypes(int64_t display,std::vector<ContentType> * types)532 int32_t HalImpl::getSupportedContentTypes(int64_t display, std::vector<ContentType>* types) {
533 ExynosDisplay* halDisplay;
534 RET_IF_ERR(getHalDisplay(display, halDisplay));
535
536 uint32_t count = 0;
537 RET_IF_ERR(halDisplay->getSupportedContentTypes(&count, nullptr));
538
539 std::vector<uint32_t> hwcTypes(count);
540 RET_IF_ERR(halDisplay->getSupportedContentTypes(&count, hwcTypes.data()));
541
542 h2a::translate(hwcTypes, *types);
543 return HWC2_ERROR_NONE;
544 }
545
flushDisplayBrightnessChange(int64_t display)546 int32_t HalImpl::flushDisplayBrightnessChange(int64_t display) {
547 ExynosDisplay* halDisplay;
548 RET_IF_ERR(getHalDisplay(display, halDisplay));
549
550 return halDisplay->flushDisplayBrightnessChange();
551 }
552
presentDisplay(int64_t display,ndk::ScopedFileDescriptor & fence,std::vector<int64_t> * outLayers,std::vector<ndk::ScopedFileDescriptor> * outReleaseFences)553 int32_t HalImpl::presentDisplay(int64_t display, ndk::ScopedFileDescriptor& fence,
554 std::vector<int64_t>* outLayers,
555 std::vector<ndk::ScopedFileDescriptor>* outReleaseFences) {
556 ExynosDisplay* halDisplay;
557 RET_IF_ERR(getHalDisplay(display, halDisplay));
558
559 // TODO: not expect acceptDisplayChanges if there are no changes to accept
560 if (halDisplay->mRenderingState == RENDERING_STATE_VALIDATED) {
561 LOG(INFO) << halDisplay->mDisplayName.string()
562 << ": acceptDisplayChanges was not called";
563 if (halDisplay->acceptDisplayChanges() != HWC2_ERROR_NONE) {
564 LOG(ERROR) << halDisplay->mDisplayName.string()
565 << ": acceptDisplayChanges is failed";
566 }
567 }
568
569 int32_t hwcFence;
570 RET_IF_ERR(halDisplay->presentDisplay(&hwcFence));
571 h2a::translate(hwcFence, fence);
572
573 uint32_t count = 0;
574 RET_IF_ERR(halDisplay->getReleaseFences(&count, nullptr, nullptr));
575
576 std::vector<hwc2_layer_t> hwcLayers(count);
577 std::vector<int32_t> hwcFences(count);
578 RET_IF_ERR(halDisplay->getReleaseFences(&count, hwcLayers.data(), hwcFences.data()));
579
580 h2a::translate(hwcLayers, *outLayers);
581 h2a::translate(hwcFences, *outReleaseFences);
582
583 return HWC2_ERROR_NONE;
584 }
585
setActiveConfig(int64_t display,int32_t config)586 int32_t HalImpl::setActiveConfig(int64_t display, int32_t config) {
587 ExynosDisplay* halDisplay;
588 RET_IF_ERR(getHalDisplay(display, halDisplay));
589
590 hwc2_config_t hwcConfig;
591 a2h::translate(config, hwcConfig);
592 return halDisplay->setActiveConfig(hwcConfig);
593 }
594
setActiveConfigWithConstraints(int64_t display,int32_t config,const VsyncPeriodChangeConstraints & vsyncPeriodChangeConstraints,VsyncPeriodChangeTimeline * timeline)595 int32_t HalImpl::setActiveConfigWithConstraints(
596 int64_t display, int32_t config,
597 const VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
598 VsyncPeriodChangeTimeline* timeline) {
599 ExynosDisplay* halDisplay;
600 RET_IF_ERR(getHalDisplay(display, halDisplay));
601
602 hwc2_config_t hwcConfig;
603 hwc_vsync_period_change_constraints_t hwcConstraints;
604 hwc_vsync_period_change_timeline_t hwcTimeline;
605
606 a2h::translate(config, hwcConfig);
607 a2h::translate(vsyncPeriodChangeConstraints, hwcConstraints);
608 RET_IF_ERR(halDisplay->setActiveConfigWithConstraints(hwcConfig, &hwcConstraints, &hwcTimeline));
609
610 h2a::translate(hwcTimeline, *timeline);
611 return HWC2_ERROR_NONE;
612 }
613
setBootDisplayConfig(int64_t display,int32_t config)614 int32_t HalImpl::setBootDisplayConfig(int64_t display, int32_t config) {
615 ExynosDisplay* halDisplay;
616 RET_IF_ERR(getHalDisplay(display, halDisplay));
617
618 return halDisplay->setBootDisplayConfig(config);
619 }
620
clearBootDisplayConfig(int64_t display)621 int32_t HalImpl::clearBootDisplayConfig(int64_t display) {
622 ExynosDisplay* halDisplay;
623 RET_IF_ERR(getHalDisplay(display, halDisplay));
624
625 return halDisplay->clearBootDisplayConfig();
626 }
627
getPreferredBootDisplayConfig(int64_t display,int32_t * config)628 int32_t HalImpl::getPreferredBootDisplayConfig(int64_t display, int32_t* config) {
629 ExynosDisplay* halDisplay;
630 RET_IF_ERR(getHalDisplay(display, halDisplay));
631
632 return halDisplay->getPreferredBootDisplayConfig(config);
633 }
634
setAutoLowLatencyMode(int64_t display,bool on)635 int32_t HalImpl::setAutoLowLatencyMode(int64_t display, bool on) {
636 ExynosDisplay* halDisplay;
637 RET_IF_ERR(getHalDisplay(display, halDisplay));
638
639 return halDisplay->setAutoLowLatencyMode(on);
640 }
641
setClientTarget(int64_t display,buffer_handle_t target,const ndk::ScopedFileDescriptor & fence,common::Dataspace dataspace,const std::vector<common::Rect> & damage)642 int32_t HalImpl::setClientTarget(int64_t display, buffer_handle_t target,
643 const ndk::ScopedFileDescriptor& fence,
644 common::Dataspace dataspace,
645 const std::vector<common::Rect>& damage) {
646 ExynosDisplay* halDisplay;
647 RET_IF_ERR(getHalDisplay(display, halDisplay));
648
649 int32_t hwcFence;
650 int32_t hwcDataspace;
651 std::vector<hwc_rect_t> hwcDamage;
652
653 a2h::translate(fence, hwcFence);
654 a2h::translate(dataspace, hwcDataspace);
655 a2h::translate(damage, hwcDamage);
656 hwc_region_t region = { hwcDamage.size(), hwcDamage.data() };
657 UNUSED(region);
658
659 return halDisplay->setClientTarget(target, hwcFence, hwcDataspace);
660 }
661
setColorMode(int64_t display,ColorMode mode,RenderIntent intent)662 int32_t HalImpl::setColorMode(int64_t display, ColorMode mode, RenderIntent intent) {
663 ExynosDisplay* halDisplay;
664 RET_IF_ERR(getHalDisplay(display, halDisplay));
665
666 int32_t hwcMode;
667 int32_t hwcIntent;
668
669 a2h::translate(mode, hwcMode);
670 a2h::translate(intent, hwcIntent);
671 return halDisplay->setColorModeWithRenderIntent(hwcMode, hwcIntent);
672 }
673
setColorTransform(int64_t display,const std::vector<float> & matrix)674 int32_t HalImpl::setColorTransform(int64_t display, const std::vector<float>& matrix) {
675 // clang-format off
676 constexpr std::array<float, 16> kIdentity = {
677 1.0f, 0.0f, 0.0f, 0.0f,
678 0.0f, 1.0f, 0.0f, 0.0f,
679 0.0f, 0.0f, 1.0f, 0.0f,
680 0.0f, 0.0f, 0.0f, 1.0f,
681 };
682 // clang-format on
683 const bool isIdentity = (std::equal(matrix.begin(), matrix.end(), kIdentity.begin()));
684 const common::ColorTransform hint = isIdentity ? common::ColorTransform::IDENTITY
685 : common::ColorTransform::ARBITRARY_MATRIX;
686
687 ExynosDisplay* halDisplay;
688 RET_IF_ERR(getHalDisplay(display, halDisplay));
689
690 int32_t hwcHint;
691 a2h::translate(hint, hwcHint);
692 return halDisplay->setColorTransform(matrix.data(), hwcHint);
693 }
694
setContentType(int64_t display,ContentType contentType)695 int32_t HalImpl::setContentType(int64_t display, ContentType contentType) {
696 ExynosDisplay* halDisplay;
697 RET_IF_ERR(getHalDisplay(display, halDisplay));
698
699 int32_t type;
700 a2h::translate(contentType, type);
701 return halDisplay->setContentType(type);
702 }
703
setDisplayBrightness(int64_t display,float brightness)704 int32_t HalImpl::setDisplayBrightness(int64_t display, float brightness) {
705 ExynosDisplay* halDisplay;
706 RET_IF_ERR(getHalDisplay(display, halDisplay));
707
708 return halDisplay->setDisplayBrightness(brightness, true /* wait present */);
709 }
710
setDisplayedContentSamplingEnabled(int64_t display,bool enable,FormatColorComponent componentMask,int64_t maxFrames)711 int32_t HalImpl::setDisplayedContentSamplingEnabled(
712 [[maybe_unused]] int64_t display,
713 [[maybe_unused]] bool enable,
714 [[maybe_unused]] FormatColorComponent componentMask,
715 [[maybe_unused]] int64_t maxFrames) {
716 return HWC2_ERROR_UNSUPPORTED;
717 }
718
setLayerBlendMode(int64_t display,int64_t layer,common::BlendMode mode)719 int32_t HalImpl::setLayerBlendMode(int64_t display, int64_t layer, common::BlendMode mode) {
720 ExynosLayer *halLayer;
721 RET_IF_ERR(getHalLayer(display, layer, halLayer));
722
723 int32_t hwcMode;
724 a2h::translate(mode, hwcMode);
725 return halLayer->setLayerBlendMode(hwcMode);
726 }
727
setLayerBuffer(int64_t display,int64_t layer,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & acquireFence)728 int32_t HalImpl::setLayerBuffer(int64_t display, int64_t layer, buffer_handle_t buffer,
729 const ndk::ScopedFileDescriptor& acquireFence) {
730 ExynosLayer *halLayer;
731 RET_IF_ERR(getHalLayer(display, layer, halLayer));
732
733 int32_t hwcFd;
734 a2h::translate(acquireFence, hwcFd);
735
736 return halLayer->setLayerBuffer(buffer, hwcFd);
737 }
738
setLayerColor(int64_t display,int64_t layer,Color color)739 int32_t HalImpl::setLayerColor(int64_t display, int64_t layer, Color color) {
740 ExynosLayer *halLayer;
741 RET_IF_ERR(getHalLayer(display, layer, halLayer));
742
743 hwc_color_t hwcColor;
744 a2h::translate(color, hwcColor);
745 return halLayer->setLayerColor(hwcColor);
746 }
747
setLayerColorTransform(int64_t display,int64_t layer,const std::vector<float> & matrix)748 int32_t HalImpl::setLayerColorTransform(int64_t display, int64_t layer,
749 const std::vector<float>& matrix) {
750 ExynosLayer *halLayer;
751 RET_IF_ERR(getHalLayer(display, layer, halLayer));
752
753 return halLayer->setLayerColorTransform(matrix.data());
754 }
755
setLayerCompositionType(int64_t display,int64_t layer,Composition type)756 int32_t HalImpl::setLayerCompositionType(int64_t display, int64_t layer, Composition type) {
757 ExynosLayer *halLayer;
758 RET_IF_ERR(getHalLayer(display, layer, halLayer));
759
760 int32_t hwcType;
761 a2h::translate(type, hwcType);
762 return halLayer->setLayerCompositionType(hwcType);
763 }
764
setLayerCursorPosition(int64_t display,int64_t layer,int32_t x,int32_t y)765 int32_t HalImpl::setLayerCursorPosition(int64_t display, int64_t layer, int32_t x, int32_t y) {
766 ExynosLayer *halLayer;
767 RET_IF_ERR(getHalLayer(display, layer, halLayer));
768
769 return halLayer->setCursorPosition(x, y);
770 }
771
setLayerDataspace(int64_t display,int64_t layer,common::Dataspace dataspace)772 int32_t HalImpl::setLayerDataspace(int64_t display, int64_t layer, common::Dataspace dataspace) {
773 ExynosLayer *halLayer;
774 RET_IF_ERR(getHalLayer(display, layer, halLayer));
775
776 int32_t hwcDataspace;
777 a2h::translate(dataspace, hwcDataspace);
778 return halLayer->setLayerDataspace(hwcDataspace);
779 }
780
setLayerDisplayFrame(int64_t display,int64_t layer,const common::Rect & frame)781 int32_t HalImpl::setLayerDisplayFrame(int64_t display, int64_t layer, const common::Rect& frame) {
782 ExynosLayer *halLayer;
783 RET_IF_ERR(getHalLayer(display, layer, halLayer));
784
785 hwc_rect_t hwcFrame;
786 a2h::translate(frame, hwcFrame);
787 return halLayer->setLayerDisplayFrame(hwcFrame);
788 }
789
setLayerPerFrameMetadata(int64_t display,int64_t layer,const std::vector<std::optional<PerFrameMetadata>> & metadata)790 int32_t HalImpl::setLayerPerFrameMetadata(int64_t display, int64_t layer,
791 const std::vector<std::optional<PerFrameMetadata>>& metadata) {
792 ExynosLayer *halLayer;
793 RET_IF_ERR(getHalLayer(display, layer, halLayer));
794
795 uint32_t count = metadata.size();
796 std::vector<int32_t> keys;
797 std::vector<float> values;
798
799 for (uint32_t ix = 0; ix < count; ++ix) {
800 if (metadata[ix]) {
801 int32_t key;
802 a2h::translate(metadata[ix]->key, key);
803 keys.push_back(key);
804 values.push_back(metadata[ix]->value);
805 }
806 }
807
808 return halLayer->setLayerPerFrameMetadata(count, keys.data(), values.data());
809 }
810
setLayerPerFrameMetadataBlobs(int64_t display,int64_t layer,const std::vector<std::optional<PerFrameMetadataBlob>> & blobs)811 int32_t HalImpl::setLayerPerFrameMetadataBlobs(int64_t display, int64_t layer,
812 const std::vector<std::optional<PerFrameMetadataBlob>>& blobs) {
813 ExynosLayer *halLayer;
814 RET_IF_ERR(getHalLayer(display, layer, halLayer));
815
816 uint32_t count = blobs.size();
817 std::vector<int32_t> keys;
818 std::vector<uint32_t> sizes;
819 std::vector<uint8_t> values;
820
821 for (uint32_t ix = 0; ix < count; ++ix) {
822 if (blobs[ix]) {
823 int32_t key;
824 a2h::translate(blobs[ix]->key, key);
825 keys.push_back(key);
826 sizes.push_back(blobs[ix]->blob.size());
827 values.insert(values.end(), blobs[ix]->blob.begin(), blobs[ix]->blob.end());
828 }
829 }
830
831 return halLayer->setLayerPerFrameMetadataBlobs(count, keys.data(), sizes.data(),
832 values.data());
833 }
834
setLayerPlaneAlpha(int64_t display,int64_t layer,float alpha)835 int32_t HalImpl::setLayerPlaneAlpha(int64_t display, int64_t layer, float alpha) {
836 ExynosLayer *halLayer;
837 RET_IF_ERR(getHalLayer(display, layer, halLayer));
838
839 return halLayer->setLayerPlaneAlpha(alpha);
840 }
841
setLayerSidebandStream(int64_t display,int64_t layer,buffer_handle_t stream)842 int32_t HalImpl::setLayerSidebandStream([[maybe_unused]] int64_t display,
843 [[maybe_unused]] int64_t layer,
844 [[maybe_unused]] buffer_handle_t stream) {
845 return HWC2_ERROR_UNSUPPORTED;
846 }
847
setLayerSourceCrop(int64_t display,int64_t layer,const common::FRect & crop)848 int32_t HalImpl::setLayerSourceCrop(int64_t display, int64_t layer, const common::FRect& crop) {
849 ExynosLayer *halLayer;
850 RET_IF_ERR(getHalLayer(display, layer, halLayer));
851
852 hwc_frect_t hwcCrop;
853 a2h::translate(crop, hwcCrop);
854 return halLayer->setLayerSourceCrop(hwcCrop);
855 }
856
setLayerSurfaceDamage(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & damage)857 int32_t HalImpl::setLayerSurfaceDamage(int64_t display, int64_t layer,
858 const std::vector<std::optional<common::Rect>>& damage) {
859 ExynosLayer *halLayer;
860 RET_IF_ERR(getHalLayer(display, layer, halLayer));
861
862 std::vector<hwc_rect_t> hwcDamage;
863 a2h::translate(damage, hwcDamage);
864 hwc_region_t region = { hwcDamage.size(), hwcDamage.data() };
865
866 return halLayer->setLayerSurfaceDamage(region);
867 }
868
setLayerTransform(int64_t display,int64_t layer,common::Transform transform)869 int32_t HalImpl::setLayerTransform(int64_t display, int64_t layer, common::Transform transform) {
870 ExynosLayer *halLayer;
871 RET_IF_ERR(getHalLayer(display, layer, halLayer));
872
873 int32_t hwcTransform;
874 a2h::translate(transform, hwcTransform);
875
876 return halLayer->setLayerTransform(hwcTransform);
877 }
878
setLayerVisibleRegion(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & visible)879 int32_t HalImpl::setLayerVisibleRegion(int64_t display, int64_t layer,
880 const std::vector<std::optional<common::Rect>>& visible) {
881 ExynosLayer *halLayer;
882 RET_IF_ERR(getHalLayer(display, layer, halLayer));
883
884 std::vector<hwc_rect_t> hwcVisible;
885 a2h::translate(visible, hwcVisible);
886 hwc_region_t region = { hwcVisible.size(), hwcVisible.data() };
887
888 return halLayer->setLayerVisibleRegion(region);
889 }
890
setLayerBrightness(int64_t display,int64_t layer,float brightness)891 int32_t HalImpl::setLayerBrightness(int64_t display, int64_t layer, float brightness) {
892 ExynosLayer *halLayer;
893 RET_IF_ERR(getHalLayer(display, layer, halLayer));
894
895 return halLayer->setLayerBrightness(brightness);
896 }
897
setLayerZOrder(int64_t display,int64_t layer,uint32_t z)898 int32_t HalImpl::setLayerZOrder(int64_t display, int64_t layer, uint32_t z) {
899 ExynosLayer *halLayer;
900 RET_IF_ERR(getHalLayer(display, layer, halLayer));
901
902 return halLayer->setLayerZOrder(z);
903 }
904
setOutputBuffer(int64_t display,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & releaseFence)905 int32_t HalImpl::setOutputBuffer(int64_t display, buffer_handle_t buffer,
906 const ndk::ScopedFileDescriptor& releaseFence) {
907 ExynosDisplay* halDisplay;
908 RET_IF_ERR(getHalDisplay(display, halDisplay));
909
910 int32_t hwcFence;
911 a2h::translate(releaseFence, hwcFence);
912
913 auto err = halDisplay->setOutputBuffer(buffer, hwcFence);
914 // unlike in setClientTarget, releaseFence is owned by us
915 if (err == HWC2_ERROR_NONE && hwcFence >= 0) {
916 close(hwcFence);
917 }
918
919 return err;
920 }
921
setPowerMode(int64_t display,PowerMode mode)922 int32_t HalImpl::setPowerMode(int64_t display, PowerMode mode) {
923 if (mode == PowerMode::ON_SUSPEND || mode == PowerMode::DOZE_SUSPEND) {
924 return HWC2_ERROR_UNSUPPORTED;
925 }
926
927 ExynosDisplay* halDisplay;
928 RET_IF_ERR(getHalDisplay(display, halDisplay));
929
930 int32_t hwcMode;
931 a2h::translate(mode, hwcMode);
932 return halDisplay->setPowerMode(hwcMode);
933 }
934
setReadbackBuffer(int64_t display,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & releaseFence)935 int32_t HalImpl::setReadbackBuffer(int64_t display, buffer_handle_t buffer,
936 const ndk::ScopedFileDescriptor& releaseFence) {
937 ExynosDisplay* halDisplay;
938 RET_IF_ERR(getHalDisplay(display, halDisplay));
939
940 int32_t hwcFence;
941 a2h::translate(releaseFence, hwcFence);
942
943 return halDisplay->setReadbackBuffer(buffer, hwcFence);
944 }
945
setVsyncEnabled(int64_t display,bool enabled)946 int32_t HalImpl::setVsyncEnabled(int64_t display, bool enabled) {
947 ExynosDisplay* halDisplay;
948 RET_IF_ERR(getHalDisplay(display, halDisplay));
949
950 hwc2_vsync_t hwcEnable;
951 a2h::translate(enabled, hwcEnable);
952 return halDisplay->setVsyncEnabled(hwcEnable);
953 }
954
setIdleTimerEnabled(int64_t display,int32_t timeout)955 int32_t HalImpl::setIdleTimerEnabled(int64_t display, int32_t timeout) {
956 ExynosDisplay* halDisplay;
957 RET_IF_ERR(getHalDisplay(display, halDisplay));
958
959 return halDisplay->setDisplayIdleTimer(timeout);
960 }
961
validateDisplay(int64_t display,std::vector<int64_t> * outChangedLayers,std::vector<Composition> * outCompositionTypes,uint32_t * outDisplayRequestMask,std::vector<int64_t> * outRequestedLayers,std::vector<int32_t> * outRequestMasks,ClientTargetProperty * outClientTargetProperty,DimmingStage * outDimmingStage)962 int32_t HalImpl::validateDisplay(int64_t display, std::vector<int64_t>* outChangedLayers,
963 std::vector<Composition>* outCompositionTypes,
964 uint32_t* outDisplayRequestMask,
965 std::vector<int64_t>* outRequestedLayers,
966 std::vector<int32_t>* outRequestMasks,
967 ClientTargetProperty* outClientTargetProperty,
968 DimmingStage* outDimmingStage) {
969 ExynosDisplay* halDisplay;
970 RET_IF_ERR(getHalDisplay(display, halDisplay));
971
972 uint32_t typesCount = 0;
973 uint32_t reqsCount = 0;
974 auto err = halDisplay->validateDisplay(&typesCount, &reqsCount);
975
976 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
977 return err;
978 }
979
980 std::vector<hwc2_layer_t> hwcChangedLayers(typesCount);
981 std::vector<int32_t> hwcCompositionTypes(typesCount);
982 RET_IF_ERR(halDisplay->getChangedCompositionTypes(&typesCount, hwcChangedLayers.data(),
983 hwcCompositionTypes.data()));
984
985 int32_t displayReqs;
986 std::vector<hwc2_layer_t> hwcRequestedLayers(reqsCount);
987 outRequestMasks->resize(reqsCount);
988 RET_IF_ERR(halDisplay->getDisplayRequests(&displayReqs, &reqsCount,
989 hwcRequestedLayers.data(), outRequestMasks->data()));
990
991 h2a::translate(hwcChangedLayers, *outChangedLayers);
992 h2a::translate(hwcCompositionTypes, *outCompositionTypes);
993 *outDisplayRequestMask = displayReqs;
994 h2a::translate(hwcRequestedLayers, *outRequestedLayers);
995
996 hwc_client_target_property hwcProperty;
997 HwcDimmingStage hwcDimmingStage;
998 if (!halDisplay->getClientTargetProperty(&hwcProperty, &hwcDimmingStage)) {
999 h2a::translate(hwcDimmingStage, *outDimmingStage);
1000 h2a::translate(hwcProperty, *outClientTargetProperty);
1001 } // else ignore this error
1002
1003 return HWC2_ERROR_NONE;
1004 }
1005
setExpectedPresentTime(int64_t display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime)1006 int HalImpl::setExpectedPresentTime(
1007 int64_t display, const std::optional<ClockMonotonicTimestamp> expectedPresentTime) {
1008 ExynosDisplay* halDisplay;
1009 RET_IF_ERR(getHalDisplay(display, halDisplay));
1010
1011 if (!expectedPresentTime.has_value()) return HWC2_ERROR_NONE;
1012
1013 if (halDisplay->getPendingExpectedPresentTime() != 0) {
1014 ALOGW("HalImpl: set expected present time multiple times in one frame");
1015 }
1016
1017 halDisplay->setExpectedPresentTime(expectedPresentTime->timestampNanos);
1018
1019 return HWC2_ERROR_NONE;
1020 }
1021
getRCDLayerSupport(int64_t display,bool & outSupport)1022 int32_t HalImpl::getRCDLayerSupport(int64_t display, bool& outSupport) {
1023 ExynosDisplay* halDisplay;
1024 RET_IF_ERR(getHalDisplay(display, halDisplay));
1025
1026 return halDisplay->getRCDLayerSupport(outSupport);
1027 }
1028
setLayerBlockingRegion(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & blockingRegion)1029 int32_t HalImpl::setLayerBlockingRegion(
1030 int64_t display, int64_t layer,
1031 const std::vector<std::optional<common::Rect>>& blockingRegion) {
1032 ExynosLayer* halLayer;
1033 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1034
1035 std::vector<hwc_rect_t> halBlockingRegion;
1036 a2h::translate(blockingRegion, halBlockingRegion);
1037
1038 return halLayer->setLayerBlockingRegion(halBlockingRegion);
1039 }
1040
getDisplayIdleTimerSupport(int64_t display,bool & outSupport)1041 int32_t HalImpl::getDisplayIdleTimerSupport(int64_t display, bool& outSupport) {
1042 ExynosDisplay* halDisplay;
1043 RET_IF_ERR(getHalDisplay(display, halDisplay));
1044
1045 return halDisplay->getDisplayIdleTimerSupport(outSupport);
1046 }
1047
1048 } // namespace aidl::android::hardware::graphics::composer3::impl
1049