blob: 51a868734de76e9a76f09306b9783d595b705447 [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
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080020#include <stdint.h>
21#include <qdMetaData.h>
22
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050023#include "hwc_layers.h"
Naseer Ahmed42752212017-01-27 17:32:21 -050024#ifndef USE_GRALLOC1
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050025#include <gr.h>
Naseer Ahmed42752212017-01-27 17:32:21 -050026#endif
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050027#include <utils/debug.h>
28#include <cmath>
29
30#define __CLASS__ "HWCLayer"
31
32namespace sdm {
33
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050034std::atomic<hwc2_layer_t> HWCLayer::next_id_(1);
35
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080036DisplayError SetCSC(const private_handle_t *pvt_handle, ColorMetaData *color_metadata) {
37 if (getMetaData(const_cast<private_handle_t *>(pvt_handle), GET_COLOR_METADATA,
38 color_metadata) != 0) {
39 ColorSpace_t csc = ITU_R_601;
40 if (getMetaData(const_cast<private_handle_t *>(pvt_handle), GET_COLOR_SPACE,
41 &csc) == 0) {
42 if (csc == ITU_R_601_FR || csc == ITU_R_2020_FR) {
43 color_metadata->range = Range_Full;
44 }
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070045
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080046 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:
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070057 color_metadata->colorPrimaries = ColorPrimaries_BT2020;
58 break;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080059 default:
60 DLOGE("Unsupported CSC: %d", csc);
61 return kErrorNotSupported;
62 }
63 } else {
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070064 return kErrorNotSupported;
65 }
66 }
67
68 return kErrorNone;
69}
70
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050071// Layer operations
Naseer Ahmed42752212017-01-27 17:32:21 -050072HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator)
73 : id_(next_id_++), display_id_(display_id), buffer_allocator_(buf_allocator) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050074 layer_ = new Layer();
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050075 // Fences are deferred, so the first time this layer is presented, return -1
76 // TODO(user): Verify that fences are properly obtained on suspend/resume
77 release_fences_.push(-1);
78}
79
80HWCLayer::~HWCLayer() {
81 // Close any fences left for this layer
82 while (!release_fences_.empty()) {
83 close(release_fences_.front());
84 release_fences_.pop();
85 }
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -040086 close(ion_fd_);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050087 if (layer_) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050088 delete layer_;
89 }
90}
91
92HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence) {
93 if (!buffer) {
94 DLOGE("Invalid buffer handle: %p on layer: %d", buffer, id_);
95 return HWC2::Error::BadParameter;
96 }
97
Naseer Ahmede3f007a2016-06-07 18:13:28 -040098 if (acquire_fence == 0) {
99 DLOGE("acquire_fence is zero");
100 return HWC2::Error::BadParameter;
101 }
102
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500103 const private_handle_t *handle = static_cast<const private_handle_t *>(buffer);
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400104
105 // Validate and dup ion fd from surfaceflinger
106 // This works around bug 30281222
107 if (handle->fd < 0) {
108 return HWC2::Error::BadParameter;
109 } else {
110 close(ion_fd_);
111 ion_fd_ = dup(handle->fd);
112 }
113
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800114 LayerBuffer *layer_buffer = &layer_->input_buffer;
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700115 int aligned_width, aligned_height;
Naseer Ahmed42752212017-01-27 17:32:21 -0500116#ifdef USE_GRALLOC1
117 buffer_allocator_->GetCustomWidthAndHeight(handle, &aligned_width, &aligned_height);
118#else
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700119 AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(handle, aligned_width, aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500120#endif
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700121
122 layer_buffer->width = UINT32(aligned_width);
123 layer_buffer->height = UINT32(aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500124 layer_buffer->unaligned_width = UINT32(handle->unaligned_width);
125 layer_buffer->unaligned_height = UINT32(handle->unaligned_height);
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700126
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500127 layer_buffer->format = GetSDMFormat(handle->format, handle->flags);
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800128 if (SetMetaData(const_cast<private_handle_t *>(handle), layer_) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500129 return HWC2::Error::BadLayer;
130 }
131
Naseer Ahmed42752212017-01-27 17:32:21 -0500132#ifdef USE_GRALLOC1
133 // TODO(user): Clean this up
134 if (handle->buffer_type == BUFFER_TYPE_VIDEO) {
135#else
136 if (handle->bufferType == BUFFER_TYPE_VIDEO) {
137#endif
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500138 layer_buffer->flags.video = true;
139 }
140 // TZ Protected Buffer - L1
141 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER) {
142 layer_buffer->flags.secure = true;
Sushil Chauhandfe55a22016-09-12 15:48:29 -0700143 if (handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE) {
144 layer_buffer->flags.secure_camera = true;
145 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500146 }
147 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY) {
148 layer_buffer->flags.secure_display = true;
149 }
150
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400151 layer_buffer->planes[0].fd = ion_fd_;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500152 layer_buffer->planes[0].offset = handle->offset;
153 layer_buffer->planes[0].stride = UINT32(handle->width);
154 layer_buffer->acquire_fence_fd = acquire_fence;
Naseer Ahmed18630d32016-10-26 16:14:19 -0400155 layer_buffer->size = handle->size;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500156 layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle);
157
158 return HWC2::Error::None;
159}
160
161HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700162 layer_->dirty_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400163 for (uint32_t i = 0; i < damage.numRects; i++) {
164 LayerRect rect;
165 SetRect(damage.rects[i], &rect);
166 layer_->dirty_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500167 }
168 return HWC2::Error::None;
169}
170
171HWC2::Error HWCLayer::SetLayerBlendMode(HWC2::BlendMode mode) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700172 LayerBlending blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500173 switch (mode) {
174 case HWC2::BlendMode::Coverage:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700175 blending = kBlendingCoverage;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500176 break;
177 case HWC2::BlendMode::Premultiplied:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700178 blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500179 break;
180 case HWC2::BlendMode::None:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700181 blending = kBlendingOpaque;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500182 break;
183 default:
184 return HWC2::Error::BadParameter;
185 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700186
187 if (layer_->blending != blending) {
188 geometry_changes_ |= kBlendMode;
189 layer_->blending = blending;
190 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500191 return HWC2::Error::None;
192}
193
194HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) {
195 layer_->solid_fill_color = GetUint32Color(color);
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800196 layer_->input_buffer.format = kFormatARGB8888;
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400197 DLOGV_IF(kTagCompManager, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_,
198 layer_->solid_fill_color);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500199 return HWC2::Error::None;
200}
201
202HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700203 client_requested_ = type;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500204 switch (type) {
205 case HWC2::Composition::Client:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500206 break;
207 case HWC2::Composition::Device:
208 // We try and default to this in SDM
209 break;
210 case HWC2::Composition::SolidColor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500211 break;
212 case HWC2::Composition::Cursor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500213 break;
214 case HWC2::Composition::Invalid:
215 return HWC2::Error::BadParameter;
216 default:
217 return HWC2::Error::Unsupported;
218 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700219
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500220 return HWC2::Error::None;
221}
222
223HWC2::Error HWCLayer::SetLayerDataspace(int32_t dataspace) {
Naseer Ahmed43f22bb2017-05-05 17:40:46 -0400224 // Map deprecated dataspace values to appropriate
225 // new enums
226 if (dataspace & 0xffff) {
227 switch (dataspace & 0xffff) {
228 case HAL_DATASPACE_SRGB:
229 dataspace = HAL_DATASPACE_V0_SRGB;
230 break;
231 case HAL_DATASPACE_JFIF:
232 dataspace = HAL_DATASPACE_V0_JFIF;
233 break;
234 case HAL_DATASPACE_SRGB_LINEAR:
235 dataspace = HAL_DATASPACE_V0_SRGB_LINEAR;
236 break;
237 case HAL_DATASPACE_BT601_625:
238 dataspace = HAL_DATASPACE_V0_BT601_625;
239 break;
240 case HAL_DATASPACE_BT601_525:
241 dataspace = HAL_DATASPACE_V0_BT601_525;
242 break;
243 case HAL_DATASPACE_BT709:
244 dataspace = HAL_DATASPACE_V0_BT709;
245 break;
246 default:
247 // unknown legacy dataspace
248 DLOGW_IF(kTagQDCM, "Unsupported dataspace type %d", dataspace);
249 }
250 }
251
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400252 if (dataspace_ != dataspace) {
253 geometry_changes_ |= kDataspace;
254 dataspace_ = dataspace;
255 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500256 return HWC2::Error::None;
257}
258
259HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700260 LayerRect dst_rect = {};
261 SetRect(frame, &dst_rect);
262 if (layer_->dst_rect != dst_rect) {
263 geometry_changes_ |= kDisplayFrame;
264 layer_->dst_rect = dst_rect;
265 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500266 return HWC2::Error::None;
267}
268
269HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) {
270 // 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 -0700271 uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha));
272 if (layer_->plane_alpha != plane_alpha) {
273 geometry_changes_ |= kPlaneAlpha;
274 layer_->plane_alpha = plane_alpha;
275 }
276
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500277 return HWC2::Error::None;
278}
279
280HWC2::Error HWCLayer::SetLayerSourceCrop(hwc_frect_t crop) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700281 LayerRect src_rect = {};
282 SetRect(crop, &src_rect);
283 if (layer_->src_rect != src_rect) {
284 geometry_changes_ |= kSourceCrop;
285 layer_->src_rect = src_rect;
286 }
287
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500288 return HWC2::Error::None;
289}
290
291HWC2::Error HWCLayer::SetLayerTransform(HWC2::Transform transform) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700292 LayerTransform layer_transform = {};
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500293 switch (transform) {
294 case HWC2::Transform::FlipH:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700295 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500296 break;
297 case HWC2::Transform::FlipV:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700298 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500299 break;
300 case HWC2::Transform::Rotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700301 layer_transform.rotation = 90.0f;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500302 break;
303 case HWC2::Transform::Rotate180:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700304 layer_transform.flip_horizontal = true;
305 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500306 break;
307 case HWC2::Transform::Rotate270:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700308 layer_transform.rotation = 90.0f;
309 layer_transform.flip_horizontal = true;
310 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500311 break;
312 case HWC2::Transform::FlipHRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700313 layer_transform.rotation = 90.0f;
314 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500315 break;
316 case HWC2::Transform::FlipVRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700317 layer_transform.rotation = 90.0f;
318 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500319 break;
Arun Kumar K.R5f20a7a2016-06-17 16:03:54 -0700320 case HWC2::Transform::None:
321 // do nothing
322 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500323 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700324
325 if (layer_->transform != layer_transform) {
326 geometry_changes_ |= kTransform;
327 layer_->transform = layer_transform;
328 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500329 return HWC2::Error::None;
330}
331
332HWC2::Error HWCLayer::SetLayerVisibleRegion(hwc_region_t visible) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700333 layer_->visible_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400334 for (uint32_t i = 0; i < visible.numRects; i++) {
335 LayerRect rect;
336 SetRect(visible.rects[i], &rect);
337 layer_->visible_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500338 }
339
340 return HWC2::Error::None;
341}
342
343HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700344 if (z_ != z) {
345 geometry_changes_ |= kZOrder;
346 z_ = z;
347 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500348 return HWC2::Error::None;
349}
350
351void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) {
352 target->left = FLOAT(source.left);
353 target->top = FLOAT(source.top);
354 target->right = FLOAT(source.right);
355 target->bottom = FLOAT(source.bottom);
356}
357
358void HWCLayer::SetRect(const hwc_frect_t &source, LayerRect *target) {
359 // Recommended way of rounding as in hwcomposer2.h - SetLayerSourceCrop
360 target->left = std::ceil(source.left);
361 target->top = std::ceil(source.top);
362 target->right = std::floor(source.right);
363 target->bottom = std::floor(source.bottom);
364}
365
366uint32_t HWCLayer::GetUint32Color(const hwc_color_t &source) {
367 // Returns 32 bit ARGB
368 uint32_t a = UINT32(source.a) << 24;
369 uint32_t r = UINT32(source.r) << 16;
370 uint32_t g = UINT32(source.g) << 8;
371 uint32_t b = UINT32(source.b);
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400372 uint32_t color = a | r | g | b;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500373 return color;
374}
375
376LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) {
377 LayerBufferFormat format = kFormatInvalid;
378 if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
379 switch (source) {
380 case HAL_PIXEL_FORMAT_RGBA_8888:
381 format = kFormatRGBA8888Ubwc;
382 break;
383 case HAL_PIXEL_FORMAT_RGBX_8888:
384 format = kFormatRGBX8888Ubwc;
385 break;
386 case HAL_PIXEL_FORMAT_BGR_565:
387 format = kFormatBGR565Ubwc;
388 break;
389 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
390 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
391 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
392 format = kFormatYCbCr420SPVenusUbwc;
393 break;
Arun Kumar K.R54885f02017-03-23 11:56:59 -0700394 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
395 format = kFormatYCbCr420TP10Ubwc;
396 break;
Rohit Kulkarni7943ec92016-12-20 18:18:46 -0800397 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
398 format = kFormatYCbCr420P010Ubwc;
399 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500400 default:
401 DLOGE("Unsupported format type for UBWC %d", source);
402 return kFormatInvalid;
403 }
404 return format;
405 }
406
407 switch (source) {
408 case HAL_PIXEL_FORMAT_RGBA_8888:
409 format = kFormatRGBA8888;
410 break;
411 case HAL_PIXEL_FORMAT_RGBA_5551:
412 format = kFormatRGBA5551;
413 break;
414 case HAL_PIXEL_FORMAT_RGBA_4444:
415 format = kFormatRGBA4444;
416 break;
417 case HAL_PIXEL_FORMAT_BGRA_8888:
418 format = kFormatBGRA8888;
419 break;
420 case HAL_PIXEL_FORMAT_RGBX_8888:
421 format = kFormatRGBX8888;
422 break;
423 case HAL_PIXEL_FORMAT_BGRX_8888:
424 format = kFormatBGRX8888;
425 break;
426 case HAL_PIXEL_FORMAT_RGB_888:
427 format = kFormatRGB888;
428 break;
429 case HAL_PIXEL_FORMAT_RGB_565:
430 format = kFormatRGB565;
431 break;
432 case HAL_PIXEL_FORMAT_BGR_565:
433 format = kFormatBGR565;
434 break;
435 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
436 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
437 format = kFormatYCbCr420SemiPlanarVenus;
438 break;
439 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
440 format = kFormatYCrCb420SemiPlanarVenus;
441 break;
442 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
443 format = kFormatYCbCr420SPVenusUbwc;
444 break;
445 case HAL_PIXEL_FORMAT_YV12:
446 format = kFormatYCrCb420PlanarStride16;
447 break;
448 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
449 format = kFormatYCrCb420SemiPlanar;
450 break;
451 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
452 format = kFormatYCbCr420SemiPlanar;
453 break;
454 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
455 format = kFormatYCbCr422H2V1SemiPlanar;
456 break;
457 case HAL_PIXEL_FORMAT_YCbCr_422_I:
458 format = kFormatYCbCr422H2V1Packed;
459 break;
Naseer Ahmed72dea242016-05-03 19:13:07 -0400460 case HAL_PIXEL_FORMAT_RGBA_1010102:
461 format = kFormatRGBA1010102;
462 break;
463 case HAL_PIXEL_FORMAT_ARGB_2101010:
464 format = kFormatARGB2101010;
465 break;
466 case HAL_PIXEL_FORMAT_RGBX_1010102:
467 format = kFormatRGBX1010102;
468 break;
469 case HAL_PIXEL_FORMAT_XRGB_2101010:
470 format = kFormatXRGB2101010;
471 break;
472 case HAL_PIXEL_FORMAT_BGRA_1010102:
473 format = kFormatBGRA1010102;
474 break;
475 case HAL_PIXEL_FORMAT_ABGR_2101010:
476 format = kFormatABGR2101010;
477 break;
478 case HAL_PIXEL_FORMAT_BGRX_1010102:
479 format = kFormatBGRX1010102;
480 break;
481 case HAL_PIXEL_FORMAT_XBGR_2101010:
482 format = kFormatXBGR2101010;
483 break;
484 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
485 format = kFormatYCbCr420P010;
486 break;
487 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
488 format = kFormatYCbCr420TP10Ubwc;
489 break;
Rohit Kulkarni7943ec92016-12-20 18:18:46 -0800490 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
491 format = kFormatYCbCr420P010Ubwc;
492 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500493 default:
494 DLOGW("Unsupported format type = %d", source);
495 return kFormatInvalid;
496 }
497
498 return format;
499}
500
501LayerBufferS3DFormat HWCLayer::GetS3DFormat(uint32_t s3d_format) {
502 LayerBufferS3DFormat sdm_s3d_format = kS3dFormatNone;
503 switch (s3d_format) {
504 case HAL_NO_3D:
505 sdm_s3d_format = kS3dFormatNone;
506 break;
507 case HAL_3D_SIDE_BY_SIDE_L_R:
508 sdm_s3d_format = kS3dFormatLeftRight;
509 break;
510 case HAL_3D_SIDE_BY_SIDE_R_L:
511 sdm_s3d_format = kS3dFormatRightLeft;
512 break;
513 case HAL_3D_TOP_BOTTOM:
514 sdm_s3d_format = kS3dFormatTopBottom;
515 break;
516 default:
517 DLOGW("Invalid S3D format %d", s3d_format);
518 }
519 return sdm_s3d_format;
520}
521
522DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) {
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800523 LayerBuffer *layer_buffer = &layer->input_buffer;
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400524
525 // Only use color metadata if Android framework metadata is not set
526 if (dataspace_ == HAL_DATASPACE_UNKNOWN) {
527 if (sdm::SetCSC(pvt_handle, &layer_buffer->color_metadata) != kErrorNone) {
528 return kErrorNotSupported;
529 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500530 }
531
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800532 private_handle_t *handle = const_cast<private_handle_t *>(pvt_handle);
533 IGC_t igc = {};
534 if (getMetaData(handle, GET_IGC, &igc) == 0) {
535 if (SetIGC(igc, &layer_buffer->igc) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500536 return kErrorNotSupported;
537 }
538 }
539
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800540 uint32_t fps = 0;
541 if (getMetaData(handle, GET_REFRESH_RATE , &fps) == 0) {
542 layer->frame_rate = RoundToStandardFPS(fps);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500543 }
544
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800545 int32_t interlaced = 0;
546 if (getMetaData(handle, GET_PP_PARAM_INTERLACED, &interlaced) == 0) {
547 layer_buffer->flags.interlace = interlaced ? true : false;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500548 }
549
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800550 uint32_t linear_format = 0;
551 if (getMetaData(handle, GET_LINEAR_FORMAT, &linear_format) == 0) {
552 layer_buffer->format = GetSDMFormat(INT32(linear_format), 0);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500553 }
554
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800555 uint32_t s3d = 0;
556 if (getMetaData(handle, GET_S3D_FORMAT, &s3d) == 0) {
557 layer_buffer->s3d_format = GetS3DFormat(s3d);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500558 }
559
560 return kErrorNone;
561}
562
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500563DisplayError HWCLayer::SetIGC(IGC_t source, LayerIGC *target) {
564 switch (source) {
565 case IGC_NotSpecified:
566 *target = kIGCNotSpecified;
567 break;
568 case IGC_sRGB:
569 *target = kIGCsRGB;
570 break;
571 default:
572 DLOGE("Unsupported IGC: %d", source);
573 return kErrorNotSupported;
574 }
575
576 return kErrorNone;
577}
578
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400579
580
581bool HWCLayer::SupportLocalConversion(ColorPrimaries working_primaries) {
582 if (layer_->input_buffer.color_metadata.colorPrimaries <= ColorPrimaries_BT601_6_525 &&
583 working_primaries <= ColorPrimaries_BT601_6_525) {
584 return true;
585 }
586 return false;
587}
588
589bool HWCLayer::SupportedDataspace() {
590 if (dataspace_ == HAL_DATASPACE_UNKNOWN) {
591 // Pick values from metadata
592 return true;
593 }
594
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400595 LayerBuffer *layer_buffer = &layer_->input_buffer;
596
597 GammaTransfer sdm_transfer = {};
598 ColorPrimaries sdm_primaries = {};
599 ColorRange sdm_range = {};
600
Naseer Ahmed451ab462017-04-24 14:52:51 -0400601 auto transfer = dataspace_ & HAL_DATASPACE_TRANSFER_MASK;
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400602 // Handle transfer
603 switch (transfer) {
604 case HAL_DATASPACE_TRANSFER_SRGB:
605 sdm_transfer = Transfer_sRGB;
606 break;
607 case HAL_DATASPACE_TRANSFER_SMPTE_170M:
608 sdm_transfer = Transfer_SMPTE_170M;
609 break;
610 case HAL_DATASPACE_TRANSFER_ST2084:
611 sdm_transfer = Transfer_SMPTE_ST2084;
612 break;
613 case HAL_DATASPACE_TRANSFER_HLG:
614 sdm_transfer = Transfer_HLG;
615 break;
Naseer Ahmedcc7f7102017-05-10 11:58:15 -0400616 case HAL_DATASPACE_TRANSFER_LINEAR:
617 sdm_transfer = Transfer_Linear;
618 break;
619 case HAL_DATASPACE_TRANSFER_GAMMA2_2:
620 sdm_transfer = Transfer_Gamma2_2;
621 break;
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400622 default:
623 return false;
624 }
625
626 // Handle standard
Naseer Ahmed451ab462017-04-24 14:52:51 -0400627 auto standard = dataspace_ & HAL_DATASPACE_STANDARD_MASK;
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400628 switch (standard) {
629 case HAL_DATASPACE_STANDARD_BT709:
630 sdm_primaries = ColorPrimaries_BT709_5;
631 break;
632 case HAL_DATASPACE_STANDARD_BT601_525:
633 case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
634 sdm_primaries = ColorPrimaries_BT601_6_525;
635 break;
636 case HAL_DATASPACE_STANDARD_BT601_625:
637 case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
638 sdm_primaries = ColorPrimaries_BT601_6_625;
639 break;
640 case HAL_DATASPACE_STANDARD_DCI_P3:
641 sdm_primaries = ColorPrimaries_DCIP3;
642 break;
Naseer Ahmedcc7f7102017-05-10 11:58:15 -0400643 case HAL_DATASPACE_STANDARD_BT2020:
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400644 sdm_primaries = ColorPrimaries_BT2020;
645 break;
646 default:
647 return false;
648 }
649 // TODO(user): Check transfer + primary combination
650
651 // Handle range
Naseer Ahmed451ab462017-04-24 14:52:51 -0400652 auto range = dataspace_ & HAL_DATASPACE_RANGE_MASK;
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400653 switch (range) {
654 case HAL_DATASPACE_RANGE_FULL:
655 sdm_range = Range_Full;
656 break;
657 case HAL_DATASPACE_RANGE_LIMITED:
658 default:
659 sdm_range = Range_Limited;
660 break;
661 }
662
663 // If we got here, the value is supported, update the layer
664 layer_buffer->color_metadata.transfer = sdm_transfer;
665 layer_buffer->color_metadata.colorPrimaries = sdm_primaries;
666 layer_buffer->color_metadata.range = sdm_range;
667 return true;
668}
669
670
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400671uint32_t HWCLayer::RoundToStandardFPS(float fps) {
672 static const uint32_t standard_fps[4] = {24, 30, 48, 60};
673 uint32_t frame_rate = (uint32_t)(fps);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500674
675 int count = INT(sizeof(standard_fps) / sizeof(standard_fps[0]));
676 for (int i = 0; i < count; i++) {
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400677 if ((standard_fps[i] - frame_rate) < 2) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500678 // Most likely used for video, the fps can fluctuate
679 // Ex: b/w 29 and 30 for 30 fps clip
680 return standard_fps[i];
681 }
682 }
683
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400684 return frame_rate;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500685}
686
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700687void HWCLayer::SetComposition(const LayerComposition &sdm_composition) {
688 auto hwc_composition = HWC2::Composition::Invalid;
689 switch (sdm_composition) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500690 case kCompositionGPU:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700691 hwc_composition = HWC2::Composition::Client;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500692 break;
Saurabh Shaha4af3de2017-04-19 17:15:24 -0700693 case kCompositionCursor:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700694 hwc_composition = HWC2::Composition::Cursor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500695 break;
696 default:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700697 hwc_composition = HWC2::Composition::Device;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500698 break;
699 }
700 // Update solid fill composition
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700701 if (sdm_composition == kCompositionSDE && layer_->flags.solid_fill != 0) {
702 hwc_composition = HWC2::Composition::SolidColor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500703 }
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700704 device_selected_ = hwc_composition;
705
706 return;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500707}
708void HWCLayer::PushReleaseFence(int32_t fence) {
709 release_fences_.push(fence);
710}
711int32_t HWCLayer::PopReleaseFence(void) {
712 if (release_fences_.empty())
713 return -1;
714 auto fence = release_fences_.front();
715 release_fences_.pop();
716 return fence;
717}
718
719} // namespace sdm