blob: 4efb12b33009b66819b80db4289f35e115a9c8f0 [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>
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;
187 sp<HwcClient> client;
188
189 {
190 std::lock_guard<std::mutex> lock(mClientMutex);
191
192 // only one client is allowed
193 if (mClient == nullptr) {
194 client = new HwcClient(*this);
195 mClient = client;
196 } else {
197 err = Error::NO_RESOURCES;
198 }
199 }
200
201 hidl_cb(err, client);
202
203 return Void();
204}
205
206sp<HwcClient> HwcHal::getClient()
207{
208 std::lock_guard<std::mutex> lock(mClientMutex);
209 return (mClient != nullptr) ? mClient.promote() : nullptr;
210}
211
212void HwcHal::removeClient()
213{
214 std::lock_guard<std::mutex> lock(mClientMutex);
215 mClient = nullptr;
216}
217
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800218void HwcHal::hotplugHook(hwc2_callback_data_t callbackData,
219 hwc2_display_t display, int32_t connected)
220{
221 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800222 auto client = hal->getClient();
223 if (client != nullptr) {
224 client->onHotplug(display,
225 static_cast<IComposerCallback::Connection>(connected));
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800226 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800227}
228
229void HwcHal::refreshHook(hwc2_callback_data_t callbackData,
230 hwc2_display_t display)
231{
232 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800233 auto client = hal->getClient();
234 if (client != nullptr) {
235 client->onRefresh(display);
236 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800237}
238
239void HwcHal::vsyncHook(hwc2_callback_data_t callbackData,
240 hwc2_display_t display, int64_t timestamp)
241{
242 auto hal = reinterpret_cast<HwcHal*>(callbackData);
Chia-I Wubb61a722016-10-24 15:40:20 +0800243 auto client = hal->getClient();
244 if (client != nullptr) {
245 client->onVsync(display, timestamp);
246 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800247}
248
Chia-I Wubb61a722016-10-24 15:40:20 +0800249void HwcHal::enableCallback(bool enable)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800250{
Chia-I Wubb61a722016-10-24 15:40:20 +0800251 if (enable) {
252 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
253 reinterpret_cast<hwc2_function_pointer_t>(hotplugHook));
254 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
255 reinterpret_cast<hwc2_function_pointer_t>(refreshHook));
256 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
257 reinterpret_cast<hwc2_function_pointer_t>(vsyncHook));
258 } else {
259 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_HOTPLUG, this,
260 nullptr);
261 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_REFRESH, this,
262 nullptr);
263 mDispatch.registerCallback(mDevice, HWC2_CALLBACK_VSYNC, this,
264 nullptr);
265 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800266}
267
Chia-I Wubb61a722016-10-24 15:40:20 +0800268uint32_t HwcHal::getMaxVirtualDisplayCount()
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800269{
270 return mDispatch.getMaxVirtualDisplayCount(mDevice);
271}
272
Chia-I Wubb61a722016-10-24 15:40:20 +0800273Error HwcHal::createVirtualDisplay(uint32_t width, uint32_t height,
Chia-I Wue1768352016-12-19 12:56:54 +0800274 PixelFormat* format, Display* outDisplay)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800275{
Chia-I Wue1768352016-12-19 12:56:54 +0800276 int32_t hwc_format = static_cast<int32_t>(*format);
Chia-I Wubb61a722016-10-24 15:40:20 +0800277 int32_t err = mDispatch.createVirtualDisplay(mDevice, width, height,
Chia-I Wue1768352016-12-19 12:56:54 +0800278 &hwc_format, outDisplay);
279 *format = static_cast<PixelFormat>(hwc_format);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800280
Chia-I Wubb61a722016-10-24 15:40:20 +0800281 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800282}
283
Chia-I Wubb61a722016-10-24 15:40:20 +0800284Error HwcHal::destroyVirtualDisplay(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800285{
Chia-I Wubb61a722016-10-24 15:40:20 +0800286 int32_t err = mDispatch.destroyVirtualDisplay(mDevice, display);
287 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800288}
289
Chia-I Wue1768352016-12-19 12:56:54 +0800290Error HwcHal::createLayer(Display display, Layer* outLayer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800291{
Chia-I Wue1768352016-12-19 12:56:54 +0800292 int32_t err = mDispatch.createLayer(mDevice, display, outLayer);
Chia-I Wubb61a722016-10-24 15:40:20 +0800293 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800294}
295
Chia-I Wubb61a722016-10-24 15:40:20 +0800296Error HwcHal::destroyLayer(Display display, Layer layer)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800297{
Chia-I Wubb61a722016-10-24 15:40:20 +0800298 int32_t err = mDispatch.destroyLayer(mDevice, display, layer);
299 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800300}
301
Chia-I Wue1768352016-12-19 12:56:54 +0800302Error HwcHal::getActiveConfig(Display display, Config* outConfig)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800303{
Chia-I Wue1768352016-12-19 12:56:54 +0800304 int32_t err = mDispatch.getActiveConfig(mDevice, display, outConfig);
Chia-I Wubb61a722016-10-24 15:40:20 +0800305 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800306}
307
Chia-I Wubb61a722016-10-24 15:40:20 +0800308Error HwcHal::getClientTargetSupport(Display display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800309 uint32_t width, uint32_t height,
310 PixelFormat format, Dataspace dataspace)
311{
Chia-I Wubb61a722016-10-24 15:40:20 +0800312 int32_t err = mDispatch.getClientTargetSupport(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800313 width, height, static_cast<int32_t>(format),
314 static_cast<int32_t>(dataspace));
Chia-I Wubb61a722016-10-24 15:40:20 +0800315 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800316}
317
Chia-I Wue1768352016-12-19 12:56:54 +0800318Error HwcHal::getColorModes(Display display, hidl_vec<ColorMode>* outModes)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800319{
320 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800321 int32_t err = mDispatch.getColorModes(mDevice, display, &count, nullptr);
322 if (err != HWC2_ERROR_NONE) {
323 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800324 }
325
Chia-I Wue1768352016-12-19 12:56:54 +0800326 outModes->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800327 err = mDispatch.getColorModes(mDevice, display, &count,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800328 reinterpret_cast<std::underlying_type<ColorMode>::type*>(
Chia-I Wue1768352016-12-19 12:56:54 +0800329 outModes->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800330 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800331 *outModes = hidl_vec<ColorMode>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800332 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800333 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800334
Chia-I Wubb61a722016-10-24 15:40:20 +0800335 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800336}
337
Chia-I Wubb61a722016-10-24 15:40:20 +0800338Error HwcHal::getDisplayAttribute(Display display, Config config,
Chia-I Wue1768352016-12-19 12:56:54 +0800339 IComposerClient::Attribute attribute, int32_t* outValue)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800340{
Chia-I Wubb61a722016-10-24 15:40:20 +0800341 int32_t err = mDispatch.getDisplayAttribute(mDevice, display, config,
Chia-I Wue1768352016-12-19 12:56:54 +0800342 static_cast<int32_t>(attribute), outValue);
Chia-I Wubb61a722016-10-24 15:40:20 +0800343 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800344}
345
Chia-I Wue1768352016-12-19 12:56:54 +0800346Error HwcHal::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800347{
348 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800349 int32_t err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800350 &count, nullptr);
Chia-I Wubb61a722016-10-24 15:40:20 +0800351 if (err != HWC2_ERROR_NONE) {
352 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800353 }
354
Chia-I Wue1768352016-12-19 12:56:54 +0800355 outConfigs->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800356 err = mDispatch.getDisplayConfigs(mDevice, display,
Chia-I Wue1768352016-12-19 12:56:54 +0800357 &count, outConfigs->data());
Chia-I Wubb61a722016-10-24 15:40:20 +0800358 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800359 *outConfigs = hidl_vec<Config>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800360 return static_cast<Error>(err);
361 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800362
Chia-I Wubb61a722016-10-24 15:40:20 +0800363 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800364}
365
Chia-I Wue1768352016-12-19 12:56:54 +0800366Error HwcHal::getDisplayName(Display display, hidl_string* outName)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800367{
368 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800369 int32_t err = mDispatch.getDisplayName(mDevice, display, &count, nullptr);
370 if (err != HWC2_ERROR_NONE) {
371 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800372 }
373
Chia-I Wubb61a722016-10-24 15:40:20 +0800374 std::vector<char> buf(count + 1);
375 err = mDispatch.getDisplayName(mDevice, display, &count, buf.data());
376 if (err != HWC2_ERROR_NONE) {
377 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800378 }
Chia-I Wubb61a722016-10-24 15:40:20 +0800379 buf.resize(count + 1);
380 buf[count] = '\0';
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800381
Chia-I Wue1768352016-12-19 12:56:54 +0800382 *outName = buf.data();
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800383
Chia-I Wubb61a722016-10-24 15:40:20 +0800384 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800385}
386
Chia-I Wue1768352016-12-19 12:56:54 +0800387Error HwcHal::getDisplayType(Display display,
388 IComposerClient::DisplayType* outType)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800389{
Chia-I Wubb61a722016-10-24 15:40:20 +0800390 int32_t hwc_type = HWC2_DISPLAY_TYPE_INVALID;
391 int32_t err = mDispatch.getDisplayType(mDevice, display, &hwc_type);
Chia-I Wue1768352016-12-19 12:56:54 +0800392 *outType = static_cast<IComposerClient::DisplayType>(hwc_type);
Chia-I Wubb61a722016-10-24 15:40:20 +0800393
394 return static_cast<Error>(err);
395}
396
Chia-I Wue1768352016-12-19 12:56:54 +0800397Error HwcHal::getDozeSupport(Display display, bool* outSupport)
Chia-I Wubb61a722016-10-24 15:40:20 +0800398{
399 int32_t hwc_support = 0;
400 int32_t err = mDispatch.getDozeSupport(mDevice, display, &hwc_support);
Chia-I Wue1768352016-12-19 12:56:54 +0800401 *outSupport = hwc_support;
Chia-I Wubb61a722016-10-24 15:40:20 +0800402
403 return static_cast<Error>(err);
404}
405
Chia-I Wue1768352016-12-19 12:56:54 +0800406Error HwcHal::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
407 float* outMaxLuminance, float* outMaxAverageLuminance,
408 float* outMinLuminance)
Chia-I Wubb61a722016-10-24 15:40:20 +0800409{
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800410 uint32_t count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800411 int32_t err = mDispatch.getHdrCapabilities(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800412 nullptr, outMaxLuminance, outMaxAverageLuminance,
413 outMinLuminance);
Chia-I Wubb61a722016-10-24 15:40:20 +0800414 if (err != HWC2_ERROR_NONE) {
415 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800416 }
417
Chia-I Wue1768352016-12-19 12:56:54 +0800418 outTypes->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800419 err = mDispatch.getHdrCapabilities(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800420 reinterpret_cast<std::underlying_type<Hdr>::type*>(
421 outTypes->data()), outMaxLuminance,
422 outMaxAverageLuminance, outMinLuminance);
Chia-I Wubb61a722016-10-24 15:40:20 +0800423 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800424 *outTypes = hidl_vec<Hdr>();
Chia-I Wubb61a722016-10-24 15:40:20 +0800425 return static_cast<Error>(err);
426 }
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800427
Chia-I Wubb61a722016-10-24 15:40:20 +0800428 return Error::NONE;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800429}
430
Chia-I Wubb61a722016-10-24 15:40:20 +0800431Error HwcHal::setActiveConfig(Display display, Config config)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800432{
Chia-I Wubb61a722016-10-24 15:40:20 +0800433 int32_t err = mDispatch.setActiveConfig(mDevice, display, config);
434 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800435}
436
Chia-I Wubb61a722016-10-24 15:40:20 +0800437Error HwcHal::setColorMode(Display display, ColorMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800438{
Chia-I Wubb61a722016-10-24 15:40:20 +0800439 int32_t err = mDispatch.setColorMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800440 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800441 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800442}
443
Chia-I Wubb61a722016-10-24 15:40:20 +0800444Error HwcHal::setPowerMode(Display display, IComposerClient::PowerMode mode)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800445{
Chia-I Wubb61a722016-10-24 15:40:20 +0800446 int32_t err = mDispatch.setPowerMode(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800447 static_cast<int32_t>(mode));
Chia-I Wubb61a722016-10-24 15:40:20 +0800448 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800449}
450
Chia-I Wubb61a722016-10-24 15:40:20 +0800451Error HwcHal::setVsyncEnabled(Display display, IComposerClient::Vsync enabled)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800452{
Chia-I Wubb61a722016-10-24 15:40:20 +0800453 int32_t err = mDispatch.setVsyncEnabled(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800454 static_cast<int32_t>(enabled));
Chia-I Wubb61a722016-10-24 15:40:20 +0800455 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800456}
457
Chia-I Wubb61a722016-10-24 15:40:20 +0800458Error HwcHal::setColorTransform(Display display, const float* matrix,
459 int32_t hint)
460{
461 int32_t err = mDispatch.setColorTransform(mDevice, display, matrix, hint);
462 return static_cast<Error>(err);
463}
464
465Error HwcHal::setClientTarget(Display display, buffer_handle_t target,
466 int32_t acquireFence, int32_t dataspace,
467 const std::vector<hwc_rect_t>& damage)
468{
469 hwc_region region = { damage.size(), damage.data() };
470 int32_t err = mDispatch.setClientTarget(mDevice, display, target,
471 acquireFence, dataspace, region);
472 return static_cast<Error>(err);
473}
474
475Error HwcHal::setOutputBuffer(Display display, buffer_handle_t buffer,
476 int32_t releaseFence)
477{
478 int32_t err = mDispatch.setOutputBuffer(mDevice, display, buffer,
479 releaseFence);
480 // unlike in setClientTarget, releaseFence is owned by us
481 if (err == HWC2_ERROR_NONE && releaseFence >= 0) {
482 close(releaseFence);
483 }
484
485 return static_cast<Error>(err);
486}
487
488Error HwcHal::validateDisplay(Display display,
Chia-I Wue1768352016-12-19 12:56:54 +0800489 std::vector<Layer>* outChangedLayers,
490 std::vector<IComposerClient::Composition>* outCompositionTypes,
491 uint32_t* outDisplayRequestMask,
492 std::vector<Layer>* outRequestedLayers,
493 std::vector<uint32_t>* outRequestMasks)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800494{
495 uint32_t types_count = 0;
496 uint32_t reqs_count = 0;
Chia-I Wubb61a722016-10-24 15:40:20 +0800497 int32_t err = mDispatch.validateDisplay(mDevice, display,
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800498 &types_count, &reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800499 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) {
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 err = mDispatch.getChangedCompositionTypes(mDevice, display,
504 &types_count, nullptr, nullptr);
505 if (err != HWC2_ERROR_NONE) {
506 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800507 }
508
Chia-I Wue1768352016-12-19 12:56:54 +0800509 outChangedLayers->resize(types_count);
510 outCompositionTypes->resize(types_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800511 err = mDispatch.getChangedCompositionTypes(mDevice, display,
Chia-I Wue1768352016-12-19 12:56:54 +0800512 &types_count, outChangedLayers->data(),
Chia-I Wubb61a722016-10-24 15:40:20 +0800513 reinterpret_cast<
514 std::underlying_type<IComposerClient::Composition>::type*>(
Chia-I Wue1768352016-12-19 12:56:54 +0800515 outCompositionTypes->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800516 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800517 outChangedLayers->clear();
518 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800519 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800520 }
521
Chia-I Wubb61a722016-10-24 15:40:20 +0800522 int32_t display_reqs = 0;
523 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
524 &reqs_count, nullptr, nullptr);
525 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800526 outChangedLayers->clear();
527 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800528 return static_cast<Error>(err);
529 }
530
Chia-I Wue1768352016-12-19 12:56:54 +0800531 outRequestedLayers->resize(reqs_count);
532 outRequestMasks->resize(reqs_count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800533 err = mDispatch.getDisplayRequests(mDevice, display, &display_reqs,
Chia-I Wue1768352016-12-19 12:56:54 +0800534 &reqs_count, outRequestedLayers->data(),
535 reinterpret_cast<int32_t*>(outRequestMasks->data()));
Chia-I Wubb61a722016-10-24 15:40:20 +0800536 if (err != HWC2_ERROR_NONE) {
Chia-I Wue1768352016-12-19 12:56:54 +0800537 outChangedLayers->clear();
538 outCompositionTypes->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800539
Chia-I Wue1768352016-12-19 12:56:54 +0800540 outRequestedLayers->clear();
541 outRequestMasks->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800542 return static_cast<Error>(err);
543 }
544
Chia-I Wue1768352016-12-19 12:56:54 +0800545 *outDisplayRequestMask = display_reqs;
Chia-I Wubb61a722016-10-24 15:40:20 +0800546
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::acceptDisplayChanges(Display display)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800551{
Chia-I Wubb61a722016-10-24 15:40:20 +0800552 int32_t err = mDispatch.acceptDisplayChanges(mDevice, display);
553 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800554}
555
Chia-I Wue1768352016-12-19 12:56:54 +0800556Error HwcHal::presentDisplay(Display display, int32_t* outPresentFence,
557 std::vector<Layer>* outLayers, std::vector<int32_t>* outReleaseFences)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800558{
Chia-I Wue1768352016-12-19 12:56:54 +0800559 *outPresentFence = -1;
560 int32_t err = mDispatch.presentDisplay(mDevice, display, outPresentFence);
Chia-I Wubb61a722016-10-24 15:40:20 +0800561 if (err != HWC2_ERROR_NONE) {
562 return static_cast<Error>(err);
563 }
564
565 uint32_t count = 0;
566 err = mDispatch.getReleaseFences(mDevice, display, &count,
567 nullptr, nullptr);
568 if (err != HWC2_ERROR_NONE) {
569 ALOGW("failed to get release fences");
570 return Error::NONE;
571 }
572
Chia-I Wue1768352016-12-19 12:56:54 +0800573 outLayers->resize(count);
574 outReleaseFences->resize(count);
Chia-I Wubb61a722016-10-24 15:40:20 +0800575 err = mDispatch.getReleaseFences(mDevice, display, &count,
Chia-I Wue1768352016-12-19 12:56:54 +0800576 outLayers->data(), outReleaseFences->data());
Chia-I Wubb61a722016-10-24 15:40:20 +0800577 if (err != HWC2_ERROR_NONE) {
578 ALOGW("failed to get release fences");
Chia-I Wue1768352016-12-19 12:56:54 +0800579 outLayers->clear();
580 outReleaseFences->clear();
Chia-I Wubb61a722016-10-24 15:40:20 +0800581 return Error::NONE;
582 }
583
584 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800585}
586
Chia-I Wubb61a722016-10-24 15:40:20 +0800587Error HwcHal::setLayerCursorPosition(Display display, Layer layer,
588 int32_t x, int32_t y)
589{
590 int32_t err = mDispatch.setCursorPosition(mDevice, display, layer, x, y);
591 return static_cast<Error>(err);
592}
593
594Error HwcHal::setLayerBuffer(Display display, Layer layer,
595 buffer_handle_t buffer, int32_t acquireFence)
596{
597 int32_t err = mDispatch.setLayerBuffer(mDevice, display, layer,
598 buffer, acquireFence);
599 return static_cast<Error>(err);
600}
601
602Error HwcHal::setLayerSurfaceDamage(Display display, Layer layer,
603 const std::vector<hwc_rect_t>& damage)
604{
605 hwc_region region = { damage.size(), damage.data() };
606 int32_t err = mDispatch.setLayerSurfaceDamage(mDevice, display, layer,
607 region);
608 return static_cast<Error>(err);
609}
610
611Error HwcHal::setLayerBlendMode(Display display, Layer layer, int32_t mode)
612{
613 int32_t err = mDispatch.setLayerBlendMode(mDevice, display, layer, mode);
614 return static_cast<Error>(err);
615}
616
617Error HwcHal::setLayerColor(Display display, Layer layer,
618 IComposerClient::Color color)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800619{
620 hwc_color_t hwc_color{color.r, color.g, color.b, color.a};
Chia-I Wubb61a722016-10-24 15:40:20 +0800621 int32_t err = mDispatch.setLayerColor(mDevice, display, layer, hwc_color);
622 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800623}
624
Chia-I Wubb61a722016-10-24 15:40:20 +0800625Error HwcHal::setLayerCompositionType(Display display, Layer layer,
626 int32_t type)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800627{
Chia-I Wubb61a722016-10-24 15:40:20 +0800628 int32_t err = mDispatch.setLayerCompositionType(mDevice, display, layer,
629 type);
630 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800631}
632
Chia-I Wubb61a722016-10-24 15:40:20 +0800633Error HwcHal::setLayerDataspace(Display display, Layer layer,
634 int32_t dataspace)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800635{
Chia-I Wubb61a722016-10-24 15:40:20 +0800636 int32_t err = mDispatch.setLayerDataspace(mDevice, display, layer,
637 dataspace);
638 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800639}
640
Chia-I Wubb61a722016-10-24 15:40:20 +0800641Error HwcHal::setLayerDisplayFrame(Display display, Layer layer,
642 const hwc_rect_t& frame)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800643{
Chia-I Wubb61a722016-10-24 15:40:20 +0800644 int32_t err = mDispatch.setLayerDisplayFrame(mDevice, display, layer,
645 frame);
646 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800647}
648
Chia-I Wubb61a722016-10-24 15:40:20 +0800649Error HwcHal::setLayerPlaneAlpha(Display display, Layer layer, float alpha)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800650{
Chia-I Wubb61a722016-10-24 15:40:20 +0800651 int32_t err = mDispatch.setLayerPlaneAlpha(mDevice, display, layer,
652 alpha);
653 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800654}
655
Chia-I Wubb61a722016-10-24 15:40:20 +0800656Error HwcHal::setLayerSidebandStream(Display display, Layer layer,
657 buffer_handle_t stream)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800658{
Chia-I Wubb61a722016-10-24 15:40:20 +0800659 int32_t err = mDispatch.setLayerSidebandStream(mDevice, display, layer,
660 stream);
661 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800662}
663
Chia-I Wubb61a722016-10-24 15:40:20 +0800664Error HwcHal::setLayerSourceCrop(Display display, Layer layer,
665 const hwc_frect_t& crop)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800666{
Chia-I Wubb61a722016-10-24 15:40:20 +0800667 int32_t err = mDispatch.setLayerSourceCrop(mDevice, display, layer, crop);
668 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800669}
670
Chia-I Wubb61a722016-10-24 15:40:20 +0800671Error HwcHal::setLayerTransform(Display display, Layer layer,
672 int32_t transform)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800673{
Chia-I Wubb61a722016-10-24 15:40:20 +0800674 int32_t err = mDispatch.setLayerTransform(mDevice, display, layer,
675 transform);
676 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800677}
678
Chia-I Wubb61a722016-10-24 15:40:20 +0800679Error HwcHal::setLayerVisibleRegion(Display display, Layer layer,
680 const std::vector<hwc_rect_t>& visible)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800681{
Chia-I Wubb61a722016-10-24 15:40:20 +0800682 hwc_region_t region = { visible.size(), visible.data() };
683 int32_t err = mDispatch.setLayerVisibleRegion(mDevice, display, layer,
684 region);
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::setLayerZOrder(Display display, Layer layer, uint32_t z)
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800689{
Chia-I Wubb61a722016-10-24 15:40:20 +0800690 int32_t err = mDispatch.setLayerZOrder(mDevice, display, layer, z);
691 return static_cast<Error>(err);
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800692}
693
694IComposer* HIDL_FETCH_IComposer(const char*)
695{
Chia-I Wue1768352016-12-19 12:56:54 +0800696 const hw_module_t* module = nullptr;
Chia-I Wu7f8d3962016-09-28 21:04:23 +0800697 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &module);
698 if (err) {
699 ALOGE("failed to get hwcomposer module");
700 return nullptr;
701 }
702
703 return new HwcHal(module);
704}
705
706} // namespace implementation
707} // namespace V2_1
708} // namespace composer
709} // namespace graphics
710} // namespace hardware
711} // namespace android