• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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