blob: 8ca0eb335132ac00c578905035d124bd25ec04f2 [file] [log] [blame]
Chia-I Wu7f8d3962016-09-28 21:04:23 +08001/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "HwcPassthrough"
18
Fabien Sanglard9b117a42017-03-21 09:39:35 -070019#include "Hwc.h"
Chia-I Wu7f8d3962016-09-28 21:04:23 +080020
Fabien Sanglard9b117a42017-03-21 09:39:35 -070021#include <type_traits>
Chia-I Wu7f8d3962016-09-28 21:04:23 +080022#include <log/log.h>
23
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -050024#include "ComposerClient.h"
Fabien Sanglard0d55a212017-03-16 16:56:46 -070025#include "hardware/hwcomposer.h"
26#include "hwc2on1adapter/HWC2On1Adapter.h"
Chia-I Wu7f8d3962016-09-28 21:04:23 +080027
28namespace android {
29namespace hardware {
30namespace graphics {
31namespace composer {
32namespace V2_1 {
33namespace implementation {
34
Fabien Sanglard0d55a212017-03-16 16:56:46 -070035
Chia-I Wu7f8d3962016-09-28 21:04:23 +080036HwcHal::HwcHal(const hw_module_t* module)
Fabien Sanglard0d55a212017-03-16 16:56:46 -070037 : mDevice(nullptr), mDispatch(), mAdapter()
Chia-I Wu7f8d3962016-09-28 21:04:23 +080038{
Fabien Sanglard0d55a212017-03-16 16:56:46 -070039 // Determine what kind of module is available (HWC2 vs HWC1.X).
40 hw_device_t* device = nullptr;
41 int error = module->methods->open(module, HWC_HARDWARE_COMPOSER, &device);
42 if (error != 0) {
43 ALOGE("Failed to open HWC device (%s), aborting", strerror(-error));
44 abort();
45 }
46 uint32_t majorVersion = (device->version >> 24) & 0xF;
47
48 // If we don't have a HWC2, we need to wrap whatever we have in an adapter.
49 if (majorVersion != 2) {
50 uint32_t minorVersion = device->version & HARDWARE_API_VERSION_2_MAJ_MIN_MASK;
51 minorVersion = (minorVersion >> 16) & 0xF;
52 ALOGI("Found HWC implementation v%d.%d", majorVersion, minorVersion);
53 if (minorVersion < 1) {
54 ALOGE("Cannot adapt to HWC version %d.%d. Minimum supported is 1.1",
55 majorVersion, minorVersion);
56 abort();
57 }
58 mAdapter = std::make_unique<HWC2On1Adapter>(
59 reinterpret_cast<hwc_composer_device_1*>(device));
60
61 // Place the adapter in front of the device module.
62 mDevice = mAdapter.get();
63 } else {
64 mDevice = reinterpret_cast<hwc2_device_t*>(device);
Chia-I Wu7f8d3962016-09-28 21:04:23 +080065 }
66
67 initCapabilities();
Brian Anderson9af5d942017-04-04 16:16:41 -070068 if (majorVersion >= 2 &&
69 hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
70 ALOGE("Present fence must be reliable from HWC2 on.");
71 abort();
72 }
73
Chia-I Wu7f8d3962016-09-28 21:04:23 +080074 initDispatch();
75}
76
77HwcHal::~HwcHal()
78{
79 hwc2_close(mDevice);
Chia-I Wu7f8d3962016-09-28 21:04:23 +080080}
81
82void HwcHal::initCapabilities()
83{
84 uint32_t count = 0;
85 mDevice->getCapabilities(mDevice, &count, nullptr);
86
87 std::vector<Capability> caps(count);
88 mDevice->getCapabilities(mDevice, &count, reinterpret_cast<
89 std::underlying_type<Capability>::type*>(caps.data()));
90 caps.resize(count);
91
92 mCapabilities.insert(caps.cbegin(), caps.cend());
93}
94
95template<typename T>
Chia-I Wue1768352016-12-19 12:56:54 +080096void HwcHal::initDispatch(hwc2_function_descriptor_t desc, T* outPfn)
Chia-I Wu7f8d3962016-09-28 21:04:23 +080097{
98 auto pfn = mDevice->getFunction(mDevice, desc);
99 if (!pfn) {
100 LOG_ALWAYS_FATAL("failed to get hwcomposer2 function %d", desc);
101 }
102
Chia-I Wue1768352016-12-19 12:56:54 +0800103 *outPfn = reinterpret_cast<T>(pfn);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800104}
105
106void HwcHal::initDispatch()
107{
Chia-I Wue1768352016-12-19 12:56:54 +0800108 initDispatch(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
109 &mDispatch.acceptDisplayChanges);
110 initDispatch(HWC2_FUNCTION_CREATE_LAYER, &mDispatch.createLayer);
111 initDispatch(HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
112 &mDispatch.createVirtualDisplay);
113 initDispatch(HWC2_FUNCTION_DESTROY_LAYER, &mDispatch.destroyLayer);
114 initDispatch(HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
115 &mDispatch.destroyVirtualDisplay);
116 initDispatch(HWC2_FUNCTION_DUMP, &mDispatch.dump);
117 initDispatch(HWC2_FUNCTION_GET_ACTIVE_CONFIG, &mDispatch.getActiveConfig);
118 initDispatch(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
119 &mDispatch.getChangedCompositionTypes);
120 initDispatch(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
121 &mDispatch.getClientTargetSupport);
122 initDispatch(HWC2_FUNCTION_GET_COLOR_MODES, &mDispatch.getColorModes);
123 initDispatch(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
124 &mDispatch.getDisplayAttribute);
125 initDispatch(HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
126 &mDispatch.getDisplayConfigs);
127 initDispatch(HWC2_FUNCTION_GET_DISPLAY_NAME, &mDispatch.getDisplayName);
128 initDispatch(HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
129 &mDispatch.getDisplayRequests);
130 initDispatch(HWC2_FUNCTION_GET_DISPLAY_TYPE, &mDispatch.getDisplayType);
131 initDispatch(HWC2_FUNCTION_GET_DOZE_SUPPORT, &mDispatch.getDozeSupport);
132 initDispatch(HWC2_FUNCTION_GET_HDR_CAPABILITIES,
133 &mDispatch.getHdrCapabilities);
134 initDispatch(HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
135 &mDispatch.getMaxVirtualDisplayCount);
136 initDispatch(HWC2_FUNCTION_GET_RELEASE_FENCES,
137 &mDispatch.getReleaseFences);
138 initDispatch(HWC2_FUNCTION_PRESENT_DISPLAY, &mDispatch.presentDisplay);
139 initDispatch(HWC2_FUNCTION_REGISTER_CALLBACK,
140 &mDispatch.registerCallback);
141 initDispatch(HWC2_FUNCTION_SET_ACTIVE_CONFIG, &mDispatch.setActiveConfig);
142 initDispatch(HWC2_FUNCTION_SET_CLIENT_TARGET, &mDispatch.setClientTarget);
143 initDispatch(HWC2_FUNCTION_SET_COLOR_MODE, &mDispatch.setColorMode);
144 initDispatch(HWC2_FUNCTION_SET_COLOR_TRANSFORM,
145 &mDispatch.setColorTransform);
146 initDispatch(HWC2_FUNCTION_SET_CURSOR_POSITION,
147 &mDispatch.setCursorPosition);
148 initDispatch(HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
149 &mDispatch.setLayerBlendMode);
150 initDispatch(HWC2_FUNCTION_SET_LAYER_BUFFER, &mDispatch.setLayerBuffer);
151 initDispatch(HWC2_FUNCTION_SET_LAYER_COLOR, &mDispatch.setLayerColor);
152 initDispatch(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
153 &mDispatch.setLayerCompositionType);
154 initDispatch(HWC2_FUNCTION_SET_LAYER_DATASPACE,
155 &mDispatch.setLayerDataspace);
156 initDispatch(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
157 &mDispatch.setLayerDisplayFrame);
158 initDispatch(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
159 &mDispatch.setLayerPlaneAlpha);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800160
161 if (hasCapability(Capability::SIDEBAND_STREAM)) {
Chia-I Wue1768352016-12-19 12:56:54 +0800162 initDispatch(HWC2_FUNCTION_SET_LAYER_SIDEBAND_STREAM,
163 &mDispatch.setLayerSidebandStream);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800164 }
165
Chia-I Wue1768352016-12-19 12:56:54 +0800166 initDispatch(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
167 &mDispatch.setLayerSourceCrop);
168 initDispatch(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
169 &mDispatch.setLayerSurfaceDamage);
170 initDispatch(HWC2_FUNCTION_SET_LAYER_TRANSFORM,
171 &mDispatch.setLayerTransform);
172 initDispatch(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
173 &mDispatch.setLayerVisibleRegion);
174 initDispatch(HWC2_FUNCTION_SET_LAYER_Z_ORDER, &mDispatch.setLayerZOrder);
175 initDispatch(HWC2_FUNCTION_SET_OUTPUT_BUFFER, &mDispatch.setOutputBuffer);
176 initDispatch(HWC2_FUNCTION_SET_POWER_MODE, &mDispatch.setPowerMode);
177 initDispatch(HWC2_FUNCTION_SET_VSYNC_ENABLED, &mDispatch.setVsyncEnabled);
178 initDispatch(HWC2_FUNCTION_VALIDATE_DISPLAY, &mDispatch.validateDisplay);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800179}
180
181bool HwcHal::hasCapability(Capability capability) const
182{
183 return (mCapabilities.count(capability) > 0);
184}
185
186Return<void> HwcHal::getCapabilities(getCapabilities_cb hidl_cb)
187{
188 std::vector<Capability> caps(
189 mCapabilities.cbegin(), mCapabilities.cend());
190
191 hidl_vec<Capability> caps_reply;
192 caps_reply.setToExternal(caps.data(), caps.size());
193 hidl_cb(caps_reply);
194
195 return Void();
196}
197
198Return<void> HwcHal::dumpDebugInfo(dumpDebugInfo_cb hidl_cb)
199{
Chia-I Wue1768352016-12-19 12:56:54 +0800200 uint32_t len = 0;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800201 mDispatch.dump(mDevice, &len, nullptr);
202
203 std::vector<char> buf(len + 1);
204 mDispatch.dump(mDevice, &len, buf.data());
205 buf.resize(len + 1);
206 buf[len] = '\0';
207
208 hidl_string buf_reply;
209 buf_reply.setToExternal(buf.data(), len);
210 hidl_cb(buf_reply);
211
212 return Void();
213}
214
Chia-I Wubb61a722016-10-24 15:40:20 +0800215Return<void> HwcHal::createClient(createClient_cb hidl_cb)
216{
217 Error err = Error::NONE;
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -0500218 sp<ComposerClient> client;
Chia-I Wubb61a722016-10-24 15:40:20 +0800219
220 {
221 std::lock_guard<std::mutex> lock(mClientMutex);
222
223 // only one client is allowed
224 if (mClient == nullptr) {
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -0500225 client = new ComposerClient(*this);
226 client->initialize();
Chia-I Wubb61a722016-10-24 15:40:20 +0800227 mClient = client;
228 } else {
229 err = Error::NO_RESOURCES;
230 }
231 }
232
233 hidl_cb(err, client);
234
235 return Void();
236}
237
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -0500238sp<ComposerClient> HwcHal::getClient()
Chia-I Wubb61a722016-10-24 15:40:20 +0800239{
240 std::lock_guard<std::mutex> lock(mClientMutex);
241 return (mClient != nullptr) ? mClient.promote() : nullptr;
242}
243
244void HwcHal::removeClient()
245{
246 std::lock_guard<std::mutex> lock(mClientMutex);
247 mClient = nullptr;
248}
249
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800250void HwcHal::hotplugHook(hwc2_callback_data_t callbackData,
251 hwc2_display_t display, int32_t connected)
252{
253 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800254 auto client = hal->getClient();
255 if (client != nullptr) {
256 client->onHotplug(display,
257 static_cast<IComposerCallback::Connection>(connected));
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800258 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800259}
260
261void HwcHal::refreshHook(hwc2_callback_data_t callbackData,
262 hwc2_display_t display)
263{
264 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800265 auto client = hal->getClient();
266 if (client != nullptr) {
267 client->onRefresh(display);
268 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800269}
270
271void HwcHal::vsyncHook(hwc2_callback_data_t callbackData,
272 hwc2_display_t display, int64_t timestamp)
273{
274 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800275 auto client = hal->getClient();
276 if (client != nullptr) {
277 client->onVsync(display, timestamp);
278 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800279}
280
Chia-I Wubb61a722016-10-24 15:40:20 +0800281void HwcHal::enableCallback(bool enable)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800282{
Chia-I Wubb61a722016-10-24 15:40:20 +0800283 if (enable) {
284 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
285 reinterpret_cast<hwc2_function_pointer_t>(hotplugHook));
286 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
287 reinterpret_cast<hwc2_function_pointer_t>(refreshHook));
288 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
289 reinterpret_cast<hwc2_function_pointer_t>(vsyncHook));
290 } else {
291 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
292 nullptr);
293 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
294 nullptr);
295 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
296 nullptr);
297 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800298}
299
Chia-I Wubb61a722016-10-24 15:40:20 +0800300uint32_t HwcHal::getMaxVirtualDisplayCount()
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800301{
302 return mDispatch.getMaxVirtualDisplayCount(mDevice);
303}
304
Chia-I Wubb61a722016-10-24 15:40:20 +0800305Error HwcHal::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wue1768352016-12-19 12:56:54 +0800306 PixelFormat* format, Display* outDisplay)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800307{
Chia-I Wue1768352016-12-19 12:56:54 +0800308 int32_t hwc_format = static_cast<int32_t>(*format);
Chia-I Wubb61a722016-10-24 15:40:20 +0800309 int32_t err = mDispatch.createVirtualDisplay(mDevice, width, height,
Chia-I Wue1768352016-12-19 12:56:54 +0800310 &hwc_format, outDisplay);
311 *format = static_cast<PixelFormat>(hwc_format);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800312
Chia-I Wubb61a722016-10-24 15:40:20 +0800313 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800314}
315
Chia-I Wubb61a722016-10-24 15:40:20 +0800316Error HwcHal::destroyVirtualDisplay(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800317{
Chia-I Wubb61a722016-10-24 15:40:20 +0800318 int32_t err = mDispatch.destroyVirtualDisplay(mDevice, display);
319 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800320}
321
Chia-I Wue1768352016-12-19 12:56:54 +0800322Error HwcHal::createLayer(Display display, Layer* outLayer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800323{
Chia-I Wue1768352016-12-19 12:56:54 +0800324 int32_t err = mDispatch.createLayer(mDevice, display, outLayer);
Chia-I Wubb61a722016-10-24 15:40:20 +0800325 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800326}
327
Chia-I Wubb61a722016-10-24 15:40:20 +0800328Error HwcHal::destroyLayer(Display display, Layer layer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800329{
Chia-I Wubb61a722016-10-24 15:40:20 +0800330 int32_t err = mDispatch.destroyLayer(mDevice, display, layer);
331 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800332}
333
Chia-I Wue1768352016-12-19 12:56:54 +0800334Error HwcHal::getActiveConfig(Display display, Config* outConfig)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800335{
Chia-I Wue1768352016-12-19 12:56:54 +0800336 int32_t err = mDispatch.getActiveConfig(mDevice, display, outConfig);
Chia-I Wubb61a722016-10-24 15:40:20 +0800337 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800338}
339
Chia-I Wubb61a722016-10-24 15:40:20 +0800340Error HwcHal::getClientTargetSupport(Display display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800341 uint32_t width, uint32_t height,
342 PixelFormat format, Dataspace dataspace)
343{
Chia-I Wubb61a722016-10-24 15:40:20 +0800344 int32_t err = mDispatch.getClientTargetSupport(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800345 width, height, static_cast<int32_t>(format),
346 static_cast<int32_t>(dataspace));
Chia-I Wubb61a722016-10-24 15:40:20 +0800347 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800348}
349
Chia-I Wue1768352016-12-19 12:56:54 +0800350Error HwcHal::getColorModes(Display display, hidl_vec<ColorMode>* outModes)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800351{
352 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800353 int32_t err = mDispatch.getColorModes(mDevice, display, &count, nullptr);
354 if (err != HWC2_ERROR_NONE) {
355 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800356 }
357
Chia-I Wue1768352016-12-19 12:56:54 +0800358 outModes->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800359 err = mDispatch.getColorModes(mDevice, display, &count,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800360 reinterpret_cast<std::underlying_type<ColorMode>::type*>(
Chia-I Wue1768352016-12-19 12:56:54 +0800361 outModes->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800362 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800363 *outModes = hidl_vec<ColorMode>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800364 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800365 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800366
Chia-I Wubb61a722016-10-24 15:40:20 +0800367 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800368}
369
Chia-I Wubb61a722016-10-24 15:40:20 +0800370Error HwcHal::getDisplayAttribute(Display display, Config config,
Chia-I Wue1768352016-12-19 12:56:54 +0800371 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800372{
Chia-I Wubb61a722016-10-24 15:40:20 +0800373 int32_t err = mDispatch.getDisplayAttribute(mDevice, display, config,
Chia-I Wue1768352016-12-19 12:56:54 +0800374 static_cast<int32_t>(attribute), outValue);
Chia-I Wubb61a722016-10-24 15:40:20 +0800375 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800376}
377
Chia-I Wue1768352016-12-19 12:56:54 +0800378Error HwcHal::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800379{
380 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800381 int32_t err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800382 &count, nullptr);
Chia-I Wubb61a722016-10-24 15:40:20 +0800383 if (err != HWC2_ERROR_NONE) {
384 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800385 }
386
Chia-I Wue1768352016-12-19 12:56:54 +0800387 outConfigs->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800388 err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wue1768352016-12-19 12:56:54 +0800389 &count, outConfigs->data());
Chia-I Wubb61a722016-10-24 15:40:20 +0800390 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800391 *outConfigs = hidl_vec<Config>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800392 return static_cast<Error>(err);
393 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800394
Chia-I Wubb61a722016-10-24 15:40:20 +0800395 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800396}
397
Chia-I Wue1768352016-12-19 12:56:54 +0800398Error HwcHal::getDisplayName(Display display, hidl_string* outName)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800399{
400 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800401 int32_t err = mDispatch.getDisplayName(mDevice, display, &count, nullptr);
402 if (err != HWC2_ERROR_NONE) {
403 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800404 }
405
Chia-I Wubb61a722016-10-24 15:40:20 +0800406 std::vector<char> buf(count + 1);
407 err = mDispatch.getDisplayName(mDevice, display, &count, buf.data());
408 if (err != HWC2_ERROR_NONE) {
409 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800410 }
Chia-I Wubb61a722016-10-24 15:40:20 +0800411 buf.resize(count + 1);
412 buf[count] = '\0';
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800413
Chia-I Wue1768352016-12-19 12:56:54 +0800414 *outName = buf.data();
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800415
Chia-I Wubb61a722016-10-24 15:40:20 +0800416 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800417}
418
Chia-I Wue1768352016-12-19 12:56:54 +0800419Error HwcHal::getDisplayType(Display display,
420 IComposerClient::DisplayType* outType)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800421{
Chia-I Wubb61a722016-10-24 15:40:20 +0800422 int32_t hwc_type = HWC2_DISPLAY_TYPE_INVALID;
423 int32_t err = mDispatch.getDisplayType(mDevice, display, &hwc_type);
Chia-I Wue1768352016-12-19 12:56:54 +0800424 *outType = static_cast<IComposerClient::DisplayType>(hwc_type);
Chia-I Wubb61a722016-10-24 15:40:20 +0800425
426 return static_cast<Error>(err);
427}
428
Chia-I Wue1768352016-12-19 12:56:54 +0800429Error HwcHal::getDozeSupport(Display display, bool* outSupport)
Chia-I Wubb61a722016-10-24 15:40:20 +0800430{
431 int32_t hwc_support = 0;
432 int32_t err = mDispatch.getDozeSupport(mDevice, display, &hwc_support);
Chia-I Wue1768352016-12-19 12:56:54 +0800433 *outSupport = hwc_support;
Chia-I Wubb61a722016-10-24 15:40:20 +0800434
435 return static_cast<Error>(err);
436}
437
Chia-I Wue1768352016-12-19 12:56:54 +0800438Error HwcHal::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
439 float* outMaxLuminance, float* outMaxAverageLuminance,
440 float* outMinLuminance)
Chia-I Wubb61a722016-10-24 15:40:20 +0800441{
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800442 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800443 int32_t err = mDispatch.getHdrCapabilities(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800444 nullptr, outMaxLuminance, outMaxAverageLuminance,
445 outMinLuminance);
Chia-I Wubb61a722016-10-24 15:40:20 +0800446 if (err != HWC2_ERROR_NONE) {
447 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800448 }
449
Chia-I Wue1768352016-12-19 12:56:54 +0800450 outTypes->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800451 err = mDispatch.getHdrCapabilities(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800452 reinterpret_cast<std::underlying_type<Hdr>::type*>(
453 outTypes->data()), outMaxLuminance,
454 outMaxAverageLuminance, outMinLuminance);
Chia-I Wubb61a722016-10-24 15:40:20 +0800455 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800456 *outTypes = hidl_vec<Hdr>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800457 return static_cast<Error>(err);
458 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800459
Chia-I Wubb61a722016-10-24 15:40:20 +0800460 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800461}
462
Chia-I Wubb61a722016-10-24 15:40:20 +0800463Error HwcHal::setActiveConfig(Display display, Config config)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800464{
Chia-I Wubb61a722016-10-24 15:40:20 +0800465 int32_t err = mDispatch.setActiveConfig(mDevice, display, config);
466 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800467}
468
Chia-I Wubb61a722016-10-24 15:40:20 +0800469Error HwcHal::setColorMode(Display display, ColorMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800470{
Chia-I Wubb61a722016-10-24 15:40:20 +0800471 int32_t err = mDispatch.setColorMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800472 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800473 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800474}
475
Chia-I Wubb61a722016-10-24 15:40:20 +0800476Error HwcHal::setPowerMode(Display display, IComposerClient::PowerMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800477{
Chia-I Wubb61a722016-10-24 15:40:20 +0800478 int32_t err = mDispatch.setPowerMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800479 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800480 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800481}
482
Chia-I Wubb61a722016-10-24 15:40:20 +0800483Error HwcHal::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800484{
Chia-I Wubb61a722016-10-24 15:40:20 +0800485 int32_t err = mDispatch.setVsyncEnabled(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800486 static_cast<int32_t>(enabled));
Chia-I Wubb61a722016-10-24 15:40:20 +0800487 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800488}
489
Chia-I Wubb61a722016-10-24 15:40:20 +0800490Error HwcHal::setColorTransform(Display display, const float* matrix,
491 int32_t hint)
492{
493 int32_t err = mDispatch.setColorTransform(mDevice, display, matrix, hint);
494 return static_cast<Error>(err);
495}
496
497Error HwcHal::setClientTarget(Display display, buffer_handle_t target,
498 int32_t acquireFence, int32_t dataspace,
499 const std::vector<hwc_rect_t>& damage)
500{
501 hwc_region region = { damage.size(), damage.data() };
502 int32_t err = mDispatch.setClientTarget(mDevice, display, target,
503 acquireFence, dataspace, region);
504 return static_cast<Error>(err);
505}
506
507Error HwcHal::setOutputBuffer(Display display, buffer_handle_t buffer,
508 int32_t releaseFence)
509{
510 int32_t err = mDispatch.setOutputBuffer(mDevice, display, buffer,
511 releaseFence);
512 // unlike in setClientTarget, releaseFence is owned by us
513 if (err == HWC2_ERROR_NONE && releaseFence >= 0) {
514 close(releaseFence);
515 }
516
517 return static_cast<Error>(err);
518}
519
520Error HwcHal::validateDisplay(Display display,
Chia-I Wue1768352016-12-19 12:56:54 +0800521 std::vector<Layer>* outChangedLayers,
522 std::vector<IComposerClient::Composition>* outCompositionTypes,
523 uint32_t* outDisplayRequestMask,
524 std::vector<Layer>* outRequestedLayers,
525 std::vector<uint32_t>* outRequestMasks)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800526{
527 uint32_t types_count = 0;
528 uint32_t reqs_count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800529 int32_t err = mDispatch.validateDisplay(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800530 &types_count, &reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800531 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
532 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800533 }
534
Chia-I Wubb61a722016-10-24 15:40:20 +0800535 err = mDispatch.getChangedCompositionTypes(mDevice, display,
536 &types_count, nullptr, nullptr);
537 if (err != HWC2_ERROR_NONE) {
538 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800539 }
540
Chia-I Wue1768352016-12-19 12:56:54 +0800541 outChangedLayers->resize(types_count);
542 outCompositionTypes->resize(types_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800543 err = mDispatch.getChangedCompositionTypes(mDevice, display,
Chia-I Wue1768352016-12-19 12:56:54 +0800544 &types_count, outChangedLayers->data(),
Chia-I Wubb61a722016-10-24 15:40:20 +0800545 reinterpret_cast<
546 std::underlying_type<IComposerClient::Composition>::type*>(
Chia-I Wue1768352016-12-19 12:56:54 +0800547 outCompositionTypes->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800548 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800549 outChangedLayers->clear();
550 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800551 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800552 }
553
Chia-I Wubb61a722016-10-24 15:40:20 +0800554 int32_t display_reqs = 0;
555 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
556 &reqs_count, nullptr, nullptr);
557 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800558 outChangedLayers->clear();
559 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800560 return static_cast<Error>(err);
561 }
562
Chia-I Wue1768352016-12-19 12:56:54 +0800563 outRequestedLayers->resize(reqs_count);
564 outRequestMasks->resize(reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800565 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
Chia-I Wue1768352016-12-19 12:56:54 +0800566 &reqs_count, outRequestedLayers->data(),
567 reinterpret_cast<int32_t*>(outRequestMasks->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800568 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800569 outChangedLayers->clear();
570 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800571
Chia-I Wue1768352016-12-19 12:56:54 +0800572 outRequestedLayers->clear();
573 outRequestMasks->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800574 return static_cast<Error>(err);
575 }
576
Chia-I Wue1768352016-12-19 12:56:54 +0800577 *outDisplayRequestMask = display_reqs;
Chia-I Wubb61a722016-10-24 15:40:20 +0800578
579 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800580}
581
Chia-I Wubb61a722016-10-24 15:40:20 +0800582Error HwcHal::acceptDisplayChanges(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800583{
Chia-I Wubb61a722016-10-24 15:40:20 +0800584 int32_t err = mDispatch.acceptDisplayChanges(mDevice, display);
585 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800586}
587
Chia-I Wue1768352016-12-19 12:56:54 +0800588Error HwcHal::presentDisplay(Display display, int32_t* outPresentFence,
589 std::vector<Layer>* outLayers, std::vector<int32_t>* outReleaseFences)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800590{
Chia-I Wue1768352016-12-19 12:56:54 +0800591 *outPresentFence = -1;
592 int32_t err = mDispatch.presentDisplay(mDevice, display, outPresentFence);
Chia-I Wubb61a722016-10-24 15:40:20 +0800593 if (err != HWC2_ERROR_NONE) {
594 return static_cast<Error>(err);
595 }
596
597 uint32_t count = 0;
598 err = mDispatch.getReleaseFences(mDevice, display, &count,
599 nullptr, nullptr);
600 if (err != HWC2_ERROR_NONE) {
601 ALOGW("failed to get release fences");
602 return Error::NONE;
603 }
604
Chia-I Wue1768352016-12-19 12:56:54 +0800605 outLayers->resize(count);
606 outReleaseFences->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800607 err = mDispatch.getReleaseFences(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800608 outLayers->data(), outReleaseFences->data());
Chia-I Wubb61a722016-10-24 15:40:20 +0800609 if (err != HWC2_ERROR_NONE) {
610 ALOGW("failed to get release fences");
Chia-I Wue1768352016-12-19 12:56:54 +0800611 outLayers->clear();
612 outReleaseFences->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800613 return Error::NONE;
614 }
615
616 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800617}
618
Chia-I Wubb61a722016-10-24 15:40:20 +0800619Error HwcHal::setLayerCursorPosition(Display display, Layer layer,
620 int32_t x, int32_t y)
621{
622 int32_t err = mDispatch.setCursorPosition(mDevice, display, layer, x, y);
623 return static_cast<Error>(err);
624}
625
626Error HwcHal::setLayerBuffer(Display display, Layer layer,
627 buffer_handle_t buffer, int32_t acquireFence)
628{
629 int32_t err = mDispatch.setLayerBuffer(mDevice, display, layer,
630 buffer, acquireFence);
631 return static_cast<Error>(err);
632}
633
634Error HwcHal::setLayerSurfaceDamage(Display display, Layer layer,
635 const std::vector<hwc_rect_t>& damage)
636{
637 hwc_region region = { damage.size(), damage.data() };
638 int32_t err = mDispatch.setLayerSurfaceDamage(mDevice, display, layer,
639 region);
640 return static_cast<Error>(err);
641}
642
643Error HwcHal::setLayerBlendMode(Display display, Layer layer, int32_t mode)
644{
645 int32_t err = mDispatch.setLayerBlendMode(mDevice, display, layer, mode);
646 return static_cast<Error>(err);
647}
648
649Error HwcHal::setLayerColor(Display display, Layer layer,
650 IComposerClient::Color color)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800651{
652 hwc_color_t hwc_color{color.r, color.g, color.b, color.a};
Chia-I Wubb61a722016-10-24 15:40:20 +0800653 int32_t err = mDispatch.setLayerColor(mDevice, display, layer, hwc_color);
654 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800655}
656
Chia-I Wubb61a722016-10-24 15:40:20 +0800657Error HwcHal::setLayerCompositionType(Display display, Layer layer,
658 int32_t type)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800659{
Chia-I Wubb61a722016-10-24 15:40:20 +0800660 int32_t err = mDispatch.setLayerCompositionType(mDevice, display, layer,
661 type);
662 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800663}
664
Chia-I Wubb61a722016-10-24 15:40:20 +0800665Error HwcHal::setLayerDataspace(Display display, Layer layer,
666 int32_t dataspace)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800667{
Chia-I Wubb61a722016-10-24 15:40:20 +0800668 int32_t err = mDispatch.setLayerDataspace(mDevice, display, layer,
669 dataspace);
670 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800671}
672
Chia-I Wubb61a722016-10-24 15:40:20 +0800673Error HwcHal::setLayerDisplayFrame(Display display, Layer layer,
674 const hwc_rect_t& frame)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800675{
Chia-I Wubb61a722016-10-24 15:40:20 +0800676 int32_t err = mDispatch.setLayerDisplayFrame(mDevice, display, layer,
677 frame);
678 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800679}
680
Chia-I Wubb61a722016-10-24 15:40:20 +0800681Error HwcHal::setLayerPlaneAlpha(Display display, Layer layer, float alpha)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800682{
Chia-I Wubb61a722016-10-24 15:40:20 +0800683 int32_t err = mDispatch.setLayerPlaneAlpha(mDevice, display, layer,
684 alpha);
685 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800686}
687
Chia-I Wubb61a722016-10-24 15:40:20 +0800688Error HwcHal::setLayerSidebandStream(Display display, Layer layer,
689 buffer_handle_t stream)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800690{
Chia-I Wubb61a722016-10-24 15:40:20 +0800691 int32_t err = mDispatch.setLayerSidebandStream(mDevice, display, layer,
692 stream);
693 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800694}
695
Chia-I Wubb61a722016-10-24 15:40:20 +0800696Error HwcHal::setLayerSourceCrop(Display display, Layer layer,
697 const hwc_frect_t& crop)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800698{
Chia-I Wubb61a722016-10-24 15:40:20 +0800699 int32_t err = mDispatch.setLayerSourceCrop(mDevice, display, layer, crop);
700 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800701}
702
Chia-I Wubb61a722016-10-24 15:40:20 +0800703Error HwcHal::setLayerTransform(Display display, Layer layer,
704 int32_t transform)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800705{
Chia-I Wubb61a722016-10-24 15:40:20 +0800706 int32_t err = mDispatch.setLayerTransform(mDevice, display, layer,
707 transform);
708 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800709}
710
Chia-I Wubb61a722016-10-24 15:40:20 +0800711Error HwcHal::setLayerVisibleRegion(Display display, Layer layer,
712 const std::vector<hwc_rect_t>& visible)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800713{
Chia-I Wubb61a722016-10-24 15:40:20 +0800714 hwc_region_t region = { visible.size(), visible.data() };
715 int32_t err = mDispatch.setLayerVisibleRegion(mDevice, display, layer,
716 region);
717 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800718}
719
Chia-I Wubb61a722016-10-24 15:40:20 +0800720Error HwcHal::setLayerZOrder(Display display, Layer layer, uint32_t z)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800721{
Chia-I Wubb61a722016-10-24 15:40:20 +0800722 int32_t err = mDispatch.setLayerZOrder(mDevice, display, layer, z);
723 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800724}
725
726IComposer* HIDL_FETCH_IComposer(const char*)
727{
Chia-I Wue1768352016-12-19 12:56:54 +0800728 const hw_module_t* module = nullptr;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800729 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module);
730 if (err) {
731 ALOGE("failed to get hwcomposer module");
732 return nullptr;
733 }
734
735 return new HwcHal(module);
736}
737
738} // namespace implementation
739} // namespace V2_1
740} // namespace composer
741} // namespace graphics
742} // namespace hardware
743} // namespace android