blob: cf82967e4d7b83678462599c043d17bfd0f8d3b1 [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
Chia-I Wu7f8d3962016-09-28 21:04:23 +080019#include <type_traits>
Chia-I Wu7f8d3962016-09-28 21:04:23 +080020
Chia-I Wu7f8d3962016-09-28 21:04:23 +080021#include <log/log.h>
22
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -050023#include "ComposerClient.h"
Chia-I Wu7f8d3962016-09-28 21:04:23 +080024#include "Hwc.h"
25
26namespace android {
27namespace hardware {
28namespace graphics {
29namespace composer {
30namespace V2_1 {
31namespace implementation {
32
Chia-I Wu7f8d3962016-09-28 21:04:23 +080033HwcHal::HwcHal(const hw_module_t* module)
34 : mDevice(nullptr), mDispatch()
35{
Chia-I Wu7f8d3962016-09-28 21:04:23 +080036 int status = hwc2_open(module, &mDevice);
37 if (status) {
38 LOG_ALWAYS_FATAL("failed to open hwcomposer2 device: %s",
39 strerror(-status));
40 }
41
42 initCapabilities();
43 initDispatch();
44}
45
46HwcHal::~HwcHal()
47{
48 hwc2_close(mDevice);
Chia-I Wu7f8d3962016-09-28 21:04:23 +080049}
50
51void HwcHal::initCapabilities()
52{
53 uint32_t count = 0;
54 mDevice->getCapabilities(mDevice, &count, nullptr);
55
56 std::vector<Capability> caps(count);
57 mDevice->getCapabilities(mDevice, &count, reinterpret_cast<
58 std::underlying_type<Capability>::type*>(caps.data()));
59 caps.resize(count);
60
61 mCapabilities.insert(caps.cbegin(), caps.cend());
62}
63
64template<typename T>
Chia-I Wue1768352016-12-19 12:56:54 +080065void HwcHal::initDispatch(hwc2_function_descriptor_t desc, T* outPfn)
Chia-I Wu7f8d3962016-09-28 21:04:23 +080066{
67 auto pfn = mDevice->getFunction(mDevice, desc);
68 if (!pfn) {
69 LOG_ALWAYS_FATAL("failed to get hwcomposer2 function %d", desc);
70 }
71
Chia-I Wue1768352016-12-19 12:56:54 +080072 *outPfn = reinterpret_cast<T>(pfn);
Chia-I Wu7f8d3962016-09-28 21:04:23 +080073}
74
75void HwcHal::initDispatch()
76{
Chia-I Wue1768352016-12-19 12:56:54 +080077 initDispatch(HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES,
78 &mDispatch.acceptDisplayChanges);
79 initDispatch(HWC2_FUNCTION_CREATE_LAYER, &mDispatch.createLayer);
80 initDispatch(HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY,
81 &mDispatch.createVirtualDisplay);
82 initDispatch(HWC2_FUNCTION_DESTROY_LAYER, &mDispatch.destroyLayer);
83 initDispatch(HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY,
84 &mDispatch.destroyVirtualDisplay);
85 initDispatch(HWC2_FUNCTION_DUMP, &mDispatch.dump);
86 initDispatch(HWC2_FUNCTION_GET_ACTIVE_CONFIG, &mDispatch.getActiveConfig);
87 initDispatch(HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES,
88 &mDispatch.getChangedCompositionTypes);
89 initDispatch(HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT,
90 &mDispatch.getClientTargetSupport);
91 initDispatch(HWC2_FUNCTION_GET_COLOR_MODES, &mDispatch.getColorModes);
92 initDispatch(HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE,
93 &mDispatch.getDisplayAttribute);
94 initDispatch(HWC2_FUNCTION_GET_DISPLAY_CONFIGS,
95 &mDispatch.getDisplayConfigs);
96 initDispatch(HWC2_FUNCTION_GET_DISPLAY_NAME, &mDispatch.getDisplayName);
97 initDispatch(HWC2_FUNCTION_GET_DISPLAY_REQUESTS,
98 &mDispatch.getDisplayRequests);
99 initDispatch(HWC2_FUNCTION_GET_DISPLAY_TYPE, &mDispatch.getDisplayType);
100 initDispatch(HWC2_FUNCTION_GET_DOZE_SUPPORT, &mDispatch.getDozeSupport);
101 initDispatch(HWC2_FUNCTION_GET_HDR_CAPABILITIES,
102 &mDispatch.getHdrCapabilities);
103 initDispatch(HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT,
104 &mDispatch.getMaxVirtualDisplayCount);
105 initDispatch(HWC2_FUNCTION_GET_RELEASE_FENCES,
106 &mDispatch.getReleaseFences);
107 initDispatch(HWC2_FUNCTION_PRESENT_DISPLAY, &mDispatch.presentDisplay);
108 initDispatch(HWC2_FUNCTION_REGISTER_CALLBACK,
109 &mDispatch.registerCallback);
110 initDispatch(HWC2_FUNCTION_SET_ACTIVE_CONFIG, &mDispatch.setActiveConfig);
111 initDispatch(HWC2_FUNCTION_SET_CLIENT_TARGET, &mDispatch.setClientTarget);
112 initDispatch(HWC2_FUNCTION_SET_COLOR_MODE, &mDispatch.setColorMode);
113 initDispatch(HWC2_FUNCTION_SET_COLOR_TRANSFORM,
114 &mDispatch.setColorTransform);
115 initDispatch(HWC2_FUNCTION_SET_CURSOR_POSITION,
116 &mDispatch.setCursorPosition);
117 initDispatch(HWC2_FUNCTION_SET_LAYER_BLEND_MODE,
118 &mDispatch.setLayerBlendMode);
119 initDispatch(HWC2_FUNCTION_SET_LAYER_BUFFER, &mDispatch.setLayerBuffer);
120 initDispatch(HWC2_FUNCTION_SET_LAYER_COLOR, &mDispatch.setLayerColor);
121 initDispatch(HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE,
122 &mDispatch.setLayerCompositionType);
123 initDispatch(HWC2_FUNCTION_SET_LAYER_DATASPACE,
124 &mDispatch.setLayerDataspace);
125 initDispatch(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME,
126 &mDispatch.setLayerDisplayFrame);
127 initDispatch(HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA,
128 &mDispatch.setLayerPlaneAlpha);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800129
130 if (hasCapability(Capability::SIDEBAND_STREAM)) {
Chia-I Wue1768352016-12-19 12:56:54 +0800131 initDispatch(HWC2_FUNCTION_SET_LAYER_SIDEBAND_STREAM,
132 &mDispatch.setLayerSidebandStream);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800133 }
134
Chia-I Wue1768352016-12-19 12:56:54 +0800135 initDispatch(HWC2_FUNCTION_SET_LAYER_SOURCE_CROP,
136 &mDispatch.setLayerSourceCrop);
137 initDispatch(HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE,
138 &mDispatch.setLayerSurfaceDamage);
139 initDispatch(HWC2_FUNCTION_SET_LAYER_TRANSFORM,
140 &mDispatch.setLayerTransform);
141 initDispatch(HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION,
142 &mDispatch.setLayerVisibleRegion);
143 initDispatch(HWC2_FUNCTION_SET_LAYER_Z_ORDER, &mDispatch.setLayerZOrder);
144 initDispatch(HWC2_FUNCTION_SET_OUTPUT_BUFFER, &mDispatch.setOutputBuffer);
145 initDispatch(HWC2_FUNCTION_SET_POWER_MODE, &mDispatch.setPowerMode);
146 initDispatch(HWC2_FUNCTION_SET_VSYNC_ENABLED, &mDispatch.setVsyncEnabled);
147 initDispatch(HWC2_FUNCTION_VALIDATE_DISPLAY, &mDispatch.validateDisplay);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800148}
149
150bool HwcHal::hasCapability(Capability capability) const
151{
152 return (mCapabilities.count(capability) > 0);
153}
154
155Return<void> HwcHal::getCapabilities(getCapabilities_cb hidl_cb)
156{
157 std::vector<Capability> caps(
158 mCapabilities.cbegin(), mCapabilities.cend());
159
160 hidl_vec<Capability> caps_reply;
161 caps_reply.setToExternal(caps.data(), caps.size());
162 hidl_cb(caps_reply);
163
164 return Void();
165}
166
167Return<void> HwcHal::dumpDebugInfo(dumpDebugInfo_cb hidl_cb)
168{
Chia-I Wue1768352016-12-19 12:56:54 +0800169 uint32_t len = 0;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800170 mDispatch.dump(mDevice, &len, nullptr);
171
172 std::vector<char> buf(len + 1);
173 mDispatch.dump(mDevice, &len, buf.data());
174 buf.resize(len + 1);
175 buf[len] = '\0';
176
177 hidl_string buf_reply;
178 buf_reply.setToExternal(buf.data(), len);
179 hidl_cb(buf_reply);
180
181 return Void();
182}
183
Chia-I Wubb61a722016-10-24 15:40:20 +0800184Return<void> HwcHal::createClient(createClient_cb hidl_cb)
185{
186 Error err = Error::NONE;
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -0500187 sp<ComposerClient> client;
Chia-I Wubb61a722016-10-24 15:40:20 +0800188
189 {
190 std::lock_guard<std::mutex> lock(mClientMutex);
191
192 // only one client is allowed
193 if (mClient == nullptr) {
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -0500194 client = new ComposerClient(*this);
195 client->initialize();
Chia-I Wubb61a722016-10-24 15:40:20 +0800196 mClient = client;
197 } else {
198 err = Error::NO_RESOURCES;
199 }
200 }
201
202 hidl_cb(err, client);
203
204 return Void();
205}
206
Daniel Nicoara0a60e4b2017-01-09 12:51:06 -0500207sp<ComposerClient> HwcHal::getClient()
Chia-I Wubb61a722016-10-24 15:40:20 +0800208{
209 std::lock_guard<std::mutex> lock(mClientMutex);
210 return (mClient != nullptr) ? mClient.promote() : nullptr;
211}
212
213void HwcHal::removeClient()
214{
215 std::lock_guard<std::mutex> lock(mClientMutex);
216 mClient = nullptr;
217}
218
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800219void HwcHal::hotplugHook(hwc2_callback_data_t callbackData,
220 hwc2_display_t display, int32_t connected)
221{
222 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800223 auto client = hal->getClient();
224 if (client != nullptr) {
225 client->onHotplug(display,
226 static_cast<IComposerCallback::Connection>(connected));
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800227 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800228}
229
230void HwcHal::refreshHook(hwc2_callback_data_t callbackData,
231 hwc2_display_t display)
232{
233 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800234 auto client = hal->getClient();
235 if (client != nullptr) {
236 client->onRefresh(display);
237 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800238}
239
240void HwcHal::vsyncHook(hwc2_callback_data_t callbackData,
241 hwc2_display_t display, int64_t timestamp)
242{
243 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800244 auto client = hal->getClient();
245 if (client != nullptr) {
246 client->onVsync(display, timestamp);
247 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800248}
249
Chia-I Wubb61a722016-10-24 15:40:20 +0800250void HwcHal::enableCallback(bool enable)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800251{
Chia-I Wubb61a722016-10-24 15:40:20 +0800252 if (enable) {
253 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
254 reinterpret_cast<hwc2_function_pointer_t>(hotplugHook));
255 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
256 reinterpret_cast<hwc2_function_pointer_t>(refreshHook));
257 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
258 reinterpret_cast<hwc2_function_pointer_t>(vsyncHook));
259 } else {
260 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
261 nullptr);
262 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
263 nullptr);
264 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
265 nullptr);
266 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800267}
268
Chia-I Wubb61a722016-10-24 15:40:20 +0800269uint32_t HwcHal::getMaxVirtualDisplayCount()
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800270{
271 return mDispatch.getMaxVirtualDisplayCount(mDevice);
272}
273
Chia-I Wubb61a722016-10-24 15:40:20 +0800274Error HwcHal::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wue1768352016-12-19 12:56:54 +0800275 PixelFormat* format, Display* outDisplay)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800276{
Chia-I Wue1768352016-12-19 12:56:54 +0800277 int32_t hwc_format = static_cast<int32_t>(*format);
Chia-I Wubb61a722016-10-24 15:40:20 +0800278 int32_t err = mDispatch.createVirtualDisplay(mDevice, width, height,
Chia-I Wue1768352016-12-19 12:56:54 +0800279 &hwc_format, outDisplay);
280 *format = static_cast<PixelFormat>(hwc_format);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800281
Chia-I Wubb61a722016-10-24 15:40:20 +0800282 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800283}
284
Chia-I Wubb61a722016-10-24 15:40:20 +0800285Error HwcHal::destroyVirtualDisplay(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800286{
Chia-I Wubb61a722016-10-24 15:40:20 +0800287 int32_t err = mDispatch.destroyVirtualDisplay(mDevice, display);
288 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800289}
290
Chia-I Wue1768352016-12-19 12:56:54 +0800291Error HwcHal::createLayer(Display display, Layer* outLayer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800292{
Chia-I Wue1768352016-12-19 12:56:54 +0800293 int32_t err = mDispatch.createLayer(mDevice, display, outLayer);
Chia-I Wubb61a722016-10-24 15:40:20 +0800294 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800295}
296
Chia-I Wubb61a722016-10-24 15:40:20 +0800297Error HwcHal::destroyLayer(Display display, Layer layer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800298{
Chia-I Wubb61a722016-10-24 15:40:20 +0800299 int32_t err = mDispatch.destroyLayer(mDevice, display, layer);
300 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800301}
302
Chia-I Wue1768352016-12-19 12:56:54 +0800303Error HwcHal::getActiveConfig(Display display, Config* outConfig)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800304{
Chia-I Wue1768352016-12-19 12:56:54 +0800305 int32_t err = mDispatch.getActiveConfig(mDevice, display, outConfig);
Chia-I Wubb61a722016-10-24 15:40:20 +0800306 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800307}
308
Chia-I Wubb61a722016-10-24 15:40:20 +0800309Error HwcHal::getClientTargetSupport(Display display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800310 uint32_t width, uint32_t height,
311 PixelFormat format, Dataspace dataspace)
312{
Chia-I Wubb61a722016-10-24 15:40:20 +0800313 int32_t err = mDispatch.getClientTargetSupport(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800314 width, height, static_cast<int32_t>(format),
315 static_cast<int32_t>(dataspace));
Chia-I Wubb61a722016-10-24 15:40:20 +0800316 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800317}
318
Chia-I Wue1768352016-12-19 12:56:54 +0800319Error HwcHal::getColorModes(Display display, hidl_vec<ColorMode>* outModes)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800320{
321 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800322 int32_t err = mDispatch.getColorModes(mDevice, display, &count, nullptr);
323 if (err != HWC2_ERROR_NONE) {
324 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800325 }
326
Chia-I Wue1768352016-12-19 12:56:54 +0800327 outModes->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800328 err = mDispatch.getColorModes(mDevice, display, &count,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800329 reinterpret_cast<std::underlying_type<ColorMode>::type*>(
Chia-I Wue1768352016-12-19 12:56:54 +0800330 outModes->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800331 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800332 *outModes = hidl_vec<ColorMode>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800333 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800334 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800335
Chia-I Wubb61a722016-10-24 15:40:20 +0800336 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800337}
338
Chia-I Wubb61a722016-10-24 15:40:20 +0800339Error HwcHal::getDisplayAttribute(Display display, Config config,
Chia-I Wue1768352016-12-19 12:56:54 +0800340 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800341{
Chia-I Wubb61a722016-10-24 15:40:20 +0800342 int32_t err = mDispatch.getDisplayAttribute(mDevice, display, config,
Chia-I Wue1768352016-12-19 12:56:54 +0800343 static_cast<int32_t>(attribute), outValue);
Chia-I Wubb61a722016-10-24 15:40:20 +0800344 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800345}
346
Chia-I Wue1768352016-12-19 12:56:54 +0800347Error HwcHal::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800348{
349 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800350 int32_t err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800351 &count, nullptr);
Chia-I Wubb61a722016-10-24 15:40:20 +0800352 if (err != HWC2_ERROR_NONE) {
353 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800354 }
355
Chia-I Wue1768352016-12-19 12:56:54 +0800356 outConfigs->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800357 err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wue1768352016-12-19 12:56:54 +0800358 &count, outConfigs->data());
Chia-I Wubb61a722016-10-24 15:40:20 +0800359 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800360 *outConfigs = hidl_vec<Config>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800361 return static_cast<Error>(err);
362 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800363
Chia-I Wubb61a722016-10-24 15:40:20 +0800364 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800365}
366
Chia-I Wue1768352016-12-19 12:56:54 +0800367Error HwcHal::getDisplayName(Display display, hidl_string* outName)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800368{
369 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800370 int32_t err = mDispatch.getDisplayName(mDevice, display, &count, nullptr);
371 if (err != HWC2_ERROR_NONE) {
372 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800373 }
374
Chia-I Wubb61a722016-10-24 15:40:20 +0800375 std::vector<char> buf(count + 1);
376 err = mDispatch.getDisplayName(mDevice, display, &count, buf.data());
377 if (err != HWC2_ERROR_NONE) {
378 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800379 }
Chia-I Wubb61a722016-10-24 15:40:20 +0800380 buf.resize(count + 1);
381 buf[count] = '\0';
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800382
Chia-I Wue1768352016-12-19 12:56:54 +0800383 *outName = buf.data();
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800384
Chia-I Wubb61a722016-10-24 15:40:20 +0800385 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800386}
387
Chia-I Wue1768352016-12-19 12:56:54 +0800388Error HwcHal::getDisplayType(Display display,
389 IComposerClient::DisplayType* outType)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800390{
Chia-I Wubb61a722016-10-24 15:40:20 +0800391 int32_t hwc_type = HWC2_DISPLAY_TYPE_INVALID;
392 int32_t err = mDispatch.getDisplayType(mDevice, display, &hwc_type);
Chia-I Wue1768352016-12-19 12:56:54 +0800393 *outType = static_cast<IComposerClient::DisplayType>(hwc_type);
Chia-I Wubb61a722016-10-24 15:40:20 +0800394
395 return static_cast<Error>(err);
396}
397
Chia-I Wue1768352016-12-19 12:56:54 +0800398Error HwcHal::getDozeSupport(Display display, bool* outSupport)
Chia-I Wubb61a722016-10-24 15:40:20 +0800399{
400 int32_t hwc_support = 0;
401 int32_t err = mDispatch.getDozeSupport(mDevice, display, &hwc_support);
Chia-I Wue1768352016-12-19 12:56:54 +0800402 *outSupport = hwc_support;
Chia-I Wubb61a722016-10-24 15:40:20 +0800403
404 return static_cast<Error>(err);
405}
406
Chia-I Wue1768352016-12-19 12:56:54 +0800407Error HwcHal::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
408 float* outMaxLuminance, float* outMaxAverageLuminance,
409 float* outMinLuminance)
Chia-I Wubb61a722016-10-24 15:40:20 +0800410{
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800411 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800412 int32_t err = mDispatch.getHdrCapabilities(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800413 nullptr, outMaxLuminance, outMaxAverageLuminance,
414 outMinLuminance);
Chia-I Wubb61a722016-10-24 15:40:20 +0800415 if (err != HWC2_ERROR_NONE) {
416 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800417 }
418
Chia-I Wue1768352016-12-19 12:56:54 +0800419 outTypes->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800420 err = mDispatch.getHdrCapabilities(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800421 reinterpret_cast<std::underlying_type<Hdr>::type*>(
422 outTypes->data()), outMaxLuminance,
423 outMaxAverageLuminance, outMinLuminance);
Chia-I Wubb61a722016-10-24 15:40:20 +0800424 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800425 *outTypes = hidl_vec<Hdr>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800426 return static_cast<Error>(err);
427 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800428
Chia-I Wubb61a722016-10-24 15:40:20 +0800429 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800430}
431
Chia-I Wubb61a722016-10-24 15:40:20 +0800432Error HwcHal::setActiveConfig(Display display, Config config)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800433{
Chia-I Wubb61a722016-10-24 15:40:20 +0800434 int32_t err = mDispatch.setActiveConfig(mDevice, display, config);
435 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800436}
437
Chia-I Wubb61a722016-10-24 15:40:20 +0800438Error HwcHal::setColorMode(Display display, ColorMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800439{
Chia-I Wubb61a722016-10-24 15:40:20 +0800440 int32_t err = mDispatch.setColorMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800441 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800442 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800443}
444
Chia-I Wubb61a722016-10-24 15:40:20 +0800445Error HwcHal::setPowerMode(Display display, IComposerClient::PowerMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800446{
Chia-I Wubb61a722016-10-24 15:40:20 +0800447 int32_t err = mDispatch.setPowerMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800448 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800449 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800450}
451
Chia-I Wubb61a722016-10-24 15:40:20 +0800452Error HwcHal::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800453{
Chia-I Wubb61a722016-10-24 15:40:20 +0800454 int32_t err = mDispatch.setVsyncEnabled(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800455 static_cast<int32_t>(enabled));
Chia-I Wubb61a722016-10-24 15:40:20 +0800456 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800457}
458
Chia-I Wubb61a722016-10-24 15:40:20 +0800459Error HwcHal::setColorTransform(Display display, const float* matrix,
460 int32_t hint)
461{
462 int32_t err = mDispatch.setColorTransform(mDevice, display, matrix, hint);
463 return static_cast<Error>(err);
464}
465
466Error HwcHal::setClientTarget(Display display, buffer_handle_t target,
467 int32_t acquireFence, int32_t dataspace,
468 const std::vector<hwc_rect_t>& damage)
469{
470 hwc_region region = { damage.size(), damage.data() };
471 int32_t err = mDispatch.setClientTarget(mDevice, display, target,
472 acquireFence, dataspace, region);
473 return static_cast<Error>(err);
474}
475
476Error HwcHal::setOutputBuffer(Display display, buffer_handle_t buffer,
477 int32_t releaseFence)
478{
479 int32_t err = mDispatch.setOutputBuffer(mDevice, display, buffer,
480 releaseFence);
481 // unlike in setClientTarget, releaseFence is owned by us
482 if (err == HWC2_ERROR_NONE && releaseFence >= 0) {
483 close(releaseFence);
484 }
485
486 return static_cast<Error>(err);
487}
488
489Error HwcHal::validateDisplay(Display display,
Chia-I Wue1768352016-12-19 12:56:54 +0800490 std::vector<Layer>* outChangedLayers,
491 std::vector<IComposerClient::Composition>* outCompositionTypes,
492 uint32_t* outDisplayRequestMask,
493 std::vector<Layer>* outRequestedLayers,
494 std::vector<uint32_t>* outRequestMasks)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800495{
496 uint32_t types_count = 0;
497 uint32_t reqs_count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800498 int32_t err = mDispatch.validateDisplay(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800499 &types_count, &reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800500 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
501 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800502 }
503
Chia-I Wubb61a722016-10-24 15:40:20 +0800504 err = mDispatch.getChangedCompositionTypes(mDevice, display,
505 &types_count, nullptr, nullptr);
506 if (err != HWC2_ERROR_NONE) {
507 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800508 }
509
Chia-I Wue1768352016-12-19 12:56:54 +0800510 outChangedLayers->resize(types_count);
511 outCompositionTypes->resize(types_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800512 err = mDispatch.getChangedCompositionTypes(mDevice, display,
Chia-I Wue1768352016-12-19 12:56:54 +0800513 &types_count, outChangedLayers->data(),
Chia-I Wubb61a722016-10-24 15:40:20 +0800514 reinterpret_cast<
515 std::underlying_type<IComposerClient::Composition>::type*>(
Chia-I Wue1768352016-12-19 12:56:54 +0800516 outCompositionTypes->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800517 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800518 outChangedLayers->clear();
519 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800520 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800521 }
522
Chia-I Wubb61a722016-10-24 15:40:20 +0800523 int32_t display_reqs = 0;
524 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
525 &reqs_count, nullptr, nullptr);
526 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800527 outChangedLayers->clear();
528 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800529 return static_cast<Error>(err);
530 }
531
Chia-I Wue1768352016-12-19 12:56:54 +0800532 outRequestedLayers->resize(reqs_count);
533 outRequestMasks->resize(reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800534 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
Chia-I Wue1768352016-12-19 12:56:54 +0800535 &reqs_count, outRequestedLayers->data(),
536 reinterpret_cast<int32_t*>(outRequestMasks->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800537 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800538 outChangedLayers->clear();
539 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800540
Chia-I Wue1768352016-12-19 12:56:54 +0800541 outRequestedLayers->clear();
542 outRequestMasks->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800543 return static_cast<Error>(err);
544 }
545
Chia-I Wue1768352016-12-19 12:56:54 +0800546 *outDisplayRequestMask = display_reqs;
Chia-I Wubb61a722016-10-24 15:40:20 +0800547
548 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800549}
550
Chia-I Wubb61a722016-10-24 15:40:20 +0800551Error HwcHal::acceptDisplayChanges(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800552{
Chia-I Wubb61a722016-10-24 15:40:20 +0800553 int32_t err = mDispatch.acceptDisplayChanges(mDevice, display);
554 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800555}
556
Chia-I Wue1768352016-12-19 12:56:54 +0800557Error HwcHal::presentDisplay(Display display, int32_t* outPresentFence,
558 std::vector<Layer>* outLayers, std::vector<int32_t>* outReleaseFences)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800559{
Chia-I Wue1768352016-12-19 12:56:54 +0800560 *outPresentFence = -1;
561 int32_t err = mDispatch.presentDisplay(mDevice, display, outPresentFence);
Chia-I Wubb61a722016-10-24 15:40:20 +0800562 if (err != HWC2_ERROR_NONE) {
563 return static_cast<Error>(err);
564 }
565
566 uint32_t count = 0;
567 err = mDispatch.getReleaseFences(mDevice, display, &count,
568 nullptr, nullptr);
569 if (err != HWC2_ERROR_NONE) {
570 ALOGW("failed to get release fences");
571 return Error::NONE;
572 }
573
Chia-I Wue1768352016-12-19 12:56:54 +0800574 outLayers->resize(count);
575 outReleaseFences->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800576 err = mDispatch.getReleaseFences(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800577 outLayers->data(), outReleaseFences->data());
Chia-I Wubb61a722016-10-24 15:40:20 +0800578 if (err != HWC2_ERROR_NONE) {
579 ALOGW("failed to get release fences");
Chia-I Wue1768352016-12-19 12:56:54 +0800580 outLayers->clear();
581 outReleaseFences->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800582 return Error::NONE;
583 }
584
585 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800586}
587
Chia-I Wubb61a722016-10-24 15:40:20 +0800588Error HwcHal::setLayerCursorPosition(Display display, Layer layer,
589 int32_t x, int32_t y)
590{
591 int32_t err = mDispatch.setCursorPosition(mDevice, display, layer, x, y);
592 return static_cast<Error>(err);
593}
594
595Error HwcHal::setLayerBuffer(Display display, Layer layer,
596 buffer_handle_t buffer, int32_t acquireFence)
597{
598 int32_t err = mDispatch.setLayerBuffer(mDevice, display, layer,
599 buffer, acquireFence);
600 return static_cast<Error>(err);
601}
602
603Error HwcHal::setLayerSurfaceDamage(Display display, Layer layer,
604 const std::vector<hwc_rect_t>& damage)
605{
606 hwc_region region = { damage.size(), damage.data() };
607 int32_t err = mDispatch.setLayerSurfaceDamage(mDevice, display, layer,
608 region);
609 return static_cast<Error>(err);
610}
611
612Error HwcHal::setLayerBlendMode(Display display, Layer layer, int32_t mode)
613{
614 int32_t err = mDispatch.setLayerBlendMode(mDevice, display, layer, mode);
615 return static_cast<Error>(err);
616}
617
618Error HwcHal::setLayerColor(Display display, Layer layer,
619 IComposerClient::Color color)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800620{
621 hwc_color_t hwc_color{color.r, color.g, color.b, color.a};
Chia-I Wubb61a722016-10-24 15:40:20 +0800622 int32_t err = mDispatch.setLayerColor(mDevice, display, layer, hwc_color);
623 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800624}
625
Chia-I Wubb61a722016-10-24 15:40:20 +0800626Error HwcHal::setLayerCompositionType(Display display, Layer layer,
627 int32_t type)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800628{
Chia-I Wubb61a722016-10-24 15:40:20 +0800629 int32_t err = mDispatch.setLayerCompositionType(mDevice, display, layer,
630 type);
631 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800632}
633
Chia-I Wubb61a722016-10-24 15:40:20 +0800634Error HwcHal::setLayerDataspace(Display display, Layer layer,
635 int32_t dataspace)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800636{
Chia-I Wubb61a722016-10-24 15:40:20 +0800637 int32_t err = mDispatch.setLayerDataspace(mDevice, display, layer,
638 dataspace);
639 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800640}
641
Chia-I Wubb61a722016-10-24 15:40:20 +0800642Error HwcHal::setLayerDisplayFrame(Display display, Layer layer,
643 const hwc_rect_t& frame)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800644{
Chia-I Wubb61a722016-10-24 15:40:20 +0800645 int32_t err = mDispatch.setLayerDisplayFrame(mDevice, display, layer,
646 frame);
647 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800648}
649
Chia-I Wubb61a722016-10-24 15:40:20 +0800650Error HwcHal::setLayerPlaneAlpha(Display display, Layer layer, float alpha)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800651{
Chia-I Wubb61a722016-10-24 15:40:20 +0800652 int32_t err = mDispatch.setLayerPlaneAlpha(mDevice, display, layer,
653 alpha);
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::setLayerSidebandStream(Display display, Layer layer,
658 buffer_handle_t stream)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800659{
Chia-I Wubb61a722016-10-24 15:40:20 +0800660 int32_t err = mDispatch.setLayerSidebandStream(mDevice, display, layer,
661 stream);
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::setLayerSourceCrop(Display display, Layer layer,
666 const hwc_frect_t& crop)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800667{
Chia-I Wubb61a722016-10-24 15:40:20 +0800668 int32_t err = mDispatch.setLayerSourceCrop(mDevice, display, layer, crop);
669 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800670}
671
Chia-I Wubb61a722016-10-24 15:40:20 +0800672Error HwcHal::setLayerTransform(Display display, Layer layer,
673 int32_t transform)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800674{
Chia-I Wubb61a722016-10-24 15:40:20 +0800675 int32_t err = mDispatch.setLayerTransform(mDevice, display, layer,
676 transform);
677 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800678}
679
Chia-I Wubb61a722016-10-24 15:40:20 +0800680Error HwcHal::setLayerVisibleRegion(Display display, Layer layer,
681 const std::vector<hwc_rect_t>& visible)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800682{
Chia-I Wubb61a722016-10-24 15:40:20 +0800683 hwc_region_t region = { visible.size(), visible.data() };
684 int32_t err = mDispatch.setLayerVisibleRegion(mDevice, display, layer,
685 region);
686 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800687}
688
Chia-I Wubb61a722016-10-24 15:40:20 +0800689Error HwcHal::setLayerZOrder(Display display, Layer layer, uint32_t z)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800690{
Chia-I Wubb61a722016-10-24 15:40:20 +0800691 int32_t err = mDispatch.setLayerZOrder(mDevice, display, layer, z);
692 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800693}
694
695IComposer* HIDL_FETCH_IComposer(const char*)
696{
Chia-I Wue1768352016-12-19 12:56:54 +0800697 const hw_module_t* module = nullptr;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800698 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module);
699 if (err) {
700 ALOGE("failed to get hwcomposer module");
701 return nullptr;
702 }
703
704 return new HwcHal(module);
705}
706
707} // namespace implementation
708} // namespace V2_1
709} // namespace composer
710} // namespace graphics
711} // namespace hardware
712} // namespace android