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 {
34
35 static constexpr int32_t kMinComposerInterfaceVersionForVrrApi = 3;
36 static constexpr int32_t kMinComposerInterfaceVersionForHwcBatching = 3;
37 };
38
39 namespace aidl::android::hardware::graphics::composer3::impl {
40
create(int32_t composerInterfaceVersion)41 std::unique_ptr<IComposerHal> IComposerHal::create(int32_t composerInterfaceVersion) {
42 bool vrrApiSupported = composerInterfaceVersion >= kMinComposerInterfaceVersionForVrrApi;
43 bool batchingSupported = composerInterfaceVersion >= kMinComposerInterfaceVersionForHwcBatching;
44 auto device = std::make_unique<ExynosDeviceModule>(vrrApiSupported);
45 if (!device) {
46 return nullptr;
47 }
48 auto halImp = std::make_unique<HalImpl>(std::move(device), batchingSupported);
49 return halImp;
50 }
51
52 namespace hook {
53
hotplug(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,int32_t connected)54 void hotplug(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
55 int32_t connected) {
56 auto hal = static_cast<HalImpl*>(callbackData);
57 int64_t display;
58
59 h2a::translate(hwcDisplay, display);
60 hal->getEventCallback()->onHotplug(display, connected == HWC2_CONNECTION_CONNECTED);
61 }
62
refresh(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)63 void refresh(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) {
64 auto hal = static_cast<HalImpl*>(callbackData);
65 int64_t display;
66
67 h2a::translate(hwcDisplay, display);
68 hal->getEventCallback()->onRefresh(display);
69 }
70
vsync(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,int64_t timestamp,hwc2_vsync_period_t hwcVsyncPeriodNanos)71 void vsync(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
72 int64_t timestamp, hwc2_vsync_period_t hwcVsyncPeriodNanos) {
73 auto hal = static_cast<HalImpl*>(callbackData);
74 int64_t display;
75 int32_t vsyncPeriodNanos;
76
77 h2a::translate(hwcDisplay, display);
78 h2a::translate(hwcVsyncPeriodNanos, vsyncPeriodNanos);
79 hal->getEventCallback()->onVsync(display, timestamp, vsyncPeriodNanos);
80 }
81
vsyncPeriodTimingChanged(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,hwc_vsync_period_change_timeline_t * hwcTimeline)82 void vsyncPeriodTimingChanged(hwc2_callback_data_t callbackData,
83 hwc2_display_t hwcDisplay,
84 hwc_vsync_period_change_timeline_t* hwcTimeline) {
85 auto hal = static_cast<HalImpl*>(callbackData);
86 int64_t display;
87 VsyncPeriodChangeTimeline timeline;
88
89 h2a::translate(hwcDisplay, display);
90 h2a::translate(*hwcTimeline, timeline);
91 hal->getEventCallback()->onVsyncPeriodTimingChanged(display, timeline);
92 }
93
vsyncIdle(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)94 void vsyncIdle(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()->onVsyncIdle(display);
100 }
101
seamlessPossible(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)102 void seamlessPossible(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) {
103 auto hal = static_cast<HalImpl*>(callbackData);
104 int64_t display;
105
106 h2a::translate(hwcDisplay, display);
107 hal->getEventCallback()->onSeamlessPossible(display);
108 }
109
refreshRateChangedDebug(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,hwc2_vsync_period_t hwcVsyncPeriodNanos,int32_t hwcRefreshPeriodNanos)110 void refreshRateChangedDebug(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
111 hwc2_vsync_period_t hwcVsyncPeriodNanos,
112 int32_t hwcRefreshPeriodNanos) {
113 auto hal = static_cast<HalImpl*>(callbackData);
114 int64_t display;
115 int32_t vsyncPeriodNanos;
116
117 h2a::translate(hwcDisplay, display);
118 h2a::translate(hwcVsyncPeriodNanos, vsyncPeriodNanos);
119 // TODO (b/314527560) Update refreshPeriodNanos for VRR display
120 hal->getEventCallback()->onRefreshRateChangedDebug(RefreshRateChangedDebugData{
121 .display = display,
122 .vsyncPeriodNanos = vsyncPeriodNanos,
123 .refreshPeriodNanos = hwcRefreshPeriodNanos,
124 });
125 }
126
hotplugEvent(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,common::DisplayHotplugEvent hotplugEvent)127 void hotplugEvent(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay,
128 common::DisplayHotplugEvent hotplugEvent) {
129 auto hal = static_cast<HalImpl*>(callbackData);
130 int64_t display;
131
132 h2a::translate(hwcDisplay, display);
133 hal->getEventCallback()->onHotplugEvent(display, hotplugEvent);
134 }
135
136 } // nampesapce hook
137
HalImpl(std::unique_ptr<ExynosDevice> device,bool batchingSupported)138 HalImpl::HalImpl(std::unique_ptr<ExynosDevice> device, bool batchingSupported)
139 : mDevice(std::move(device)) {
140 initCaps(batchingSupported);
141 #ifdef USES_HWC_SERVICES
142 LOG(DEBUG) << "Start HWCService";
143 mHwcCtx = std::make_unique<ExynosHWCCtx>();
144 memset(&mHwcCtx->base, 0, sizeof(mHwcCtx->base));
145 mHwcCtx->device = mDevice.get();
146
147 auto hwcService = ::android::ExynosHWCService::getExynosHWCService();
148 hwcService->setExynosHWCCtx(mHwcCtx.get());
149 // This callback is for DP hotplug event if connected
150 // hwcService->setBootFinishedCallback(...);
151 #endif
152 }
153
initCaps(bool batchingSupported)154 void HalImpl::initCaps(bool batchingSupported) {
155 uint32_t count = 0;
156 mDevice->getCapabilities(&count, nullptr);
157
158 std::vector<int32_t> halCaps(count);
159 mDevice->getCapabilities(&count, halCaps.data());
160
161 for (auto hwcCap : halCaps) {
162 Capability cap;
163 h2a::translate(hwcCap, cap);
164 mCaps.insert(cap);
165 }
166
167 mCaps.insert(Capability::BOOT_DISPLAY_CONFIG);
168 mCaps.insert(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG);
169 if (batchingSupported) {
170 mCaps.insert(Capability::LAYER_LIFECYCLE_BATCH_COMMAND);
171 }
172 }
173
getHalDisplay(int64_t display,ExynosDisplay * & halDisplay)174 int32_t HalImpl::getHalDisplay(int64_t display, ExynosDisplay*& halDisplay) {
175 hwc2_display_t hwcDisplay;
176 a2h::translate(display, hwcDisplay);
177 halDisplay = mDevice->getDisplay(static_cast<uint32_t>(hwcDisplay));
178
179 if (!halDisplay) { [[unlikely]]
180 return HWC2_ERROR_BAD_DISPLAY;
181 }
182 return HWC2_ERROR_NONE;
183 }
184
getHalLayer(int64_t display,int64_t layer,ExynosLayer * & halLayer)185 int32_t HalImpl::getHalLayer(int64_t display, int64_t layer, ExynosLayer*& halLayer) {
186 ExynosDisplay* halDisplay;
187 RET_IF_ERR(getHalDisplay(display, halDisplay));
188
189 hwc2_layer_t mapped_layer;
190 RET_IF_ERR(layerSf2Hwc(display, layer, mapped_layer));
191 halLayer = halDisplay->checkLayer(mapped_layer);
192 if (!halLayer) { [[unlikely]]
193 return HWC2_ERROR_BAD_LAYER;
194 }
195
196 return HWC2_ERROR_NONE;
197 }
198
layerSf2Hwc(int64_t display,int64_t layer,hwc2_layer_t & outMappedLayer)199 int32_t HalImpl::layerSf2Hwc(int64_t display, int64_t layer, hwc2_layer_t& outMappedLayer) {
200 ExynosDisplay* halDisplay;
201 RET_IF_ERR(getHalDisplay(display, halDisplay));
202 auto iter = mSfLayerToHalLayerMap.find(layer);
203 if (iter == mSfLayerToHalLayerMap.end()) {
204 return HWC2_ERROR_BAD_LAYER;
205 }
206 outMappedLayer = iter->second;
207 return HWC2_ERROR_NONE;
208 }
209
hasCapability(Capability cap)210 bool HalImpl::hasCapability(Capability cap) {
211 return mCaps.find(cap) != mCaps.end();
212 }
213
getCapabilities(std::vector<Capability> * caps)214 void HalImpl::getCapabilities(std::vector<Capability>* caps) {
215 caps->clear();
216 caps->insert(caps->begin(), mCaps.begin(), mCaps.end());
217 }
218
dumpDebugInfo(std::string * output)219 void HalImpl::dumpDebugInfo(std::string* output) {
220 if (output == nullptr) return;
221
222 String8 result;
223 mDevice->dump(result);
224
225 output->resize(result.size());
226 output->assign(result.c_str());
227 }
228
registerEventCallback(EventCallback * callback)229 void HalImpl::registerEventCallback(EventCallback* callback) {
230 mEventCallback = callback;
231
232 mDevice->registerCallback(HWC2_CALLBACK_HOTPLUG, this,
233 reinterpret_cast<hwc2_function_pointer_t>(hook::hotplug));
234 mDevice->registerCallback(HWC2_CALLBACK_REFRESH, this,
235 reinterpret_cast<hwc2_function_pointer_t>(hook::refresh));
236 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_2_4, this,
237 reinterpret_cast<hwc2_function_pointer_t>(hook::vsync));
238 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this,
239 reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncPeriodTimingChanged));
240 mDevice->registerCallback(HWC2_CALLBACK_SEAMLESS_POSSIBLE, this,
241 reinterpret_cast<hwc2_function_pointer_t>(hook::seamlessPossible));
242
243 // register HWC3 Callback
244 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this,
245 reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncIdle));
246 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onRefreshRateChangedDebug, this,
247 reinterpret_cast<hwc2_function_pointer_t>(
248 hook::refreshRateChangedDebug));
249 // Don't register onHotplugEvent until it's available in nextfood (b/323291596)
250 // mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onHotplugEvent, this,
251 // reinterpret_cast<hwc2_function_pointer_t>(hook::hotplugEvent));
252 }
253
unregisterEventCallback()254 void HalImpl::unregisterEventCallback() {
255 mDevice->registerCallback(HWC2_CALLBACK_HOTPLUG, this, nullptr);
256 mDevice->registerCallback(HWC2_CALLBACK_REFRESH, this, nullptr);
257 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_2_4, this, nullptr);
258 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this, nullptr);
259 mDevice->registerCallback(HWC2_CALLBACK_SEAMLESS_POSSIBLE, this, nullptr);
260
261 // unregister HWC3 Callback
262 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this, nullptr);
263 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onRefreshRateChangedDebug, this,
264 nullptr);
265 // Don't register onHotplugEvent until it's available in nextfood (b/323291596)
266 // mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onHotplugEvent, this, nullptr);
267
268 mEventCallback = nullptr;
269 }
270
acceptDisplayChanges(int64_t display)271 int32_t HalImpl::acceptDisplayChanges(int64_t display) {
272 ExynosDisplay* halDisplay;
273 RET_IF_ERR(getHalDisplay(display, halDisplay));
274
275 return halDisplay->acceptDisplayChanges();
276 }
277
createLayer(int64_t display,int64_t * outLayer)278 int32_t HalImpl::createLayer(int64_t display, int64_t* outLayer) {
279 ExynosDisplay* halDisplay;
280 RET_IF_ERR(getHalDisplay(display, halDisplay));
281
282 hwc2_layer_t hwcLayer = 0;
283 RET_IF_ERR(halDisplay->createLayer(&hwcLayer));
284
285 h2a::translate(hwcLayer, *outLayer);
286 // Adding this to stay backward compatible with new batching command,
287 // if HWC supports batching, and create does not.
288 mSfLayerToHalLayerMap[*outLayer] = hwcLayer;
289 mHalLayerToSfLayerMap[hwcLayer] = *outLayer;
290 return HWC2_ERROR_NONE;
291 }
292
batchedCreateDestroyLayer(int64_t display,int64_t layer,LayerLifecycleBatchCommandType cmd)293 int32_t HalImpl::batchedCreateDestroyLayer(int64_t display, int64_t layer,
294 LayerLifecycleBatchCommandType cmd) {
295 int32_t err = HWC2_ERROR_NONE;
296 ExynosDisplay* halDisplay;
297 RET_IF_ERR(getHalDisplay(display, halDisplay));
298 if (cmd == LayerLifecycleBatchCommandType::CREATE) {
299 if (mSfLayerToHalLayerMap.find(layer) != mSfLayerToHalLayerMap.end()) {
300 return HWC2_ERROR_BAD_LAYER;
301 }
302 hwc2_layer_t hwcLayer = 0;
303 RET_IF_ERR(halDisplay->createLayer(&hwcLayer));
304 int64_t hwclayerAidl;
305 h2a::translate(hwcLayer, hwclayerAidl);
306 mSfLayerToHalLayerMap[layer] = hwclayerAidl;
307
308 mHalLayerToSfLayerMap[hwcLayer] = layer;
309 } else if (cmd == LayerLifecycleBatchCommandType::DESTROY) {
310 int64_t HalLayerAidl;
311 ExynosLayer* halLayer;
312 auto iter = mSfLayerToHalLayerMap.find(layer);
313 if (iter == mSfLayerToHalLayerMap.end()) {
314 return HWC2_ERROR_BAD_LAYER;
315 }
316 HalLayerAidl = iter->second;
317
318 RET_IF_ERR(getHalLayer(display, layer, halLayer));
319 err = halDisplay->destroyLayer(reinterpret_cast<hwc2_layer_t>(halLayer));
320 if (err != HWC2_ERROR_NONE) {
321 ALOGW("HalImpl: destroyLayer failed with error: %u", err);
322 }
323 mSfLayerToHalLayerMap.erase(iter);
324 auto iterator = mHalLayerToSfLayerMap.find(reinterpret_cast<hwc2_layer_t>(halLayer));
325 if (iterator == mHalLayerToSfLayerMap.end()) {
326 return HWC2_ERROR_BAD_LAYER;
327 }
328
329 mHalLayerToSfLayerMap.erase(iterator);
330 }
331 return err;
332 }
333
destroyLayer(int64_t display,int64_t layer)334 int32_t HalImpl::destroyLayer(int64_t display, int64_t layer) {
335 int32_t err = HWC2_ERROR_NONE;
336 ExynosDisplay* halDisplay;
337 RET_IF_ERR(getHalDisplay(display, halDisplay));
338
339 ExynosLayer *halLayer;
340 RET_IF_ERR(getHalLayer(display, layer, halLayer));
341 err = halDisplay->destroyLayer(reinterpret_cast<hwc2_layer_t>(halLayer));
342 auto iter = mSfLayerToHalLayerMap.find(layer);
343 if (iter != mSfLayerToHalLayerMap.end()) {
344 mSfLayerToHalLayerMap.erase(iter);
345 }
346 auto iterator = mHalLayerToSfLayerMap.find(reinterpret_cast<hwc2_layer_t>(halLayer));
347 if (iterator != mHalLayerToSfLayerMap.end()) {
348 mHalLayerToSfLayerMap.erase(iterator);
349 }
350 return err;
351 }
352
createVirtualDisplay(uint32_t width,uint32_t height,AidlPixelFormat format,VirtualDisplay * outDisplay)353 int32_t HalImpl::createVirtualDisplay(uint32_t width, uint32_t height, AidlPixelFormat format,
354 VirtualDisplay* outDisplay) {
355 int32_t hwcFormat;
356 a2h::translate(format, hwcFormat);
357 hwc2_display_t hwcDisplay = getDisplayId(HWC_DISPLAY_VIRTUAL, 0);
358 auto halDisplay = mDevice->getDisplay(static_cast<uint32_t>(hwcDisplay));
359 if (!halDisplay) {
360 return HWC2_ERROR_BAD_PARAMETER;
361 }
362
363 RET_IF_ERR(mDevice->createVirtualDisplay(width, height, &hwcFormat, halDisplay));
364
365 h2a::translate(hwcDisplay, outDisplay->display);
366 h2a::translate(hwcFormat, outDisplay->format);
367
368 return HWC2_ERROR_NONE;
369 }
370
destroyVirtualDisplay(int64_t display)371 int32_t HalImpl::destroyVirtualDisplay(int64_t display) {
372 ExynosDisplay* halDisplay;
373 RET_IF_ERR(getHalDisplay(display, halDisplay));
374
375 return mDevice->destroyVirtualDisplay(halDisplay);
376 }
377
getActiveConfig(int64_t display,int32_t * outConfig)378 int32_t HalImpl::getActiveConfig(int64_t display, int32_t* outConfig) {
379 ExynosDisplay* halDisplay;
380 RET_IF_ERR(getHalDisplay(display, halDisplay));
381
382 hwc2_config_t hwcConfig;
383 RET_IF_ERR(halDisplay->getActiveConfig(&hwcConfig));
384
385 h2a::translate(hwcConfig, *outConfig);
386 return HWC2_ERROR_NONE;
387 }
388
getColorModes(int64_t display,std::vector<ColorMode> * outModes)389 int32_t HalImpl::getColorModes(int64_t display, std::vector<ColorMode>* outModes) {
390 ExynosDisplay* halDisplay;
391 RET_IF_ERR(getHalDisplay(display, halDisplay));
392
393 uint32_t count = 0;
394 RET_IF_ERR(halDisplay->getColorModes(&count, nullptr));
395
396 std::vector<int32_t> hwcModes(count);
397 RET_IF_ERR(halDisplay->getColorModes(&count, hwcModes.data()));
398
399 h2a::translate(hwcModes, *outModes);
400 return HWC2_ERROR_NONE;
401 }
402
getDataspaceSaturationMatrix(common::Dataspace dataspace,std::vector<float> * matrix)403 int32_t HalImpl::getDataspaceSaturationMatrix([[maybe_unused]] common::Dataspace dataspace,
404 std::vector<float>* matrix) {
405 // Pixel HWC does not support dataspace saturation matrix, return unit matrix.
406 std::vector<float> unitMatrix = {
407 1.0f, 0.0f, 0.0f, 0.0f,
408 0.0f, 1.0f, 0.0f, 0.0f,
409 0.0f, 0.0f, 1.0f, 0.0f,
410 0.0f, 0.0f, 0.0f, 1.0f,
411 };
412
413 *matrix = std::move(unitMatrix);
414 return HWC2_ERROR_NONE;
415 }
416
getDisplayAttribute(int64_t display,int32_t config,DisplayAttribute attribute,int32_t * outValue)417 int32_t HalImpl::getDisplayAttribute(int64_t display, int32_t config,
418 DisplayAttribute attribute, int32_t* outValue) {
419 ExynosDisplay* halDisplay;
420 RET_IF_ERR(getHalDisplay(display, halDisplay));
421
422 hwc2_config_t hwcConfig;
423 int32_t hwcAttr;
424 a2h::translate(config, hwcConfig);
425 a2h::translate(attribute, hwcAttr);
426
427 auto err = halDisplay->getDisplayAttribute(hwcConfig, hwcAttr, outValue);
428 if (err != HWC2_ERROR_NONE && *outValue == -1) {
429 return HWC2_ERROR_BAD_PARAMETER;
430 }
431 return HWC2_ERROR_NONE;
432 }
433
getDisplayBrightnessSupport(int64_t display,bool & outSupport)434 int32_t HalImpl::getDisplayBrightnessSupport(int64_t display, bool& outSupport) {
435 ExynosDisplay* halDisplay;
436 RET_IF_ERR(getHalDisplay(display, halDisplay));
437
438 return halDisplay->getDisplayBrightnessSupport(&outSupport);
439 }
440
getDisplayCapabilities(int64_t display,std::vector<DisplayCapability> * caps)441 int32_t HalImpl::getDisplayCapabilities(int64_t display,
442 std::vector<DisplayCapability>* caps) {
443 ExynosDisplay* halDisplay;
444 RET_IF_ERR(getHalDisplay(display, halDisplay));
445
446 uint32_t count = 0;
447 RET_IF_ERR(halDisplay->getDisplayCapabilities(&count, nullptr));
448
449 std::vector<uint32_t> hwcCaps(count);
450 RET_IF_ERR(halDisplay->getDisplayCapabilities(&count, hwcCaps.data()));
451
452 h2a::translate(hwcCaps, *caps);
453 return HWC2_ERROR_NONE;
454 }
455
getDisplayConfigs(int64_t display,std::vector<int32_t> * configs)456 int32_t HalImpl::getDisplayConfigs(int64_t display, std::vector<int32_t>* configs) {
457 ExynosDisplay* halDisplay;
458 RET_IF_ERR(getHalDisplay(display, halDisplay));
459
460 uint32_t count = 0;
461 RET_IF_ERR(halDisplay->getDisplayConfigs(&count, nullptr));
462
463 std::vector<hwc2_config_t> hwcConfigs(count);
464 RET_IF_ERR(halDisplay->getDisplayConfigs(&count, hwcConfigs.data()));
465
466 h2a::translate(hwcConfigs, *configs);
467 return HWC2_ERROR_NONE;
468 }
469
getDisplayConfigurations(int64_t display,int32_t,std::vector<DisplayConfiguration> * outConfigs)470 int32_t HalImpl::getDisplayConfigurations(int64_t display, int32_t,
471 std::vector<DisplayConfiguration>* outConfigs) {
472 ExynosDisplay* halDisplay;
473 RET_IF_ERR(getHalDisplay(display, halDisplay));
474
475 std::vector<int32_t> configIds;
476 RET_IF_ERR(getDisplayConfigs(display, &configIds));
477
478 for (const auto configId : configIds) {
479 DisplayConfiguration config;
480 config.configId = configId;
481 // Get required display attributes
482 RET_IF_ERR(getDisplayAttribute(display, configId, DisplayAttribute::WIDTH, &config.width));
483 RET_IF_ERR(
484 getDisplayAttribute(display, configId, DisplayAttribute::HEIGHT, &config.height));
485 RET_IF_ERR(getDisplayAttribute(display, configId, DisplayAttribute::VSYNC_PERIOD,
486 &config.vsyncPeriod));
487 RET_IF_ERR(getDisplayAttribute(display, configId, DisplayAttribute::CONFIG_GROUP,
488 &config.configGroup));
489 // Get optional display attributes
490 int32_t dpiX, dpiY;
491 auto statusDpiX = getDisplayAttribute(display, configId, DisplayAttribute::DPI_X, &dpiX);
492 auto statusDpiY = getDisplayAttribute(display, configId, DisplayAttribute::DPI_Y, &dpiY);
493 // TODO(b/294120341): getDisplayAttribute for DPI should return dots per inch
494 if (statusDpiX == HWC2_ERROR_NONE && statusDpiY == HWC2_ERROR_NONE) {
495 config.dpi = {dpiX / 1000.0f, dpiY / 1000.0f};
496 }
497 // Determine whether there is a need to configure VRR.
498 hwc2_config_t hwcConfigId;
499 a2h::translate(configId, hwcConfigId);
500 std::optional<VrrConfig_t> vrrConfig = halDisplay->getVrrConfigs(hwcConfigId);
501 if (vrrConfig.has_value() && vrrConfig->isFullySupported) {
502 // TODO(b/290843234): complete the remaining values within vrrConfig.
503 VrrConfig hwc3VrrConfig;
504 VrrConfig::NotifyExpectedPresentConfig notifyExpectedPresentConfig;
505 hwc3VrrConfig.minFrameIntervalNs = vrrConfig->minFrameIntervalNs;
506 if (vrrConfig->notifyExpectedPresentConfig.has_value()) {
507 notifyExpectedPresentConfig.headsUpNs =
508 vrrConfig->notifyExpectedPresentConfig->HeadsUpNs;
509 notifyExpectedPresentConfig.timeoutNs =
510 vrrConfig->notifyExpectedPresentConfig->TimeoutNs;
511 hwc3VrrConfig.notifyExpectedPresentConfig =
512 std::make_optional(notifyExpectedPresentConfig);
513 }
514 config.vrrConfig = std::make_optional(hwc3VrrConfig);
515 }
516 outConfigs->push_back(config);
517 }
518
519 return HWC2_ERROR_NONE;
520 }
521
notifyExpectedPresent(int64_t display,const ClockMonotonicTimestamp & expectedPresentTime,int32_t frameIntervalNs)522 int32_t HalImpl::notifyExpectedPresent(int64_t display,
523 const ClockMonotonicTimestamp& expectedPresentTime,
524 int32_t frameIntervalNs) {
525 ExynosDisplay* halDisplay;
526 RET_IF_ERR(getHalDisplay(display, halDisplay));
527
528 RET_IF_ERR(
529 halDisplay->notifyExpectedPresent(expectedPresentTime.timestampNanos, frameIntervalNs));
530 return HWC2_ERROR_NONE;
531 }
532
getDisplayConnectionType(int64_t display,DisplayConnectionType * outType)533 int32_t HalImpl::getDisplayConnectionType(int64_t display, DisplayConnectionType* outType) {
534 ExynosDisplay* halDisplay;
535 RET_IF_ERR(getHalDisplay(display, halDisplay));
536
537 uint32_t hwcType = HWC2_DISPLAY_CONNECTION_TYPE_INTERNAL;
538 RET_IF_ERR(halDisplay->getDisplayConnectionType(&hwcType));
539 h2a::translate(hwcType, *outType);
540
541 return HWC2_ERROR_NONE;
542 }
543
getDisplayIdentificationData(int64_t display,DisplayIdentification * id)544 int32_t HalImpl::getDisplayIdentificationData(int64_t display, DisplayIdentification *id) {
545 ExynosDisplay* halDisplay;
546 RET_IF_ERR(getHalDisplay(display, halDisplay));
547
548 uint8_t port;
549 uint32_t count = 0;
550 RET_IF_ERR(halDisplay->getDisplayIdentificationData(&port, &count, nullptr));
551
552 id->data.resize(count);
553 RET_IF_ERR(halDisplay->getDisplayIdentificationData(&port, &count, id->data.data()));
554
555 h2a::translate(port, id->port);
556 return HWC2_ERROR_NONE;
557 }
558
getDisplayName(int64_t display,std::string * outName)559 int32_t HalImpl::getDisplayName(int64_t display, std::string* outName) {
560 ExynosDisplay* halDisplay;
561 RET_IF_ERR(getHalDisplay(display, halDisplay));
562
563 uint32_t count = 0;
564 RET_IF_ERR(halDisplay->getDisplayName(&count, nullptr));
565
566 outName->resize(count);
567 RET_IF_ERR(halDisplay->getDisplayName(&count, outName->data()));
568
569 return HWC2_ERROR_NONE;
570 }
571
getDisplayVsyncPeriod(int64_t display,int32_t * outVsyncPeriod)572 int32_t HalImpl::getDisplayVsyncPeriod(int64_t display, int32_t* outVsyncPeriod) {
573 ExynosDisplay* halDisplay;
574 RET_IF_ERR(getHalDisplay(display, halDisplay));
575
576 hwc2_vsync_period_t hwcVsyncPeriod;
577 RET_IF_ERR(halDisplay->getDisplayVsyncPeriod(&hwcVsyncPeriod));
578
579 h2a::translate(hwcVsyncPeriod, *outVsyncPeriod);
580 return HWC2_ERROR_NONE;
581 }
582
getDisplayedContentSample(int64_t display,int64_t maxFrames,int64_t timestamp,DisplayContentSample * samples)583 int32_t HalImpl::getDisplayedContentSample([[maybe_unused]] int64_t display,
584 [[maybe_unused]] int64_t maxFrames,
585 [[maybe_unused]] int64_t timestamp,
586 [[maybe_unused]] DisplayContentSample* samples) {
587 return HWC2_ERROR_UNSUPPORTED;
588 }
589
getDisplayedContentSamplingAttributes(int64_t display,DisplayContentSamplingAttributes * attrs)590 int32_t HalImpl::getDisplayedContentSamplingAttributes(
591 [[maybe_unused]] int64_t display,
592 [[maybe_unused]] DisplayContentSamplingAttributes* attrs) {
593 return HWC2_ERROR_UNSUPPORTED;
594 }
595
getDisplayPhysicalOrientation(int64_t display,common::Transform * orientation)596 int32_t HalImpl::getDisplayPhysicalOrientation(int64_t display,
597 common::Transform* orientation) {
598 ExynosDisplay* halDisplay;
599 RET_IF_ERR(getHalDisplay(display, halDisplay));
600
601 HwcMountOrientation hwcOrientation;
602 RET_IF_ERR(halDisplay->getMountOrientation(&hwcOrientation));
603 h2a::translate(hwcOrientation, *orientation);
604
605 return HWC2_ERROR_NONE;
606 }
607
getDozeSupport(int64_t display,bool & support)608 int32_t HalImpl::getDozeSupport(int64_t display, bool& support) {
609 ExynosDisplay* halDisplay;
610 RET_IF_ERR(getHalDisplay(display, halDisplay));
611
612 int32_t hwcSupport;
613 RET_IF_ERR(halDisplay->getDozeSupport(&hwcSupport));
614
615 h2a::translate(hwcSupport, support);
616 return HWC2_ERROR_NONE;
617 }
618
getHdrCapabilities(int64_t display,HdrCapabilities * caps)619 int32_t HalImpl::getHdrCapabilities(int64_t display, HdrCapabilities* caps) {
620 ExynosDisplay* halDisplay;
621 RET_IF_ERR(getHalDisplay(display, halDisplay));
622
623 uint32_t count = 0;
624 RET_IF_ERR(halDisplay->getHdrCapabilities(&count, nullptr, &caps->maxLuminance,
625 &caps->maxAverageLuminance,
626 &caps->minLuminance));
627 std::vector<int32_t> hwcHdrTypes(count);
628 RET_IF_ERR(halDisplay->getHdrCapabilities(&count, hwcHdrTypes.data(),
629 &caps->maxLuminance,
630 &caps->maxAverageLuminance,
631 &caps->minLuminance));
632
633 h2a::translate(hwcHdrTypes, caps->types);
634 return HWC2_ERROR_NONE;
635 }
636
getOverlaySupport(OverlayProperties * caps)637 int32_t HalImpl::getOverlaySupport(OverlayProperties* caps) {
638 return mDevice->getOverlaySupport(caps);
639 }
640
getMaxVirtualDisplayCount(int32_t * count)641 int32_t HalImpl::getMaxVirtualDisplayCount(int32_t* count) {
642 uint32_t hwcCount = mDevice->getMaxVirtualDisplayCount();
643 h2a::translate(hwcCount, *count);
644
645 return HWC2_ERROR_NONE;
646 }
647
getPerFrameMetadataKeys(int64_t display,std::vector<PerFrameMetadataKey> * keys)648 int32_t HalImpl::getPerFrameMetadataKeys(int64_t display,
649 std::vector<PerFrameMetadataKey>* keys) {
650 ExynosDisplay* halDisplay;
651 RET_IF_ERR(getHalDisplay(display, halDisplay));
652
653 uint32_t numKeys = 0;
654 auto resManager = mDevice->mResourceManager;
655 if (resManager->hasHDR10PlusMPP()) {
656 numKeys = HWC2_HDR10_PLUS_SEI + 1;
657 } else {
658 numKeys = HWC2_MAX_FRAME_AVERAGE_LIGHT_LEVEL + 1;
659 }
660 for (uint32_t i = 0; i < numKeys; ++i) {
661 PerFrameMetadataKey key;
662 h2a::translate(i, key);
663 keys->push_back(key);
664 }
665
666 return HWC2_ERROR_NONE;
667 }
668
getReadbackBufferAttributes(int64_t display,ReadbackBufferAttributes * attrs)669 int32_t HalImpl::getReadbackBufferAttributes(int64_t display,
670 ReadbackBufferAttributes* attrs) {
671 ExynosDisplay* halDisplay;
672 RET_IF_ERR(getHalDisplay(display, halDisplay));
673
674 int32_t format = -1;
675 int32_t dataspace = -1;
676 RET_IF_ERR(halDisplay->getReadbackBufferAttributes(&format, &dataspace));
677
678 h2a::translate(format, attrs->format);
679 h2a::translate(dataspace, attrs->dataspace);
680
681 return HWC2_ERROR_NONE;
682 }
683
getReadbackBufferFence(int64_t display,ndk::ScopedFileDescriptor * acquireFence)684 int32_t HalImpl::getReadbackBufferFence(int64_t display,
685 ndk::ScopedFileDescriptor* acquireFence) {
686 ExynosDisplay* halDisplay;
687 RET_IF_ERR(getHalDisplay(display, halDisplay));
688
689 int32_t fd = -1;
690 RET_IF_ERR(halDisplay->getReadbackBufferFence(&fd));
691
692 h2a::translate(fd, *acquireFence);
693 return HWC2_ERROR_NONE;
694 }
695
getRenderIntents(int64_t display,ColorMode mode,std::vector<RenderIntent> * intents)696 int32_t HalImpl::getRenderIntents(int64_t display, ColorMode mode,
697 std::vector<RenderIntent>* intents) {
698 ExynosDisplay* halDisplay;
699 RET_IF_ERR(getHalDisplay(display, halDisplay));
700
701 int32_t hwcMode;
702 uint32_t count = 0;
703 a2h::translate(mode, hwcMode);
704 RET_IF_ERR(halDisplay->getRenderIntents(hwcMode, &count, nullptr));
705
706 std::vector<int32_t> hwcIntents(count);
707 RET_IF_ERR(halDisplay->getRenderIntents(hwcMode, &count, hwcIntents.data()));
708
709 h2a::translate(hwcIntents, *intents);
710 return HWC2_ERROR_NONE;
711 }
712
getSupportedContentTypes(int64_t display,std::vector<ContentType> * types)713 int32_t HalImpl::getSupportedContentTypes(int64_t display, std::vector<ContentType>* types) {
714 ExynosDisplay* halDisplay;
715 RET_IF_ERR(getHalDisplay(display, halDisplay));
716
717 uint32_t count = 0;
718 RET_IF_ERR(halDisplay->getSupportedContentTypes(&count, nullptr));
719
720 std::vector<uint32_t> hwcTypes(count);
721 RET_IF_ERR(halDisplay->getSupportedContentTypes(&count, hwcTypes.data()));
722
723 h2a::translate(hwcTypes, *types);
724 return HWC2_ERROR_NONE;
725 }
726
flushDisplayBrightnessChange(int64_t display)727 int32_t HalImpl::flushDisplayBrightnessChange(int64_t display) {
728 ExynosDisplay* halDisplay;
729 RET_IF_ERR(getHalDisplay(display, halDisplay));
730
731 return halDisplay->flushDisplayBrightnessChange();
732 }
733
presentDisplay(int64_t display,ndk::ScopedFileDescriptor & fence,std::vector<int64_t> * outLayers,std::vector<ndk::ScopedFileDescriptor> * outReleaseFences)734 int32_t HalImpl::presentDisplay(int64_t display, ndk::ScopedFileDescriptor& fence,
735 std::vector<int64_t>* outLayers,
736 std::vector<ndk::ScopedFileDescriptor>* outReleaseFences) {
737 ExynosDisplay* halDisplay;
738 RET_IF_ERR(getHalDisplay(display, halDisplay));
739
740 // TODO: not expect acceptDisplayChanges if there are no changes to accept
741 if (halDisplay->mRenderingState == RENDERING_STATE_VALIDATED) {
742 LOG(INFO) << halDisplay->mDisplayName.c_str()
743 << ": acceptDisplayChanges was not called";
744 if (halDisplay->acceptDisplayChanges() != HWC2_ERROR_NONE) {
745 LOG(ERROR) << halDisplay->mDisplayName.c_str()
746 << ": acceptDisplayChanges is failed";
747 }
748 }
749
750 int32_t hwcFence;
751 RET_IF_ERR(halDisplay->presentDisplay(&hwcFence));
752 h2a::translate(hwcFence, fence);
753
754 uint32_t count = 0;
755 RET_IF_ERR(halDisplay->getReleaseFences(&count, nullptr, nullptr));
756
757 std::vector<hwc2_layer_t> hwcLayers(count);
758 std::vector<int32_t> hwcFences(count);
759 RET_IF_ERR(halDisplay->getReleaseFences(&count, hwcLayers.data(), hwcFences.data()));
760 std::vector<int64_t> sfLayers(count);
761
762 for (int i = 0; i < count; i++) {
763 auto iter = mHalLayerToSfLayerMap.find(hwcLayers[i]);
764 if (iter != mHalLayerToSfLayerMap.end()) {
765 sfLayers[i] = iter->second;
766 } else {
767 LOG(ERROR) << "HalImpl::presentDisplay incorrect hal mapping. ";
768 }
769 }
770 h2a::translate(sfLayers, *outLayers);
771 h2a::translate(hwcFences, *outReleaseFences);
772
773 return HWC2_ERROR_NONE;
774 }
775
setActiveConfig(int64_t display,int32_t config)776 int32_t HalImpl::setActiveConfig(int64_t display, int32_t config) {
777 ExynosDisplay* halDisplay;
778 RET_IF_ERR(getHalDisplay(display, halDisplay));
779
780 hwc2_config_t hwcConfig;
781 a2h::translate(config, hwcConfig);
782 return halDisplay->setActiveConfig(hwcConfig);
783 }
784
setActiveConfigWithConstraints(int64_t display,int32_t config,const VsyncPeriodChangeConstraints & vsyncPeriodChangeConstraints,VsyncPeriodChangeTimeline * timeline)785 int32_t HalImpl::setActiveConfigWithConstraints(
786 int64_t display, int32_t config,
787 const VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints,
788 VsyncPeriodChangeTimeline* timeline) {
789 ExynosDisplay* halDisplay;
790 RET_IF_ERR(getHalDisplay(display, halDisplay));
791
792 hwc2_config_t hwcConfig;
793 hwc_vsync_period_change_constraints_t hwcConstraints;
794 hwc_vsync_period_change_timeline_t hwcTimeline;
795
796 a2h::translate(config, hwcConfig);
797 a2h::translate(vsyncPeriodChangeConstraints, hwcConstraints);
798 RET_IF_ERR(halDisplay->setActiveConfigWithConstraints(hwcConfig, &hwcConstraints, &hwcTimeline));
799
800 h2a::translate(hwcTimeline, *timeline);
801 return HWC2_ERROR_NONE;
802 }
803
setBootDisplayConfig(int64_t display,int32_t config)804 int32_t HalImpl::setBootDisplayConfig(int64_t display, int32_t config) {
805 ExynosDisplay* halDisplay;
806 RET_IF_ERR(getHalDisplay(display, halDisplay));
807
808 return halDisplay->setBootDisplayConfig(config);
809 }
810
clearBootDisplayConfig(int64_t display)811 int32_t HalImpl::clearBootDisplayConfig(int64_t display) {
812 ExynosDisplay* halDisplay;
813 RET_IF_ERR(getHalDisplay(display, halDisplay));
814
815 return halDisplay->clearBootDisplayConfig();
816 }
817
getPreferredBootDisplayConfig(int64_t display,int32_t * config)818 int32_t HalImpl::getPreferredBootDisplayConfig(int64_t display, int32_t* config) {
819 ExynosDisplay* halDisplay;
820 RET_IF_ERR(getHalDisplay(display, halDisplay));
821
822 return halDisplay->getPreferredBootDisplayConfig(config);
823 }
824
getHdrConversionCapabilities(std::vector<common::HdrConversionCapability> *)825 int32_t HalImpl::getHdrConversionCapabilities(std::vector<common::HdrConversionCapability>*) {
826 return HWC2_ERROR_UNSUPPORTED;
827 }
828
setHdrConversionStrategy(const common::HdrConversionStrategy &,common::Hdr *)829 int32_t HalImpl::setHdrConversionStrategy(const common::HdrConversionStrategy&, common::Hdr*) {
830 return HWC2_ERROR_UNSUPPORTED;
831 }
832
setAutoLowLatencyMode(int64_t display,bool on)833 int32_t HalImpl::setAutoLowLatencyMode(int64_t display, bool on) {
834 ExynosDisplay* halDisplay;
835 RET_IF_ERR(getHalDisplay(display, halDisplay));
836
837 return halDisplay->setAutoLowLatencyMode(on);
838 }
839
setClientTarget(int64_t display,buffer_handle_t target,const ndk::ScopedFileDescriptor & fence,common::Dataspace dataspace,const std::vector<common::Rect> & damage)840 int32_t HalImpl::setClientTarget(int64_t display, buffer_handle_t target,
841 const ndk::ScopedFileDescriptor& fence,
842 common::Dataspace dataspace,
843 const std::vector<common::Rect>& damage) {
844 ExynosDisplay* halDisplay;
845 RET_IF_ERR(getHalDisplay(display, halDisplay));
846
847 int32_t hwcFence;
848 int32_t hwcDataspace;
849 std::vector<hwc_rect_t> hwcDamage;
850
851 a2h::translate(fence, hwcFence);
852 a2h::translate(dataspace, hwcDataspace);
853 a2h::translate(damage, hwcDamage);
854 hwc_region_t region = { hwcDamage.size(), hwcDamage.data() };
855 UNUSED(region);
856
857 return halDisplay->setClientTarget(target, hwcFence, hwcDataspace);
858 }
859
getHasClientComposition(int64_t display,bool & outHasClientComp)860 int32_t HalImpl::getHasClientComposition(int64_t display, bool& outHasClientComp) {
861 ExynosDisplay* halDisplay;
862 RET_IF_ERR(getHalDisplay(display, halDisplay));
863
864 outHasClientComp = halDisplay->hasClientComposition();
865
866 return HWC2_ERROR_NONE;
867 }
868
setColorMode(int64_t display,ColorMode mode,RenderIntent intent)869 int32_t HalImpl::setColorMode(int64_t display, ColorMode mode, RenderIntent intent) {
870 ExynosDisplay* halDisplay;
871 RET_IF_ERR(getHalDisplay(display, halDisplay));
872
873 int32_t hwcMode;
874 int32_t hwcIntent;
875
876 a2h::translate(mode, hwcMode);
877 a2h::translate(intent, hwcIntent);
878 return halDisplay->setColorModeWithRenderIntent(hwcMode, hwcIntent);
879 }
880
setColorTransform(int64_t display,const std::vector<float> & matrix)881 int32_t HalImpl::setColorTransform(int64_t display, const std::vector<float>& matrix) {
882 // clang-format off
883 constexpr std::array<float, 16> kIdentity = {
884 1.0f, 0.0f, 0.0f, 0.0f,
885 0.0f, 1.0f, 0.0f, 0.0f,
886 0.0f, 0.0f, 1.0f, 0.0f,
887 0.0f, 0.0f, 0.0f, 1.0f,
888 };
889 // clang-format on
890 const bool isIdentity = (std::equal(matrix.begin(), matrix.end(), kIdentity.begin()));
891 const common::ColorTransform hint = isIdentity ? common::ColorTransform::IDENTITY
892 : common::ColorTransform::ARBITRARY_MATRIX;
893
894 ExynosDisplay* halDisplay;
895 RET_IF_ERR(getHalDisplay(display, halDisplay));
896
897 int32_t hwcHint;
898 a2h::translate(hint, hwcHint);
899 return halDisplay->setColorTransform(matrix.data(), hwcHint);
900 }
901
setContentType(int64_t display,ContentType contentType)902 int32_t HalImpl::setContentType(int64_t display, ContentType contentType) {
903 ExynosDisplay* halDisplay;
904 RET_IF_ERR(getHalDisplay(display, halDisplay));
905
906 int32_t type;
907 a2h::translate(contentType, type);
908 return halDisplay->setContentType(type);
909 }
910
setDisplayBrightness(int64_t display,float brightness)911 int32_t HalImpl::setDisplayBrightness(int64_t display, float brightness) {
912 ExynosDisplay* halDisplay;
913 RET_IF_ERR(getHalDisplay(display, halDisplay));
914
915 return halDisplay->setDisplayBrightness(brightness, true /* wait present */);
916 }
917
setDisplayedContentSamplingEnabled(int64_t display,bool enable,FormatColorComponent componentMask,int64_t maxFrames)918 int32_t HalImpl::setDisplayedContentSamplingEnabled(
919 [[maybe_unused]] int64_t display,
920 [[maybe_unused]] bool enable,
921 [[maybe_unused]] FormatColorComponent componentMask,
922 [[maybe_unused]] int64_t maxFrames) {
923 return HWC2_ERROR_UNSUPPORTED;
924 }
925
setLayerBlendMode(int64_t display,int64_t layer,common::BlendMode mode)926 int32_t HalImpl::setLayerBlendMode(int64_t display, int64_t layer, common::BlendMode mode) {
927 ExynosLayer *halLayer;
928 RET_IF_ERR(getHalLayer(display, layer, halLayer));
929
930 int32_t hwcMode;
931 a2h::translate(mode, hwcMode);
932 return halLayer->setLayerBlendMode(hwcMode);
933 }
934
setLayerBuffer(int64_t display,int64_t layer,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & acquireFence)935 int32_t HalImpl::setLayerBuffer(int64_t display, int64_t layer, buffer_handle_t buffer,
936 const ndk::ScopedFileDescriptor& acquireFence) {
937 ExynosLayer *halLayer;
938 RET_IF_ERR(getHalLayer(display, layer, halLayer));
939
940 int32_t hwcFd;
941 a2h::translate(acquireFence, hwcFd);
942
943 return halLayer->setLayerBuffer(buffer, hwcFd);
944 }
945
uncacheLayerBuffers(int64_t display,int64_t layer,const std::vector<buffer_handle_t> & buffers,std::vector<buffer_handle_t> & outClearableBuffers)946 int32_t HalImpl::uncacheLayerBuffers(int64_t display, int64_t layer,
947 const std::vector<buffer_handle_t>& buffers,
948 std::vector<buffer_handle_t>& outClearableBuffers) {
949 ExynosDisplay* halDisplay;
950 RET_IF_ERR(getHalDisplay(display, halDisplay));
951
952 ExynosLayer* halLayer;
953 RET_IF_ERR(getHalLayer(display, layer, halLayer));
954
955 return halDisplay->uncacheLayerBuffers(halLayer, buffers, outClearableBuffers);
956 }
957
setLayerColor(int64_t display,int64_t layer,Color color)958 int32_t HalImpl::setLayerColor(int64_t display, int64_t layer, Color color) {
959 ExynosLayer *halLayer;
960 RET_IF_ERR(getHalLayer(display, layer, halLayer));
961
962 hwc_color_t hwcColor;
963 a2h::translate(color, hwcColor);
964 return halLayer->setLayerColor(hwcColor);
965 }
966
setLayerColorTransform(int64_t display,int64_t layer,const std::vector<float> & matrix)967 int32_t HalImpl::setLayerColorTransform(int64_t display, int64_t layer,
968 const std::vector<float>& matrix) {
969 ExynosLayer *halLayer;
970 RET_IF_ERR(getHalLayer(display, layer, halLayer));
971
972 return halLayer->setLayerColorTransform(matrix.data());
973 }
974
setLayerCompositionType(int64_t display,int64_t layer,Composition type)975 int32_t HalImpl::setLayerCompositionType(int64_t display, int64_t layer, Composition type) {
976 ExynosLayer *halLayer;
977 RET_IF_ERR(getHalLayer(display, layer, halLayer));
978
979 int32_t hwcType;
980 a2h::translate(type, hwcType);
981 return halLayer->setLayerCompositionType(hwcType);
982 }
983
setLayerCursorPosition(int64_t display,int64_t layer,int32_t x,int32_t y)984 int32_t HalImpl::setLayerCursorPosition(int64_t display, int64_t layer, int32_t x, int32_t y) {
985 ExynosLayer *halLayer;
986 RET_IF_ERR(getHalLayer(display, layer, halLayer));
987
988 return halLayer->setCursorPosition(x, y);
989 }
990
setLayerDataspace(int64_t display,int64_t layer,common::Dataspace dataspace)991 int32_t HalImpl::setLayerDataspace(int64_t display, int64_t layer, common::Dataspace dataspace) {
992 ExynosLayer *halLayer;
993 RET_IF_ERR(getHalLayer(display, layer, halLayer));
994
995 int32_t hwcDataspace;
996 a2h::translate(dataspace, hwcDataspace);
997 return halLayer->setLayerDataspace(hwcDataspace);
998 }
999
setLayerDisplayFrame(int64_t display,int64_t layer,const common::Rect & frame)1000 int32_t HalImpl::setLayerDisplayFrame(int64_t display, int64_t layer, const common::Rect& frame) {
1001 ExynosLayer *halLayer;
1002 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1003
1004 hwc_rect_t hwcFrame;
1005 a2h::translate(frame, hwcFrame);
1006 return halLayer->setLayerDisplayFrame(hwcFrame);
1007 }
1008
setLayerPerFrameMetadata(int64_t display,int64_t layer,const std::vector<std::optional<PerFrameMetadata>> & metadata)1009 int32_t HalImpl::setLayerPerFrameMetadata(int64_t display, int64_t layer,
1010 const std::vector<std::optional<PerFrameMetadata>>& metadata) {
1011 ExynosLayer *halLayer;
1012 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1013
1014 uint32_t count = metadata.size();
1015 std::vector<int32_t> keys;
1016 std::vector<float> values;
1017
1018 for (uint32_t ix = 0; ix < count; ++ix) {
1019 if (metadata[ix]) {
1020 int32_t key;
1021 a2h::translate(metadata[ix]->key, key);
1022 keys.push_back(key);
1023 values.push_back(metadata[ix]->value);
1024 }
1025 }
1026
1027 return halLayer->setLayerPerFrameMetadata(count, keys.data(), values.data());
1028 }
1029
setLayerPerFrameMetadataBlobs(int64_t display,int64_t layer,const std::vector<std::optional<PerFrameMetadataBlob>> & blobs)1030 int32_t HalImpl::setLayerPerFrameMetadataBlobs(int64_t display, int64_t layer,
1031 const std::vector<std::optional<PerFrameMetadataBlob>>& blobs) {
1032 ExynosLayer *halLayer;
1033 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1034
1035 uint32_t count = blobs.size();
1036 std::vector<int32_t> keys;
1037 std::vector<uint32_t> sizes;
1038 std::vector<uint8_t> values;
1039
1040 for (uint32_t ix = 0; ix < count; ++ix) {
1041 if (blobs[ix]) {
1042 int32_t key;
1043 a2h::translate(blobs[ix]->key, key);
1044 keys.push_back(key);
1045 sizes.push_back(blobs[ix]->blob.size());
1046 values.insert(values.end(), blobs[ix]->blob.begin(), blobs[ix]->blob.end());
1047 }
1048 }
1049
1050 return halLayer->setLayerPerFrameMetadataBlobs(count, keys.data(), sizes.data(),
1051 values.data());
1052 }
1053
setLayerPlaneAlpha(int64_t display,int64_t layer,float alpha)1054 int32_t HalImpl::setLayerPlaneAlpha(int64_t display, int64_t layer, float alpha) {
1055 ExynosLayer *halLayer;
1056 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1057
1058 return halLayer->setLayerPlaneAlpha(alpha);
1059 }
1060
setLayerSidebandStream(int64_t display,int64_t layer,buffer_handle_t stream)1061 int32_t HalImpl::setLayerSidebandStream([[maybe_unused]] int64_t display,
1062 [[maybe_unused]] int64_t layer,
1063 [[maybe_unused]] buffer_handle_t stream) {
1064 return HWC2_ERROR_UNSUPPORTED;
1065 }
1066
setLayerSourceCrop(int64_t display,int64_t layer,const common::FRect & crop)1067 int32_t HalImpl::setLayerSourceCrop(int64_t display, int64_t layer, const common::FRect& crop) {
1068 ExynosLayer *halLayer;
1069 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1070
1071 hwc_frect_t hwcCrop;
1072 a2h::translate(crop, hwcCrop);
1073 return halLayer->setLayerSourceCrop(hwcCrop);
1074 }
1075
setLayerSurfaceDamage(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & damage)1076 int32_t HalImpl::setLayerSurfaceDamage(int64_t display, int64_t layer,
1077 const std::vector<std::optional<common::Rect>>& damage) {
1078 ExynosLayer *halLayer;
1079 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1080
1081 std::vector<hwc_rect_t> hwcDamage;
1082 a2h::translate(damage, hwcDamage);
1083 hwc_region_t region = { hwcDamage.size(), hwcDamage.data() };
1084
1085 return halLayer->setLayerSurfaceDamage(region);
1086 }
1087
setLayerTransform(int64_t display,int64_t layer,common::Transform transform)1088 int32_t HalImpl::setLayerTransform(int64_t display, int64_t layer, common::Transform transform) {
1089 ExynosLayer *halLayer;
1090 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1091
1092 int32_t hwcTransform;
1093 a2h::translate(transform, hwcTransform);
1094
1095 return halLayer->setLayerTransform(hwcTransform);
1096 }
1097
setLayerVisibleRegion(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & visible)1098 int32_t HalImpl::setLayerVisibleRegion(int64_t display, int64_t layer,
1099 const std::vector<std::optional<common::Rect>>& visible) {
1100 ExynosLayer *halLayer;
1101 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1102
1103 std::vector<hwc_rect_t> hwcVisible;
1104 a2h::translate(visible, hwcVisible);
1105 hwc_region_t region = { hwcVisible.size(), hwcVisible.data() };
1106
1107 return halLayer->setLayerVisibleRegion(region);
1108 }
1109
setLayerBrightness(int64_t display,int64_t layer,float brightness)1110 int32_t HalImpl::setLayerBrightness(int64_t display, int64_t layer, float brightness) {
1111 ExynosLayer *halLayer;
1112 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1113
1114 return halLayer->setLayerBrightness(brightness);
1115 }
1116
setLayerZOrder(int64_t display,int64_t layer,uint32_t z)1117 int32_t HalImpl::setLayerZOrder(int64_t display, int64_t layer, uint32_t z) {
1118 ExynosLayer *halLayer;
1119 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1120
1121 return halLayer->setLayerZOrder(z);
1122 }
1123
setOutputBuffer(int64_t display,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & releaseFence)1124 int32_t HalImpl::setOutputBuffer(int64_t display, buffer_handle_t buffer,
1125 const ndk::ScopedFileDescriptor& releaseFence) {
1126 ExynosDisplay* halDisplay;
1127 RET_IF_ERR(getHalDisplay(display, halDisplay));
1128
1129 int32_t hwcFence;
1130 a2h::translate(releaseFence, hwcFence);
1131
1132 auto err = halDisplay->setOutputBuffer(buffer, hwcFence);
1133 // unlike in setClientTarget, releaseFence is owned by us
1134 if (err == HWC2_ERROR_NONE && hwcFence >= 0) {
1135 close(hwcFence);
1136 }
1137
1138 return err;
1139 }
1140
setPowerMode(int64_t display,PowerMode mode)1141 int32_t HalImpl::setPowerMode(int64_t display, PowerMode mode) {
1142 if (mode == PowerMode::ON_SUSPEND || mode == PowerMode::DOZE_SUSPEND) {
1143 return HWC2_ERROR_UNSUPPORTED;
1144 }
1145
1146 ExynosDisplay* halDisplay;
1147 RET_IF_ERR(getHalDisplay(display, halDisplay));
1148
1149 int32_t hwcMode;
1150 a2h::translate(mode, hwcMode);
1151 return halDisplay->setPowerMode(hwcMode);
1152 }
1153
getPowerMode(int64_t display,std::optional<PowerMode> & outMode)1154 int32_t HalImpl::getPowerMode(int64_t display, std::optional<PowerMode>& outMode) {
1155 ExynosDisplay* halDisplay;
1156 RET_IF_ERR(getHalDisplay(display, halDisplay));
1157
1158 auto mode = halDisplay->getPowerMode();
1159 h2a::translate(mode, outMode);
1160 return HWC2_ERROR_NONE;
1161 }
1162
setReadbackBuffer(int64_t display,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & releaseFence)1163 int32_t HalImpl::setReadbackBuffer(int64_t display, buffer_handle_t buffer,
1164 const ndk::ScopedFileDescriptor& releaseFence) {
1165 ExynosDisplay* halDisplay;
1166 RET_IF_ERR(getHalDisplay(display, halDisplay));
1167
1168 int32_t hwcFence;
1169 a2h::translate(releaseFence, hwcFence);
1170
1171 return halDisplay->setReadbackBuffer(buffer, hwcFence);
1172 }
1173
setVsyncEnabled(int64_t display,bool enabled)1174 int32_t HalImpl::setVsyncEnabled(int64_t display, bool enabled) {
1175 ExynosDisplay* halDisplay;
1176 RET_IF_ERR(getHalDisplay(display, halDisplay));
1177
1178 hwc2_vsync_t hwcEnable;
1179 a2h::translate(enabled, hwcEnable);
1180 return halDisplay->setVsyncEnabled(hwcEnable);
1181 }
1182
setIdleTimerEnabled(int64_t display,int32_t timeout)1183 int32_t HalImpl::setIdleTimerEnabled(int64_t display, int32_t timeout) {
1184 ExynosDisplay* halDisplay;
1185 RET_IF_ERR(getHalDisplay(display, halDisplay));
1186
1187 return halDisplay->setDisplayIdleTimer(timeout);
1188 }
1189
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)1190 int32_t HalImpl::validateDisplay(int64_t display, std::vector<int64_t>* outChangedLayers,
1191 std::vector<Composition>* outCompositionTypes,
1192 uint32_t* outDisplayRequestMask,
1193 std::vector<int64_t>* outRequestedLayers,
1194 std::vector<int32_t>* outRequestMasks,
1195 ClientTargetProperty* outClientTargetProperty,
1196 DimmingStage* outDimmingStage) {
1197 ExynosDisplay* halDisplay;
1198 RET_IF_ERR(getHalDisplay(display, halDisplay));
1199
1200 uint32_t typesCount = 0;
1201 uint32_t reqsCount = 0;
1202 auto err = halDisplay->validateDisplay(&typesCount, &reqsCount);
1203
1204 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
1205 return err;
1206 }
1207
1208 std::vector<hwc2_layer_t> hwcChangedLayers(typesCount);
1209 std::vector<int32_t> hwcCompositionTypes(typesCount);
1210 RET_IF_ERR(halDisplay->getChangedCompositionTypes(&typesCount, hwcChangedLayers.data(),
1211 hwcCompositionTypes.data()));
1212
1213 int32_t displayReqs;
1214 std::vector<hwc2_layer_t> hwcRequestedLayers(reqsCount);
1215 outRequestMasks->resize(reqsCount);
1216 RET_IF_ERR(halDisplay->getDisplayRequests(&displayReqs, &reqsCount,
1217 hwcRequestedLayers.data(), outRequestMasks->data()));
1218 std::vector<int64_t> sfChangedLayers(typesCount);
1219
1220 for (int i = 0; i < typesCount; i++) {
1221 auto iter = mHalLayerToSfLayerMap.find(hwcChangedLayers[i]);
1222 if (iter != mHalLayerToSfLayerMap.end()) {
1223 sfChangedLayers[i] = iter->second;
1224 } else {
1225 LOG(ERROR) << "HalImpl::validateDisplay incorrect hal mapping. ";
1226 }
1227 }
1228 h2a::translate(sfChangedLayers, *outChangedLayers);
1229 h2a::translate(hwcCompositionTypes, *outCompositionTypes);
1230 *outDisplayRequestMask = displayReqs;
1231 std::vector<int64_t> sfRequestedLayers(reqsCount);
1232
1233 for (int i = 0; i < reqsCount; i++) {
1234 auto iter = mHalLayerToSfLayerMap.find(hwcRequestedLayers[i]);
1235 if (iter != mHalLayerToSfLayerMap.end()) {
1236 sfRequestedLayers[i] = iter->second;
1237 } else {
1238 LOG(ERROR) << "HalImpl::validateDisplay incorrect hal mapping. ";
1239 }
1240 }
1241 h2a::translate(sfRequestedLayers, *outRequestedLayers);
1242 hwc_client_target_property hwcProperty;
1243 HwcDimmingStage hwcDimmingStage;
1244 if (!halDisplay->getClientTargetProperty(&hwcProperty, &hwcDimmingStage)) {
1245 h2a::translate(hwcDimmingStage, *outDimmingStage);
1246 h2a::translate(hwcProperty, *outClientTargetProperty);
1247 } // else ignore this error
1248
1249 return err;
1250 }
1251
setExpectedPresentTime(int64_t display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime,int frameIntervalNs)1252 int HalImpl::setExpectedPresentTime(
1253 int64_t display, const std::optional<ClockMonotonicTimestamp> expectedPresentTime,
1254 int frameIntervalNs) {
1255 ExynosDisplay* halDisplay;
1256 RET_IF_ERR(getHalDisplay(display, halDisplay));
1257
1258 if (!expectedPresentTime.has_value()) return HWC2_ERROR_NONE;
1259
1260 if (halDisplay->getPendingExpectedPresentTime() != 0) {
1261 ALOGW("HalImpl: set expected present time multiple times in one frame");
1262 }
1263
1264 halDisplay->setExpectedPresentTime(expectedPresentTime->timestampNanos, frameIntervalNs);
1265
1266 return HWC2_ERROR_NONE;
1267 }
1268
getRCDLayerSupport(int64_t display,bool & outSupport)1269 int32_t HalImpl::getRCDLayerSupport(int64_t display, bool& outSupport) {
1270 ExynosDisplay* halDisplay;
1271 RET_IF_ERR(getHalDisplay(display, halDisplay));
1272
1273 return halDisplay->getRCDLayerSupport(outSupport);
1274 }
1275
setLayerBlockingRegion(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & blockingRegion)1276 int32_t HalImpl::setLayerBlockingRegion(
1277 int64_t display, int64_t layer,
1278 const std::vector<std::optional<common::Rect>>& blockingRegion) {
1279 ExynosLayer* halLayer;
1280 RET_IF_ERR(getHalLayer(display, layer, halLayer));
1281
1282 std::vector<hwc_rect_t> halBlockingRegion;
1283 a2h::translate(blockingRegion, halBlockingRegion);
1284
1285 return halLayer->setLayerBlockingRegion(halBlockingRegion);
1286 }
1287
getDisplayIdleTimerSupport(int64_t display,bool & outSupport)1288 int32_t HalImpl::getDisplayIdleTimerSupport(int64_t display, bool& outSupport) {
1289 ExynosDisplay* halDisplay;
1290 RET_IF_ERR(getHalDisplay(display, halDisplay));
1291
1292 return halDisplay->getDisplayIdleTimerSupport(outSupport);
1293 }
1294
getDisplayMultiThreadedPresentSupport(const int64_t & display,bool & outSupport)1295 int32_t HalImpl::getDisplayMultiThreadedPresentSupport(const int64_t& display, bool& outSupport) {
1296 ExynosDisplay* halDisplay;
1297 RET_IF_ERR(getHalDisplay(display, halDisplay));
1298
1299 return halDisplay->getDisplayMultiThreadedPresentSupport(outSupport);
1300 }
1301
setRefreshRateChangedCallbackDebugEnabled(int64_t display,bool enabled)1302 int32_t HalImpl::setRefreshRateChangedCallbackDebugEnabled(int64_t display, bool enabled) {
1303 ExynosDisplay* halDisplay;
1304 RET_IF_ERR(getHalDisplay(display, halDisplay));
1305
1306 return halDisplay->setRefreshRateChangedCallbackDebugEnabled(enabled);
1307 }
1308
1309 } // namespace aidl::android::hardware::graphics::composer3::impl
1310