blob: d14de6f9cf57e63ccc8729b839978bc28852a367 [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
23#include "Hwc.h"
Chia-I Wubb61a722016-10-24 15:40:20 +080024#include "HwcClient.h"
Chia-I Wu7f8d3962016-09-28 21:04:23 +080025
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>
65void HwcHal::initDispatch(T& func, hwc2_function_descriptor_t desc)
66{
67 auto pfn = mDevice->getFunction(mDevice, desc);
68 if (!pfn) {
69 LOG_ALWAYS_FATAL("failed to get hwcomposer2 function %d", desc);
70 }
71
72 func = reinterpret_cast<T>(pfn);
73}
74
75void HwcHal::initDispatch()
76{
77 initDispatch(mDispatch.acceptDisplayChanges,
78 HWC2_FUNCTION_ACCEPT_DISPLAY_CHANGES);
79 initDispatch(mDispatch.createLayer, HWC2_FUNCTION_CREATE_LAYER);
80 initDispatch(mDispatch.createVirtualDisplay,
81 HWC2_FUNCTION_CREATE_VIRTUAL_DISPLAY);
82 initDispatch(mDispatch.destroyLayer, HWC2_FUNCTION_DESTROY_LAYER);
83 initDispatch(mDispatch.destroyVirtualDisplay,
84 HWC2_FUNCTION_DESTROY_VIRTUAL_DISPLAY);
85 initDispatch(mDispatch.dump, HWC2_FUNCTION_DUMP);
86 initDispatch(mDispatch.getActiveConfig, HWC2_FUNCTION_GET_ACTIVE_CONFIG);
87 initDispatch(mDispatch.getChangedCompositionTypes,
88 HWC2_FUNCTION_GET_CHANGED_COMPOSITION_TYPES);
89 initDispatch(mDispatch.getClientTargetSupport,
90 HWC2_FUNCTION_GET_CLIENT_TARGET_SUPPORT);
91 initDispatch(mDispatch.getColorModes, HWC2_FUNCTION_GET_COLOR_MODES);
92 initDispatch(mDispatch.getDisplayAttribute,
93 HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE);
94 initDispatch(mDispatch.getDisplayConfigs,
95 HWC2_FUNCTION_GET_DISPLAY_CONFIGS);
96 initDispatch(mDispatch.getDisplayName, HWC2_FUNCTION_GET_DISPLAY_NAME);
97 initDispatch(mDispatch.getDisplayRequests,
98 HWC2_FUNCTION_GET_DISPLAY_REQUESTS);
99 initDispatch(mDispatch.getDisplayType, HWC2_FUNCTION_GET_DISPLAY_TYPE);
100 initDispatch(mDispatch.getDozeSupport, HWC2_FUNCTION_GET_DOZE_SUPPORT);
101 initDispatch(mDispatch.getHdrCapabilities,
102 HWC2_FUNCTION_GET_HDR_CAPABILITIES);
103 initDispatch(mDispatch.getMaxVirtualDisplayCount,
104 HWC2_FUNCTION_GET_MAX_VIRTUAL_DISPLAY_COUNT);
105 initDispatch(mDispatch.getReleaseFences,
106 HWC2_FUNCTION_GET_RELEASE_FENCES);
107 initDispatch(mDispatch.presentDisplay, HWC2_FUNCTION_PRESENT_DISPLAY);
108 initDispatch(mDispatch.registerCallback, HWC2_FUNCTION_REGISTER_CALLBACK);
109 initDispatch(mDispatch.setActiveConfig, HWC2_FUNCTION_SET_ACTIVE_CONFIG);
110 initDispatch(mDispatch.setClientTarget, HWC2_FUNCTION_SET_CLIENT_TARGET);
111 initDispatch(mDispatch.setColorMode, HWC2_FUNCTION_SET_COLOR_MODE);
112 initDispatch(mDispatch.setColorTransform,
113 HWC2_FUNCTION_SET_COLOR_TRANSFORM);
114 initDispatch(mDispatch.setCursorPosition,
115 HWC2_FUNCTION_SET_CURSOR_POSITION);
116 initDispatch(mDispatch.setLayerBlendMode,
117 HWC2_FUNCTION_SET_LAYER_BLEND_MODE);
118 initDispatch(mDispatch.setLayerBuffer, HWC2_FUNCTION_SET_LAYER_BUFFER);
119 initDispatch(mDispatch.setLayerColor, HWC2_FUNCTION_SET_LAYER_COLOR);
120 initDispatch(mDispatch.setLayerCompositionType,
121 HWC2_FUNCTION_SET_LAYER_COMPOSITION_TYPE);
122 initDispatch(mDispatch.setLayerDataspace,
123 HWC2_FUNCTION_SET_LAYER_DATASPACE);
124 initDispatch(mDispatch.setLayerDisplayFrame,
125 HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME);
126 initDispatch(mDispatch.setLayerPlaneAlpha,
127 HWC2_FUNCTION_SET_LAYER_PLANE_ALPHA);
128
129 if (hasCapability(Capability::SIDEBAND_STREAM)) {
130 initDispatch(mDispatch.setLayerSidebandStream,
131 HWC2_FUNCTION_SET_LAYER_SIDEBAND_STREAM);
132 }
133
134 initDispatch(mDispatch.setLayerSourceCrop,
135 HWC2_FUNCTION_SET_LAYER_SOURCE_CROP);
136 initDispatch(mDispatch.setLayerSurfaceDamage,
137 HWC2_FUNCTION_SET_LAYER_SURFACE_DAMAGE);
138 initDispatch(mDispatch.setLayerTransform,
139 HWC2_FUNCTION_SET_LAYER_TRANSFORM);
140 initDispatch(mDispatch.setLayerVisibleRegion,
141 HWC2_FUNCTION_SET_LAYER_VISIBLE_REGION);
142 initDispatch(mDispatch.setLayerZOrder, HWC2_FUNCTION_SET_LAYER_Z_ORDER);
143 initDispatch(mDispatch.setOutputBuffer, HWC2_FUNCTION_SET_OUTPUT_BUFFER);
144 initDispatch(mDispatch.setPowerMode, HWC2_FUNCTION_SET_POWER_MODE);
145 initDispatch(mDispatch.setVsyncEnabled, HWC2_FUNCTION_SET_VSYNC_ENABLED);
146 initDispatch(mDispatch.validateDisplay, HWC2_FUNCTION_VALIDATE_DISPLAY);
147}
148
149bool HwcHal::hasCapability(Capability capability) const
150{
151 return (mCapabilities.count(capability) > 0);
152}
153
154Return<void> HwcHal::getCapabilities(getCapabilities_cb hidl_cb)
155{
156 std::vector<Capability> caps(
157 mCapabilities.cbegin(), mCapabilities.cend());
158
159 hidl_vec<Capability> caps_reply;
160 caps_reply.setToExternal(caps.data(), caps.size());
161 hidl_cb(caps_reply);
162
163 return Void();
164}
165
166Return<void> HwcHal::dumpDebugInfo(dumpDebugInfo_cb hidl_cb)
167{
168 uint32_t len;
169 mDispatch.dump(mDevice, &len, nullptr);
170
171 std::vector<char> buf(len + 1);
172 mDispatch.dump(mDevice, &len, buf.data());
173 buf.resize(len + 1);
174 buf[len] = '\0';
175
176 hidl_string buf_reply;
177 buf_reply.setToExternal(buf.data(), len);
178 hidl_cb(buf_reply);
179
180 return Void();
181}
182
Chia-I Wubb61a722016-10-24 15:40:20 +0800183Return<void> HwcHal::createClient(createClient_cb hidl_cb)
184{
185 Error err = Error::NONE;
186 sp<HwcClient> client;
187
188 {
189 std::lock_guard<std::mutex> lock(mClientMutex);
190
191 // only one client is allowed
192 if (mClient == nullptr) {
193 client = new HwcClient(*this);
194 mClient = client;
195 } else {
196 err = Error::NO_RESOURCES;
197 }
198 }
199
200 hidl_cb(err, client);
201
202 return Void();
203}
204
205sp<HwcClient> HwcHal::getClient()
206{
207 std::lock_guard<std::mutex> lock(mClientMutex);
208 return (mClient != nullptr) ? mClient.promote() : nullptr;
209}
210
211void HwcHal::removeClient()
212{
213 std::lock_guard<std::mutex> lock(mClientMutex);
214 mClient = nullptr;
215}
216
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800217void HwcHal::hotplugHook(hwc2_callback_data_t callbackData,
218 hwc2_display_t display, int32_t connected)
219{
220 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800221 auto client = hal->getClient();
222 if (client != nullptr) {
223 client->onHotplug(display,
224 static_cast<IComposerCallback::Connection>(connected));
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800225 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800226}
227
228void HwcHal::refreshHook(hwc2_callback_data_t callbackData,
229 hwc2_display_t display)
230{
231 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800232 auto client = hal->getClient();
233 if (client != nullptr) {
234 client->onRefresh(display);
235 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800236}
237
238void HwcHal::vsyncHook(hwc2_callback_data_t callbackData,
239 hwc2_display_t display, int64_t timestamp)
240{
241 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800242 auto client = hal->getClient();
243 if (client != nullptr) {
244 client->onVsync(display, timestamp);
245 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800246}
247
Chia-I Wubb61a722016-10-24 15:40:20 +0800248void HwcHal::enableCallback(bool enable)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800249{
Chia-I Wubb61a722016-10-24 15:40:20 +0800250 if (enable) {
251 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
252 reinterpret_cast<hwc2_function_pointer_t>(hotplugHook));
253 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
254 reinterpret_cast<hwc2_function_pointer_t>(refreshHook));
255 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
256 reinterpret_cast<hwc2_function_pointer_t>(vsyncHook));
257 } else {
258 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
259 nullptr);
260 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
261 nullptr);
262 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
263 nullptr);
264 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800265}
266
Chia-I Wubb61a722016-10-24 15:40:20 +0800267uint32_t HwcHal::getMaxVirtualDisplayCount()
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800268{
269 return mDispatch.getMaxVirtualDisplayCount(mDevice);
270}
271
Chia-I Wubb61a722016-10-24 15:40:20 +0800272Error HwcHal::createVirtualDisplay(uint32_t width, uint32_t height,
273 PixelFormat& format, Display& display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800274{
Chia-I Wubb61a722016-10-24 15:40:20 +0800275 int32_t hwc_format = static_cast<int32_t>(format);
276 int32_t err = mDispatch.createVirtualDisplay(mDevice, width, height,
277 &hwc_format, &display);
278 format = static_cast<PixelFormat>(hwc_format);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800279
Chia-I Wubb61a722016-10-24 15:40:20 +0800280 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800281}
282
Chia-I Wubb61a722016-10-24 15:40:20 +0800283Error HwcHal::destroyVirtualDisplay(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800284{
Chia-I Wubb61a722016-10-24 15:40:20 +0800285 int32_t err = mDispatch.destroyVirtualDisplay(mDevice, display);
286 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800287}
288
Chia-I Wubb61a722016-10-24 15:40:20 +0800289Error HwcHal::createLayer(Display display, Layer& layer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800290{
Chia-I Wubb61a722016-10-24 15:40:20 +0800291 int32_t err = mDispatch.createLayer(mDevice, display, &layer);
292 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800293}
294
Chia-I Wubb61a722016-10-24 15:40:20 +0800295Error HwcHal::destroyLayer(Display display, Layer layer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800296{
Chia-I Wubb61a722016-10-24 15:40:20 +0800297 int32_t err = mDispatch.destroyLayer(mDevice, display, layer);
298 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800299}
300
Chia-I Wubb61a722016-10-24 15:40:20 +0800301Error HwcHal::getActiveConfig(Display display, Config& config)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800302{
Chia-I Wubb61a722016-10-24 15:40:20 +0800303 int32_t err = mDispatch.getActiveConfig(mDevice, display, &config);
304 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800305}
306
Chia-I Wubb61a722016-10-24 15:40:20 +0800307Error HwcHal::getClientTargetSupport(Display display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800308 uint32_t width, uint32_t height,
309 PixelFormat format, Dataspace dataspace)
310{
Chia-I Wubb61a722016-10-24 15:40:20 +0800311 int32_t err = mDispatch.getClientTargetSupport(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800312 width, height, static_cast<int32_t>(format),
313 static_cast<int32_t>(dataspace));
Chia-I Wubb61a722016-10-24 15:40:20 +0800314 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800315}
316
Chia-I Wubb61a722016-10-24 15:40:20 +0800317Error HwcHal::getColorModes(Display display, hidl_vec<ColorMode>& modes)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800318{
319 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800320 int32_t err = mDispatch.getColorModes(mDevice, display, &count, nullptr);
321 if (err != HWC2_ERROR_NONE) {
322 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800323 }
324
Chia-I Wubb61a722016-10-24 15:40:20 +0800325 modes.resize(count);
326 err = mDispatch.getColorModes(mDevice, display, &count,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800327 reinterpret_cast<std::underlying_type<ColorMode>::type*>(
328 modes.data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800329 if (err != HWC2_ERROR_NONE) {
330 modes = hidl_vec<ColorMode>();
331 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800332 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800333
Chia-I Wubb61a722016-10-24 15:40:20 +0800334 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800335}
336
Chia-I Wubb61a722016-10-24 15:40:20 +0800337Error HwcHal::getDisplayAttribute(Display display, Config config,
338 IComposerClient::Attribute attribute, int32_t& value)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800339{
Chia-I Wubb61a722016-10-24 15:40:20 +0800340 int32_t err = mDispatch.getDisplayAttribute(mDevice, display, config,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800341 static_cast<int32_t>(attribute), &value);
Chia-I Wubb61a722016-10-24 15:40:20 +0800342 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800343}
344
Chia-I Wubb61a722016-10-24 15:40:20 +0800345Error HwcHal::getDisplayConfigs(Display display, hidl_vec<Config>& configs)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800346{
347 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800348 int32_t err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800349 &count, nullptr);
Chia-I Wubb61a722016-10-24 15:40:20 +0800350 if (err != HWC2_ERROR_NONE) {
351 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800352 }
353
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800354 configs.resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800355 err = mDispatch.getDisplayConfigs(mDevice, display,
356 &count, configs.data());
357 if (err != HWC2_ERROR_NONE) {
358 configs = hidl_vec<Config>();
359 return static_cast<Error>(err);
360 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800361
Chia-I Wubb61a722016-10-24 15:40:20 +0800362 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800363}
364
Chia-I Wubb61a722016-10-24 15:40:20 +0800365Error HwcHal::getDisplayName(Display display, hidl_string& name)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800366{
367 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800368 int32_t err = mDispatch.getDisplayName(mDevice, display, &count, nullptr);
369 if (err != HWC2_ERROR_NONE) {
370 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800371 }
372
Chia-I Wubb61a722016-10-24 15:40:20 +0800373 std::vector<char> buf(count + 1);
374 err = mDispatch.getDisplayName(mDevice, display, &count, buf.data());
375 if (err != HWC2_ERROR_NONE) {
376 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800377 }
Chia-I Wubb61a722016-10-24 15:40:20 +0800378 buf.resize(count + 1);
379 buf[count] = '\0';
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800380
Chia-I Wubb61a722016-10-24 15:40:20 +0800381 name = buf.data();
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800382
Chia-I Wubb61a722016-10-24 15:40:20 +0800383 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800384}
385
Chia-I Wubb61a722016-10-24 15:40:20 +0800386Error HwcHal::getDisplayType(Display display, IComposerClient::DisplayType& type)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800387{
Chia-I Wubb61a722016-10-24 15:40:20 +0800388 int32_t hwc_type = HWC2_DISPLAY_TYPE_INVALID;
389 int32_t err = mDispatch.getDisplayType(mDevice, display, &hwc_type);
390 type = static_cast<IComposerClient::DisplayType>(hwc_type);
391
392 return static_cast<Error>(err);
393}
394
395Error HwcHal::getDozeSupport(Display display, bool& support)
396{
397 int32_t hwc_support = 0;
398 int32_t err = mDispatch.getDozeSupport(mDevice, display, &hwc_support);
399 support = hwc_support;
400
401 return static_cast<Error>(err);
402}
403
404Error HwcHal::getHdrCapabilities(Display display, hidl_vec<Hdr>& types,
405 float& maxLuminance, float& maxAverageLuminance, float& minLuminance)
406{
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800407 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800408 int32_t err = mDispatch.getHdrCapabilities(mDevice, display, &count,
409 nullptr, &maxLuminance, &maxAverageLuminance, &minLuminance);
410 if (err != HWC2_ERROR_NONE) {
411 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800412 }
413
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800414 types.resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800415 err = mDispatch.getHdrCapabilities(mDevice, display, &count,
416 reinterpret_cast<std::underlying_type<Hdr>::type*>(types.data()),
417 &maxLuminance, &maxAverageLuminance, &minLuminance);
418 if (err != HWC2_ERROR_NONE) {
419 return static_cast<Error>(err);
420 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800421
Chia-I Wubb61a722016-10-24 15:40:20 +0800422 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800423}
424
Chia-I Wubb61a722016-10-24 15:40:20 +0800425Error HwcHal::setActiveConfig(Display display, Config config)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800426{
Chia-I Wubb61a722016-10-24 15:40:20 +0800427 int32_t err = mDispatch.setActiveConfig(mDevice, display, config);
428 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800429}
430
Chia-I Wubb61a722016-10-24 15:40:20 +0800431Error HwcHal::setColorMode(Display display, ColorMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800432{
Chia-I Wubb61a722016-10-24 15:40:20 +0800433 int32_t err = mDispatch.setColorMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800434 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800435 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::setPowerMode(Display display, IComposerClient::PowerMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800439{
Chia-I Wubb61a722016-10-24 15:40:20 +0800440 int32_t err = mDispatch.setPowerMode(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::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800446{
Chia-I Wubb61a722016-10-24 15:40:20 +0800447 int32_t err = mDispatch.setVsyncEnabled(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800448 static_cast<int32_t>(enabled));
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::setColorTransform(Display display, const float* matrix,
453 int32_t hint)
454{
455 int32_t err = mDispatch.setColorTransform(mDevice, display, matrix, hint);
456 return static_cast<Error>(err);
457}
458
459Error HwcHal::setClientTarget(Display display, buffer_handle_t target,
460 int32_t acquireFence, int32_t dataspace,
461 const std::vector<hwc_rect_t>& damage)
462{
463 hwc_region region = { damage.size(), damage.data() };
464 int32_t err = mDispatch.setClientTarget(mDevice, display, target,
465 acquireFence, dataspace, region);
466 return static_cast<Error>(err);
467}
468
469Error HwcHal::setOutputBuffer(Display display, buffer_handle_t buffer,
470 int32_t releaseFence)
471{
472 int32_t err = mDispatch.setOutputBuffer(mDevice, display, buffer,
473 releaseFence);
474 // unlike in setClientTarget, releaseFence is owned by us
475 if (err == HWC2_ERROR_NONE && releaseFence >= 0) {
476 close(releaseFence);
477 }
478
479 return static_cast<Error>(err);
480}
481
482Error HwcHal::validateDisplay(Display display,
483 std::vector<Layer>& changedLayers,
484 std::vector<IComposerClient::Composition>& compositionTypes,
485 uint32_t& displayRequestMask,
486 std::vector<Layer>& requestedLayers,
487 std::vector<uint32_t>& requestMasks)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800488{
489 uint32_t types_count = 0;
490 uint32_t reqs_count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800491 int32_t err = mDispatch.validateDisplay(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800492 &types_count, &reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800493 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
494 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800495 }
496
Chia-I Wubb61a722016-10-24 15:40:20 +0800497 err = mDispatch.getChangedCompositionTypes(mDevice, display,
498 &types_count, nullptr, nullptr);
499 if (err != HWC2_ERROR_NONE) {
500 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800501 }
502
Chia-I Wubb61a722016-10-24 15:40:20 +0800503 changedLayers.resize(types_count);
504 compositionTypes.resize(types_count);
505 err = mDispatch.getChangedCompositionTypes(mDevice, display,
506 &types_count, changedLayers.data(),
507 reinterpret_cast<
508 std::underlying_type<IComposerClient::Composition>::type*>(
509 compositionTypes.data()));
510 if (err != HWC2_ERROR_NONE) {
511 changedLayers.clear();
512 compositionTypes.clear();
513 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800514 }
515
Chia-I Wubb61a722016-10-24 15:40:20 +0800516 int32_t display_reqs = 0;
517 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
518 &reqs_count, nullptr, nullptr);
519 if (err != HWC2_ERROR_NONE) {
520 changedLayers.clear();
521 compositionTypes.clear();
522 return static_cast<Error>(err);
523 }
524
525 requestedLayers.resize(reqs_count);
526 requestMasks.resize(reqs_count);
527 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
528 &reqs_count, requestedLayers.data(),
529 reinterpret_cast<int32_t*>(requestMasks.data()));
530 if (err != HWC2_ERROR_NONE) {
531 changedLayers.clear();
532 compositionTypes.clear();
533
534 requestedLayers.clear();
535 requestMasks.clear();
536 return static_cast<Error>(err);
537 }
538
539 displayRequestMask = display_reqs;
540
541 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800542}
543
Chia-I Wubb61a722016-10-24 15:40:20 +0800544Error HwcHal::acceptDisplayChanges(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800545{
Chia-I Wubb61a722016-10-24 15:40:20 +0800546 int32_t err = mDispatch.acceptDisplayChanges(mDevice, display);
547 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800548}
549
Chia-I Wubb61a722016-10-24 15:40:20 +0800550Error HwcHal::presentDisplay(Display display, int32_t& presentFence,
551 std::vector<Layer>& layers, std::vector<int32_t>& releaseFences)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800552{
Chia-I Wubb61a722016-10-24 15:40:20 +0800553 presentFence = -1;
554 int32_t err = mDispatch.presentDisplay(mDevice, display, &presentFence);
555 if (err != HWC2_ERROR_NONE) {
556 return static_cast<Error>(err);
557 }
558
559 uint32_t count = 0;
560 err = mDispatch.getReleaseFences(mDevice, display, &count,
561 nullptr, nullptr);
562 if (err != HWC2_ERROR_NONE) {
563 ALOGW("failed to get release fences");
564 return Error::NONE;
565 }
566
567 layers.resize(count);
568 releaseFences.resize(count);
569 err = mDispatch.getReleaseFences(mDevice, display, &count,
570 layers.data(), releaseFences.data());
571 if (err != HWC2_ERROR_NONE) {
572 ALOGW("failed to get release fences");
573 layers.clear();
574 releaseFences.clear();
575 return Error::NONE;
576 }
577
578 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800579}
580
Chia-I Wubb61a722016-10-24 15:40:20 +0800581Error HwcHal::setLayerCursorPosition(Display display, Layer layer,
582 int32_t x, int32_t y)
583{
584 int32_t err = mDispatch.setCursorPosition(mDevice, display, layer, x, y);
585 return static_cast<Error>(err);
586}
587
588Error HwcHal::setLayerBuffer(Display display, Layer layer,
589 buffer_handle_t buffer, int32_t acquireFence)
590{
591 int32_t err = mDispatch.setLayerBuffer(mDevice, display, layer,
592 buffer, acquireFence);
593 return static_cast<Error>(err);
594}
595
596Error HwcHal::setLayerSurfaceDamage(Display display, Layer layer,
597 const std::vector<hwc_rect_t>& damage)
598{
599 hwc_region region = { damage.size(), damage.data() };
600 int32_t err = mDispatch.setLayerSurfaceDamage(mDevice, display, layer,
601 region);
602 return static_cast<Error>(err);
603}
604
605Error HwcHal::setLayerBlendMode(Display display, Layer layer, int32_t mode)
606{
607 int32_t err = mDispatch.setLayerBlendMode(mDevice, display, layer, mode);
608 return static_cast<Error>(err);
609}
610
611Error HwcHal::setLayerColor(Display display, Layer layer,
612 IComposerClient::Color color)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800613{
614 hwc_color_t hwc_color{color.r, color.g, color.b, color.a};
Chia-I Wubb61a722016-10-24 15:40:20 +0800615 int32_t err = mDispatch.setLayerColor(mDevice, display, layer, hwc_color);
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::setLayerCompositionType(Display display, Layer layer,
620 int32_t type)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800621{
Chia-I Wubb61a722016-10-24 15:40:20 +0800622 int32_t err = mDispatch.setLayerCompositionType(mDevice, display, layer,
623 type);
624 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800625}
626
Chia-I Wubb61a722016-10-24 15:40:20 +0800627Error HwcHal::setLayerDataspace(Display display, Layer layer,
628 int32_t dataspace)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800629{
Chia-I Wubb61a722016-10-24 15:40:20 +0800630 int32_t err = mDispatch.setLayerDataspace(mDevice, display, layer,
631 dataspace);
632 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800633}
634
Chia-I Wubb61a722016-10-24 15:40:20 +0800635Error HwcHal::setLayerDisplayFrame(Display display, Layer layer,
636 const hwc_rect_t& frame)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800637{
Chia-I Wubb61a722016-10-24 15:40:20 +0800638 int32_t err = mDispatch.setLayerDisplayFrame(mDevice, display, layer,
639 frame);
640 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800641}
642
Chia-I Wubb61a722016-10-24 15:40:20 +0800643Error HwcHal::setLayerPlaneAlpha(Display display, Layer layer, float alpha)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800644{
Chia-I Wubb61a722016-10-24 15:40:20 +0800645 int32_t err = mDispatch.setLayerPlaneAlpha(mDevice, display, layer,
646 alpha);
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::setLayerSidebandStream(Display display, Layer layer,
651 buffer_handle_t stream)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800652{
Chia-I Wubb61a722016-10-24 15:40:20 +0800653 int32_t err = mDispatch.setLayerSidebandStream(mDevice, display, layer,
654 stream);
655 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800656}
657
Chia-I Wubb61a722016-10-24 15:40:20 +0800658Error HwcHal::setLayerSourceCrop(Display display, Layer layer,
659 const hwc_frect_t& crop)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800660{
Chia-I Wubb61a722016-10-24 15:40:20 +0800661 int32_t err = mDispatch.setLayerSourceCrop(mDevice, display, layer, crop);
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::setLayerTransform(Display display, Layer layer,
666 int32_t transform)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800667{
Chia-I Wubb61a722016-10-24 15:40:20 +0800668 int32_t err = mDispatch.setLayerTransform(mDevice, display, layer,
669 transform);
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::setLayerVisibleRegion(Display display, Layer layer,
674 const std::vector<hwc_rect_t>& visible)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800675{
Chia-I Wubb61a722016-10-24 15:40:20 +0800676 hwc_region_t region = { visible.size(), visible.data() };
677 int32_t err = mDispatch.setLayerVisibleRegion(mDevice, display, layer,
678 region);
679 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800680}
681
Chia-I Wubb61a722016-10-24 15:40:20 +0800682Error HwcHal::setLayerZOrder(Display display, Layer layer, uint32_t z)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800683{
Chia-I Wubb61a722016-10-24 15:40:20 +0800684 int32_t err = mDispatch.setLayerZOrder(mDevice, display, layer, z);
685 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800686}
687
688IComposer* HIDL_FETCH_IComposer(const char*)
689{
690 const hw_module_t* module;
691 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module);
692 if (err) {
693 ALOGE("failed to get hwcomposer module");
694 return nullptr;
695 }
696
697 return new HwcHal(module);
698}
699
700} // namespace implementation
701} // namespace V2_1
702} // namespace composer
703} // namespace graphics
704} // namespace hardware
705} // namespace android