blob: 4345b30c0084b49a4d168967ec57f73d30dc0f64 [file] [log] [blame]
Naseer Ahmedb92e73f2016-03-12 02:03:48 -05001/*
Saurabh Shah7d476ed2016-06-27 16:40:58 -07002 * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
Naseer Ahmedb92e73f2016-03-12 02:03:48 -05003 * Not a Contribution.
4 *
5 * Copyright 2015 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#include "hwc_layers.h"
Naseer Ahmed42752212017-01-27 17:32:21 -050021#ifndef USE_GRALLOC1
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050022#include <gr.h>
Naseer Ahmed42752212017-01-27 17:32:21 -050023#endif
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050024#include <utils/debug.h>
25#include <cmath>
26
27#define __CLASS__ "HWCLayer"
28
29namespace sdm {
30
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050031std::atomic<hwc2_layer_t> HWCLayer::next_id_(1);
32
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070033DisplayError SetCSC(const MetaData_t *meta_data, ColorMetaData *color_metadata) {
34 if (meta_data->operation & COLOR_METADATA) {
35#ifdef USE_COLOR_METADATA
36 *color_metadata = meta_data->color;
37#endif
38 } else if (meta_data->operation & UPDATE_COLOR_SPACE) {
39 ColorSpace_t csc = meta_data->colorSpace;
40 color_metadata->range = Range_Limited;
41
42 if (csc == ITU_R_601_FR || csc == ITU_R_2020_FR) {
43 color_metadata->range = Range_Full;
44 }
45
46 switch (csc) {
47 case ITU_R_601:
48 case ITU_R_601_FR:
49 // video and display driver uses 601_525
50 color_metadata->colorPrimaries = ColorPrimaries_BT601_6_525;
51 break;
52 case ITU_R_709:
53 color_metadata->colorPrimaries = ColorPrimaries_BT709_5;
54 break;
55 case ITU_R_2020:
56 case ITU_R_2020_FR:
57 color_metadata->colorPrimaries = ColorPrimaries_BT2020;
58 break;
59 default:
60 DLOGE("Unsupported CSC: %d", csc);
61 return kErrorNotSupported;
62 }
63 }
64
65 return kErrorNone;
66}
67
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050068// Layer operations
Naseer Ahmed42752212017-01-27 17:32:21 -050069HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator)
70 : id_(next_id_++), display_id_(display_id), buffer_allocator_(buf_allocator) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050071 layer_ = new Layer();
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050072 // Fences are deferred, so the first time this layer is presented, return -1
73 // TODO(user): Verify that fences are properly obtained on suspend/resume
74 release_fences_.push(-1);
75}
76
77HWCLayer::~HWCLayer() {
78 // Close any fences left for this layer
79 while (!release_fences_.empty()) {
80 close(release_fences_.front());
81 release_fences_.pop();
82 }
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -040083 close(ion_fd_);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050084 if (layer_) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050085 delete layer_;
86 }
87}
88
89HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence) {
90 if (!buffer) {
91 DLOGE("Invalid buffer handle: %p on layer: %d", buffer, id_);
92 return HWC2::Error::BadParameter;
93 }
94
Naseer Ahmede3f007a2016-06-07 18:13:28 -040095 if (acquire_fence == 0) {
96 DLOGE("acquire_fence is zero");
97 return HWC2::Error::BadParameter;
98 }
99
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500100 const private_handle_t *handle = static_cast<const private_handle_t *>(buffer);
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400101
102 // Validate and dup ion fd from surfaceflinger
103 // This works around bug 30281222
104 if (handle->fd < 0) {
105 return HWC2::Error::BadParameter;
106 } else {
107 close(ion_fd_);
108 ion_fd_ = dup(handle->fd);
109 }
110
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800111 LayerBuffer *layer_buffer = &layer_->input_buffer;
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700112 int aligned_width, aligned_height;
Naseer Ahmed42752212017-01-27 17:32:21 -0500113#ifdef USE_GRALLOC1
114 buffer_allocator_->GetCustomWidthAndHeight(handle, &aligned_width, &aligned_height);
115#else
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700116 AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(handle, aligned_width, aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500117#endif
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700118
119 layer_buffer->width = UINT32(aligned_width);
120 layer_buffer->height = UINT32(aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500121 layer_buffer->unaligned_width = UINT32(handle->unaligned_width);
122 layer_buffer->unaligned_height = UINT32(handle->unaligned_height);
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700123
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500124 layer_buffer->format = GetSDMFormat(handle->format, handle->flags);
125 if (SetMetaData(handle, layer_) != kErrorNone) {
126 return HWC2::Error::BadLayer;
127 }
128
Naseer Ahmed42752212017-01-27 17:32:21 -0500129#ifdef USE_GRALLOC1
130 // TODO(user): Clean this up
131 if (handle->buffer_type == BUFFER_TYPE_VIDEO) {
132#else
133 if (handle->bufferType == BUFFER_TYPE_VIDEO) {
134#endif
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500135 layer_buffer->flags.video = true;
136 }
137 // TZ Protected Buffer - L1
138 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER) {
139 layer_buffer->flags.secure = true;
Sushil Chauhandfe55a22016-09-12 15:48:29 -0700140 if (handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE) {
141 layer_buffer->flags.secure_camera = true;
142 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500143 }
144 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY) {
145 layer_buffer->flags.secure_display = true;
146 }
147
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400148 layer_buffer->planes[0].fd = ion_fd_;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500149 layer_buffer->planes[0].offset = handle->offset;
150 layer_buffer->planes[0].stride = UINT32(handle->width);
151 layer_buffer->acquire_fence_fd = acquire_fence;
Naseer Ahmed18630d32016-10-26 16:14:19 -0400152 layer_buffer->size = handle->size;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500153 layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle);
Saurabh Shah7d476ed2016-06-27 16:40:58 -0700154 layer_buffer->fb_id = handle->fb_id;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500155
156 return HWC2::Error::None;
157}
158
159HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700160 layer_->dirty_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400161 for (uint32_t i = 0; i < damage.numRects; i++) {
162 LayerRect rect;
163 SetRect(damage.rects[i], &rect);
164 layer_->dirty_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500165 }
166 return HWC2::Error::None;
167}
168
169HWC2::Error HWCLayer::SetLayerBlendMode(HWC2::BlendMode mode) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700170 LayerBlending blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500171 switch (mode) {
172 case HWC2::BlendMode::Coverage:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700173 blending = kBlendingCoverage;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500174 break;
175 case HWC2::BlendMode::Premultiplied:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700176 blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500177 break;
178 case HWC2::BlendMode::None:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700179 blending = kBlendingOpaque;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500180 break;
181 default:
182 return HWC2::Error::BadParameter;
183 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700184
185 if (layer_->blending != blending) {
186 geometry_changes_ |= kBlendMode;
187 layer_->blending = blending;
188 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500189 return HWC2::Error::None;
190}
191
192HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) {
193 layer_->solid_fill_color = GetUint32Color(color);
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800194 layer_->input_buffer.format = kFormatARGB8888;
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400195 DLOGV_IF(kTagCompManager, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_,
196 layer_->solid_fill_color);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500197 return HWC2::Error::None;
198}
199
200HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700201 client_requested_ = type;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500202 switch (type) {
203 case HWC2::Composition::Client:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500204 break;
205 case HWC2::Composition::Device:
206 // We try and default to this in SDM
207 break;
208 case HWC2::Composition::SolidColor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500209 break;
210 case HWC2::Composition::Cursor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500211 break;
212 case HWC2::Composition::Invalid:
213 return HWC2::Error::BadParameter;
214 default:
215 return HWC2::Error::Unsupported;
216 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700217
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500218 return HWC2::Error::None;
219}
220
221HWC2::Error HWCLayer::SetLayerDataspace(int32_t dataspace) {
222 // TODO(user): Implement later
223 geometry_changes_ |= kDataspace;
224 return HWC2::Error::None;
225}
226
227HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700228 LayerRect dst_rect = {};
229 SetRect(frame, &dst_rect);
230 if (layer_->dst_rect != dst_rect) {
231 geometry_changes_ |= kDisplayFrame;
232 layer_->dst_rect = dst_rect;
233 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500234 return HWC2::Error::None;
235}
236
237HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) {
238 // Conversion of float alpha in range 0.0 to 1.0 similar to the HWC Adapter
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700239 uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha));
240 if (layer_->plane_alpha != plane_alpha) {
241 geometry_changes_ |= kPlaneAlpha;
242 layer_->plane_alpha = plane_alpha;
243 }
244
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500245 return HWC2::Error::None;
246}
247
248HWC2::Error HWCLayer::SetLayerSourceCrop(hwc_frect_t crop) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700249 LayerRect src_rect = {};
250 SetRect(crop, &src_rect);
251 if (layer_->src_rect != src_rect) {
252 geometry_changes_ |= kSourceCrop;
253 layer_->src_rect = src_rect;
254 }
255
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500256 return HWC2::Error::None;
257}
258
259HWC2::Error HWCLayer::SetLayerTransform(HWC2::Transform transform) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700260 LayerTransform layer_transform = {};
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500261 switch (transform) {
262 case HWC2::Transform::FlipH:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700263 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500264 break;
265 case HWC2::Transform::FlipV:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700266 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500267 break;
268 case HWC2::Transform::Rotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700269 layer_transform.rotation = 90.0f;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500270 break;
271 case HWC2::Transform::Rotate180:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700272 layer_transform.flip_horizontal = true;
273 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500274 break;
275 case HWC2::Transform::Rotate270:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700276 layer_transform.rotation = 90.0f;
277 layer_transform.flip_horizontal = true;
278 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500279 break;
280 case HWC2::Transform::FlipHRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700281 layer_transform.rotation = 90.0f;
282 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500283 break;
284 case HWC2::Transform::FlipVRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700285 layer_transform.rotation = 90.0f;
286 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500287 break;
Arun Kumar K.R5f20a7a2016-06-17 16:03:54 -0700288 case HWC2::Transform::None:
289 // do nothing
290 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500291 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700292
293 if (layer_->transform != layer_transform) {
294 geometry_changes_ |= kTransform;
295 layer_->transform = layer_transform;
296 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500297 return HWC2::Error::None;
298}
299
300HWC2::Error HWCLayer::SetLayerVisibleRegion(hwc_region_t visible) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700301 layer_->visible_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400302 for (uint32_t i = 0; i < visible.numRects; i++) {
303 LayerRect rect;
304 SetRect(visible.rects[i], &rect);
305 layer_->visible_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500306 }
307
308 return HWC2::Error::None;
309}
310
311HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700312 if (z_ != z) {
313 geometry_changes_ |= kZOrder;
314 z_ = z;
315 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500316 return HWC2::Error::None;
317}
318
319void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) {
320 target->left = FLOAT(source.left);
321 target->top = FLOAT(source.top);
322 target->right = FLOAT(source.right);
323 target->bottom = FLOAT(source.bottom);
324}
325
326void HWCLayer::SetRect(const hwc_frect_t &source, LayerRect *target) {
327 // Recommended way of rounding as in hwcomposer2.h - SetLayerSourceCrop
328 target->left = std::ceil(source.left);
329 target->top = std::ceil(source.top);
330 target->right = std::floor(source.right);
331 target->bottom = std::floor(source.bottom);
332}
333
334uint32_t HWCLayer::GetUint32Color(const hwc_color_t &source) {
335 // Returns 32 bit ARGB
336 uint32_t a = UINT32(source.a) << 24;
337 uint32_t r = UINT32(source.r) << 16;
338 uint32_t g = UINT32(source.g) << 8;
339 uint32_t b = UINT32(source.b);
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400340 uint32_t color = a | r | g | b;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500341 return color;
342}
343
344LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) {
345 LayerBufferFormat format = kFormatInvalid;
346 if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
347 switch (source) {
348 case HAL_PIXEL_FORMAT_RGBA_8888:
349 format = kFormatRGBA8888Ubwc;
350 break;
351 case HAL_PIXEL_FORMAT_RGBX_8888:
352 format = kFormatRGBX8888Ubwc;
353 break;
354 case HAL_PIXEL_FORMAT_BGR_565:
355 format = kFormatBGR565Ubwc;
356 break;
357 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
358 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
359 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
360 format = kFormatYCbCr420SPVenusUbwc;
361 break;
Arun Kumar K.R54885f02017-03-23 11:56:59 -0700362 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
363 format = kFormatYCbCr420TP10Ubwc;
364 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500365 default:
366 DLOGE("Unsupported format type for UBWC %d", source);
367 return kFormatInvalid;
368 }
369 return format;
370 }
371
372 switch (source) {
373 case HAL_PIXEL_FORMAT_RGBA_8888:
374 format = kFormatRGBA8888;
375 break;
376 case HAL_PIXEL_FORMAT_RGBA_5551:
377 format = kFormatRGBA5551;
378 break;
379 case HAL_PIXEL_FORMAT_RGBA_4444:
380 format = kFormatRGBA4444;
381 break;
382 case HAL_PIXEL_FORMAT_BGRA_8888:
383 format = kFormatBGRA8888;
384 break;
385 case HAL_PIXEL_FORMAT_RGBX_8888:
386 format = kFormatRGBX8888;
387 break;
388 case HAL_PIXEL_FORMAT_BGRX_8888:
389 format = kFormatBGRX8888;
390 break;
391 case HAL_PIXEL_FORMAT_RGB_888:
392 format = kFormatRGB888;
393 break;
394 case HAL_PIXEL_FORMAT_RGB_565:
395 format = kFormatRGB565;
396 break;
397 case HAL_PIXEL_FORMAT_BGR_565:
398 format = kFormatBGR565;
399 break;
400 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
401 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
402 format = kFormatYCbCr420SemiPlanarVenus;
403 break;
404 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
405 format = kFormatYCrCb420SemiPlanarVenus;
406 break;
407 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
408 format = kFormatYCbCr420SPVenusUbwc;
409 break;
410 case HAL_PIXEL_FORMAT_YV12:
411 format = kFormatYCrCb420PlanarStride16;
412 break;
413 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
414 format = kFormatYCrCb420SemiPlanar;
415 break;
416 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
417 format = kFormatYCbCr420SemiPlanar;
418 break;
419 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
420 format = kFormatYCbCr422H2V1SemiPlanar;
421 break;
422 case HAL_PIXEL_FORMAT_YCbCr_422_I:
423 format = kFormatYCbCr422H2V1Packed;
424 break;
Naseer Ahmed72dea242016-05-03 19:13:07 -0400425 case HAL_PIXEL_FORMAT_RGBA_1010102:
426 format = kFormatRGBA1010102;
427 break;
428 case HAL_PIXEL_FORMAT_ARGB_2101010:
429 format = kFormatARGB2101010;
430 break;
431 case HAL_PIXEL_FORMAT_RGBX_1010102:
432 format = kFormatRGBX1010102;
433 break;
434 case HAL_PIXEL_FORMAT_XRGB_2101010:
435 format = kFormatXRGB2101010;
436 break;
437 case HAL_PIXEL_FORMAT_BGRA_1010102:
438 format = kFormatBGRA1010102;
439 break;
440 case HAL_PIXEL_FORMAT_ABGR_2101010:
441 format = kFormatABGR2101010;
442 break;
443 case HAL_PIXEL_FORMAT_BGRX_1010102:
444 format = kFormatBGRX1010102;
445 break;
446 case HAL_PIXEL_FORMAT_XBGR_2101010:
447 format = kFormatXBGR2101010;
448 break;
449 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
450 format = kFormatYCbCr420P010;
451 break;
452 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
453 format = kFormatYCbCr420TP10Ubwc;
454 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500455 default:
456 DLOGW("Unsupported format type = %d", source);
457 return kFormatInvalid;
458 }
459
460 return format;
461}
462
463LayerBufferS3DFormat HWCLayer::GetS3DFormat(uint32_t s3d_format) {
464 LayerBufferS3DFormat sdm_s3d_format = kS3dFormatNone;
465 switch (s3d_format) {
466 case HAL_NO_3D:
467 sdm_s3d_format = kS3dFormatNone;
468 break;
469 case HAL_3D_SIDE_BY_SIDE_L_R:
470 sdm_s3d_format = kS3dFormatLeftRight;
471 break;
472 case HAL_3D_SIDE_BY_SIDE_R_L:
473 sdm_s3d_format = kS3dFormatRightLeft;
474 break;
475 case HAL_3D_TOP_BOTTOM:
476 sdm_s3d_format = kS3dFormatTopBottom;
477 break;
478 default:
479 DLOGW("Invalid S3D format %d", s3d_format);
480 }
481 return sdm_s3d_format;
482}
483
484DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) {
485 const MetaData_t *meta_data = reinterpret_cast<MetaData_t *>(pvt_handle->base_metadata);
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800486 LayerBuffer *layer_buffer = &layer->input_buffer;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500487
488 if (!meta_data) {
489 return kErrorNone;
490 }
491
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -0700492 if (sdm::SetCSC(meta_data, &layer_buffer->color_metadata) != kErrorNone) {
493 return kErrorNotSupported;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500494 }
495
496 if (meta_data->operation & SET_IGC) {
Naseer Ahmed34502532016-06-21 14:42:24 -0400497 if (SetIGC(meta_data->igc, &layer_buffer->igc) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500498 return kErrorNotSupported;
499 }
500 }
501
502 if (meta_data->operation & UPDATE_REFRESH_RATE) {
503 layer->frame_rate = RoundToStandardFPS(meta_data->refreshrate);
504 }
505
506 if ((meta_data->operation & PP_PARAM_INTERLACED) && meta_data->interlaced) {
507 layer_buffer->flags.interlace = true;
508 }
509
510 if (meta_data->operation & LINEAR_FORMAT) {
511 layer_buffer->format = GetSDMFormat(INT32(meta_data->linearFormat), 0);
512 }
513
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500514 if (meta_data->operation & S3D_FORMAT) {
515 layer_buffer->s3d_format = GetS3DFormat(meta_data->s3dFormat);
516 }
517
518 return kErrorNone;
519}
520
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500521DisplayError HWCLayer::SetIGC(IGC_t source, LayerIGC *target) {
522 switch (source) {
523 case IGC_NotSpecified:
524 *target = kIGCNotSpecified;
525 break;
526 case IGC_sRGB:
527 *target = kIGCsRGB;
528 break;
529 default:
530 DLOGE("Unsupported IGC: %d", source);
531 return kErrorNotSupported;
532 }
533
534 return kErrorNone;
535}
536
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400537uint32_t HWCLayer::RoundToStandardFPS(float fps) {
538 static const uint32_t standard_fps[4] = {24, 30, 48, 60};
539 uint32_t frame_rate = (uint32_t)(fps);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500540
541 int count = INT(sizeof(standard_fps) / sizeof(standard_fps[0]));
542 for (int i = 0; i < count; i++) {
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400543 if ((standard_fps[i] - frame_rate) < 2) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500544 // Most likely used for video, the fps can fluctuate
545 // Ex: b/w 29 and 30 for 30 fps clip
546 return standard_fps[i];
547 }
548 }
549
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400550 return frame_rate;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500551}
552
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700553void HWCLayer::SetComposition(const LayerComposition &sdm_composition) {
554 auto hwc_composition = HWC2::Composition::Invalid;
555 switch (sdm_composition) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500556 case kCompositionGPU:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700557 hwc_composition = HWC2::Composition::Client;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500558 break;
559 case kCompositionHWCursor:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700560 hwc_composition = HWC2::Composition::Cursor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500561 break;
562 default:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700563 hwc_composition = HWC2::Composition::Device;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500564 break;
565 }
566 // Update solid fill composition
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700567 if (sdm_composition == kCompositionSDE && layer_->flags.solid_fill != 0) {
568 hwc_composition = HWC2::Composition::SolidColor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500569 }
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700570 device_selected_ = hwc_composition;
571
572 return;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500573}
574void HWCLayer::PushReleaseFence(int32_t fence) {
575 release_fences_.push(fence);
576}
577int32_t HWCLayer::PopReleaseFence(void) {
578 if (release_fences_.empty())
579 return -1;
580 auto fence = release_fences_.front();
581 release_fences_.pop();
582 return fence;
583}
584
585} // namespace sdm