blob: 6a1c82c85b970ec8ce86c02b3cba1470211bdfcb [file] [log] [blame]
Naseer Ahmedb92e73f2016-03-12 02:03:48 -05001/*
Ramkumar Radhakrishnan525e6432017-12-15 16:43:07 -08002 * Copyright (c) 2014-2018, 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
Naseer Ahmede36f2242017-12-01 15:33:56 -050020#include "hwc_layers.h"
21#include <utils/debug.h>
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080022#include <stdint.h>
Gurunath Ramaswamyf081afe2017-07-04 22:08:36 -070023#include <utility>
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050024#include <cmath>
Naseer Ahmede36f2242017-12-01 15:33:56 -050025#include <qdMetaData.h>
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050026
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.R3e45ac42017-03-08 19:00:02 -080033DisplayError SetCSC(const private_handle_t *pvt_handle, ColorMetaData *color_metadata) {
34 if (getMetaData(const_cast<private_handle_t *>(pvt_handle), GET_COLOR_METADATA,
35 color_metadata) != 0) {
36 ColorSpace_t csc = ITU_R_601;
37 if (getMetaData(const_cast<private_handle_t *>(pvt_handle), GET_COLOR_SPACE,
38 &csc) == 0) {
39 if (csc == ITU_R_601_FR || csc == ITU_R_2020_FR) {
40 color_metadata->range = Range_Full;
41 }
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070042
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080043 switch (csc) {
Arun Kumar K.R05746222018-04-04 10:45:58 +053044 case ITU_R_601:
45 case ITU_R_601_FR:
46 // video and display driver uses 601_525
47 color_metadata->colorPrimaries = ColorPrimaries_BT601_6_525;
48 break;
49 case ITU_R_709:
50 color_metadata->colorPrimaries = ColorPrimaries_BT709_5;
51 break;
52 case ITU_R_2020:
53 case ITU_R_2020_FR:
54 color_metadata->colorPrimaries = ColorPrimaries_BT2020;
55 break;
56 default:
57 DLOGE("Unsupported CSC: %d", csc);
58 return kErrorNotSupported;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080059 }
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070060 }
61 }
62
63 return kErrorNone;
64}
65
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +053066// Returns true when color primary is supported
67bool GetColorPrimary(const int32_t &dataspace, ColorPrimaries *color_primary) {
68 auto standard = dataspace & HAL_DATASPACE_STANDARD_MASK;
69 bool supported_csc = true;
70 switch (standard) {
71 case HAL_DATASPACE_STANDARD_BT709:
72 *color_primary = ColorPrimaries_BT709_5;
73 break;
74 case HAL_DATASPACE_STANDARD_BT601_525:
75 case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
76 *color_primary = ColorPrimaries_BT601_6_525;
77 break;
78 case HAL_DATASPACE_STANDARD_BT601_625:
79 case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
80 *color_primary = ColorPrimaries_BT601_6_625;
81 break;
82 case HAL_DATASPACE_STANDARD_DCI_P3:
83 *color_primary = ColorPrimaries_DCIP3;
84 break;
85 case HAL_DATASPACE_STANDARD_BT2020:
86 *color_primary = ColorPrimaries_BT2020;
87 break;
88 default:
Sushil Chauhan984d9f72018-05-10 12:35:59 -070089 DLOGV_IF(kTagClient, "Unsupported Standard Request = %d", standard);
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +053090 supported_csc = false;
91 }
92 return supported_csc;
93}
94
95bool GetTransfer(const int32_t &dataspace, GammaTransfer *gamma_transfer) {
96 auto transfer = dataspace & HAL_DATASPACE_TRANSFER_MASK;
97 bool supported_transfer = true;
98 switch (transfer) {
99 case HAL_DATASPACE_TRANSFER_SRGB:
100 *gamma_transfer = Transfer_sRGB;
101 break;
102 case HAL_DATASPACE_TRANSFER_SMPTE_170M:
103 *gamma_transfer = Transfer_SMPTE_170M;
104 break;
105 case HAL_DATASPACE_TRANSFER_ST2084:
106 *gamma_transfer = Transfer_SMPTE_ST2084;
107 break;
108 case HAL_DATASPACE_TRANSFER_HLG:
109 *gamma_transfer = Transfer_HLG;
110 break;
111 case HAL_DATASPACE_TRANSFER_LINEAR:
112 *gamma_transfer = Transfer_Linear;
113 break;
114 case HAL_DATASPACE_TRANSFER_GAMMA2_2:
115 *gamma_transfer = Transfer_Gamma2_2;
116 break;
Arun Kumar K.R84966b22018-04-09 15:50:36 +0530117 case HAL_DATASPACE_TRANSFER_GAMMA2_8:
118 *gamma_transfer = Transfer_Gamma2_8;
119 break;
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530120 default:
Sushil Chauhan984d9f72018-05-10 12:35:59 -0700121 DLOGV_IF(kTagClient, "Unsupported Transfer Request = %d", transfer);
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530122 supported_transfer = false;
123 }
124 return supported_transfer;
125}
126
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530127bool GetRange(const int32_t &dataspace, ColorRange *color_range) {
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530128 auto range = dataspace & HAL_DATASPACE_RANGE_MASK;
129 switch (range) {
130 case HAL_DATASPACE_RANGE_FULL:
131 *color_range = Range_Full;
132 break;
133 case HAL_DATASPACE_RANGE_LIMITED:
134 *color_range = Range_Limited;
135 break;
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530136 case HAL_DATASPACE_RANGE_EXTENDED:
137 *color_range = Range_Extended;
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530138 break;
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530139 default:
Sushil Chauhan984d9f72018-05-10 12:35:59 -0700140 DLOGV_IF(kTagClient, "Unsupported Range Request = %d", range);
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530141 return false;
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530142 }
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530143 return true;
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530144}
145
146bool IsBT2020(const ColorPrimaries &color_primary) {
147 switch (color_primary) {
148 case ColorPrimaries_BT2020:
149 return true;
150 break;
151 default:
152 return false;
153 }
154}
155
156// Retrieve ColorMetaData from android_data_space_t (STANDARD|TRANSFER|RANGE)
157bool GetSDMColorSpace(const int32_t &dataspace, ColorMetaData *color_metadata) {
158 bool valid = false;
159 valid = GetColorPrimary(dataspace, &(color_metadata->colorPrimaries));
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530160 if (valid) {
161 valid = GetTransfer(dataspace, &(color_metadata->transfer));
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530162 }
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530163 if (valid) {
164 valid = GetRange(dataspace, &(color_metadata->range));
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530165 }
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530166
Arun Kumar K.Rd761c1a2018-04-26 19:47:44 +0530167 return valid;
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530168}
169
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500170// Layer operations
Naseer Ahmed42752212017-01-27 17:32:21 -0500171HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator)
172 : id_(next_id_++), display_id_(display_id), buffer_allocator_(buf_allocator) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500173 layer_ = new Layer();
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500174 // Fences are deferred, so the first time this layer is presented, return -1
175 // TODO(user): Verify that fences are properly obtained on suspend/resume
Ramkumar Radhakrishnan00698de2018-01-17 11:39:33 -0800176 release_fences_.push_back(-1);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500177}
178
179HWCLayer::~HWCLayer() {
180 // Close any fences left for this layer
181 while (!release_fences_.empty()) {
Ramkumar Radhakrishnan525e6432017-12-15 16:43:07 -0800182 ::close(release_fences_.front());
Ramkumar Radhakrishnan00698de2018-01-17 11:39:33 -0800183 release_fences_.pop_front();
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500184 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500185 if (layer_) {
Prabhanjan Kandula1651e592017-10-17 18:28:16 -0700186 if (layer_->input_buffer.acquire_fence_fd >= 0) {
Ramkumar Radhakrishnan525e6432017-12-15 16:43:07 -0800187 ::close(layer_->input_buffer.acquire_fence_fd);
188 }
189 if (buffer_fd_ >= 0) {
190 ::close(buffer_fd_);
Prabhanjan Kandula1651e592017-10-17 18:28:16 -0700191 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500192 delete layer_;
193 }
194}
195
196HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence) {
197 if (!buffer) {
Naseer Ahmed2f71fd02017-06-01 19:55:39 -0400198 if (client_requested_ == HWC2::Composition::Device ||
199 client_requested_ == HWC2::Composition::Cursor) {
Ramkumar Radhakrishnanb3386902017-12-19 17:14:13 -0800200 DLOGE("Invalid buffer handle: %p on layer: %d client requested comp type %d", buffer, id_,
201 client_requested_);
202 ::close(acquire_fence);
Naseer Ahmed2f71fd02017-06-01 19:55:39 -0400203 return HWC2::Error::BadParameter;
204 } else {
205 return HWC2::Error::None;
206 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500207 }
208
Naseer Ahmede3f007a2016-06-07 18:13:28 -0400209 if (acquire_fence == 0) {
210 DLOGE("acquire_fence is zero");
211 return HWC2::Error::BadParameter;
212 }
213
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500214 const private_handle_t *handle = static_cast<const private_handle_t *>(buffer);
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400215
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400216 if (handle->fd < 0) {
217 return HWC2::Error::BadParameter;
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400218 }
219
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800220 LayerBuffer *layer_buffer = &layer_->input_buffer;
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700221 int aligned_width, aligned_height;
Naseer Ahmed42752212017-01-27 17:32:21 -0500222 buffer_allocator_->GetCustomWidthAndHeight(handle, &aligned_width, &aligned_height);
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700223
Sushil Chauhan409e8442017-06-12 17:43:25 -0700224 LayerBufferFormat format = GetSDMFormat(handle->format, handle->flags);
225 if ((format != layer_buffer->format) || (UINT32(aligned_width) != layer_buffer->width) ||
226 (UINT32(aligned_height) != layer_buffer->height)) {
227 // Layer buffer geometry has changed.
228 geometry_changes_ |= kBufferGeometry;
229 }
230
231 layer_buffer->format = format;
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700232 layer_buffer->width = UINT32(aligned_width);
233 layer_buffer->height = UINT32(aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500234 layer_buffer->unaligned_width = UINT32(handle->unaligned_width);
235 layer_buffer->unaligned_height = UINT32(handle->unaligned_height);
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700236
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800237 if (SetMetaData(const_cast<private_handle_t *>(handle), layer_) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500238 return HWC2::Error::BadLayer;
239 }
240
Sushil Chauhan409e8442017-06-12 17:43:25 -0700241 layer_buffer->flags.video = (handle->buffer_type == BUFFER_TYPE_VIDEO) ? true : false;
242
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500243 // TZ Protected Buffer - L1
Sushil Chauhan409e8442017-06-12 17:43:25 -0700244 bool secure = (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER);
245 bool secure_camera = secure && (handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE);
246 bool secure_display = (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY);
247 if (secure != layer_buffer->flags.secure || secure_camera != layer_buffer->flags.secure_camera ||
248 secure_display != layer_buffer->flags.secure_display) {
249 // Secure attribute of layer buffer has changed.
250 needs_validate_ = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500251 }
Sushil Chauhan409e8442017-06-12 17:43:25 -0700252
253 layer_buffer->flags.secure = secure;
254 layer_buffer->flags.secure_camera = secure_camera;
255 layer_buffer->flags.secure_display = secure_display;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500256
Prabhanjan Kandula1651e592017-10-17 18:28:16 -0700257 if (layer_buffer->acquire_fence_fd >= 0) {
Ramkumar Radhakrishnan525e6432017-12-15 16:43:07 -0800258 ::close(layer_buffer->acquire_fence_fd);
Prabhanjan Kandula1651e592017-10-17 18:28:16 -0700259 }
260 layer_buffer->acquire_fence_fd = acquire_fence;
Ramkumar Radhakrishnan525e6432017-12-15 16:43:07 -0800261 if (buffer_fd_ >= 0) {
262 ::close(buffer_fd_);
263 }
264 buffer_fd_ = ::dup(handle->fd);
265 layer_buffer->planes[0].fd = buffer_fd_;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500266 layer_buffer->planes[0].offset = handle->offset;
267 layer_buffer->planes[0].stride = UINT32(handle->width);
Naseer Ahmed18630d32016-10-26 16:14:19 -0400268 layer_buffer->size = handle->size;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500269 layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle);
270
271 return HWC2::Error::None;
272}
273
274HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
Sushil Chauhan409e8442017-06-12 17:43:25 -0700275 // Check if there is an update in SurfaceDamage rects
276 if (layer_->dirty_regions.size() != damage.numRects) {
277 needs_validate_ = true;
278 } else {
279 for (uint32_t j = 0; j < damage.numRects; j++) {
280 LayerRect damage_rect;
281 SetRect(damage.rects[j], &damage_rect);
282 if (damage_rect != layer_->dirty_regions.at(j)) {
283 needs_validate_ = true;
284 break;
285 }
286 }
287 }
288
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700289 layer_->dirty_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400290 for (uint32_t i = 0; i < damage.numRects; i++) {
291 LayerRect rect;
292 SetRect(damage.rects[i], &rect);
293 layer_->dirty_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500294 }
295 return HWC2::Error::None;
296}
297
298HWC2::Error HWCLayer::SetLayerBlendMode(HWC2::BlendMode mode) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700299 LayerBlending blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500300 switch (mode) {
301 case HWC2::BlendMode::Coverage:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700302 blending = kBlendingCoverage;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500303 break;
304 case HWC2::BlendMode::Premultiplied:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700305 blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500306 break;
307 case HWC2::BlendMode::None:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700308 blending = kBlendingOpaque;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500309 break;
310 default:
311 return HWC2::Error::BadParameter;
312 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700313
314 if (layer_->blending != blending) {
315 geometry_changes_ |= kBlendMode;
316 layer_->blending = blending;
317 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500318 return HWC2::Error::None;
319}
320
321HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) {
Arun Kumar K.R1018d5b2017-06-08 13:51:05 +0530322 if (client_requested_ != HWC2::Composition::SolidColor) {
323 return HWC2::Error::None;
324 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500325 layer_->solid_fill_color = GetUint32Color(color);
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800326 layer_->input_buffer.format = kFormatARGB8888;
Saurabh Dubeyd90a6a42017-10-24 16:28:01 +0530327 DLOGV_IF(kTagClient, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_,
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400328 layer_->solid_fill_color);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500329 return HWC2::Error::None;
330}
331
332HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) {
Naseer Ahmed34b341d2017-10-05 18:47:15 -0400333 // Validation is required when the client changes the composition type
334 if (client_requested_ != type) {
335 needs_validate_ = true;
336 }
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700337 client_requested_ = type;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500338 switch (type) {
339 case HWC2::Composition::Client:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500340 break;
341 case HWC2::Composition::Device:
342 // We try and default to this in SDM
343 break;
344 case HWC2::Composition::SolidColor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500345 break;
346 case HWC2::Composition::Cursor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500347 break;
348 case HWC2::Composition::Invalid:
349 return HWC2::Error::BadParameter;
350 default:
351 return HWC2::Error::Unsupported;
352 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700353
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500354 return HWC2::Error::None;
355}
356
357HWC2::Error HWCLayer::SetLayerDataspace(int32_t dataspace) {
Naseer Ahmed43f22bb2017-05-05 17:40:46 -0400358 // Map deprecated dataspace values to appropriate
359 // new enums
360 if (dataspace & 0xffff) {
361 switch (dataspace & 0xffff) {
362 case HAL_DATASPACE_SRGB:
363 dataspace = HAL_DATASPACE_V0_SRGB;
364 break;
365 case HAL_DATASPACE_JFIF:
366 dataspace = HAL_DATASPACE_V0_JFIF;
367 break;
368 case HAL_DATASPACE_SRGB_LINEAR:
369 dataspace = HAL_DATASPACE_V0_SRGB_LINEAR;
370 break;
371 case HAL_DATASPACE_BT601_625:
372 dataspace = HAL_DATASPACE_V0_BT601_625;
373 break;
374 case HAL_DATASPACE_BT601_525:
375 dataspace = HAL_DATASPACE_V0_BT601_525;
376 break;
377 case HAL_DATASPACE_BT709:
378 dataspace = HAL_DATASPACE_V0_BT709;
379 break;
380 default:
381 // unknown legacy dataspace
Saurabh Dubeyd90a6a42017-10-24 16:28:01 +0530382 DLOGW_IF(kTagClient, "Unsupported dataspace type %d", dataspace);
Naseer Ahmed43f22bb2017-05-05 17:40:46 -0400383 }
384 }
385
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530386 // cache the dataspace, to be used later to update SDM ColorMetaData
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400387 if (dataspace_ != dataspace) {
388 geometry_changes_ |= kDataspace;
389 dataspace_ = dataspace;
390 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500391 return HWC2::Error::None;
392}
393
394HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700395 LayerRect dst_rect = {};
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700396
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700397 SetRect(frame, &dst_rect);
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700398 if (dst_rect_ != dst_rect) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700399 geometry_changes_ |= kDisplayFrame;
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700400 dst_rect_ = dst_rect;
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700401 }
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700402
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500403 return HWC2::Error::None;
404}
405
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700406void HWCLayer::ResetPerFrameData() {
407 layer_->dst_rect = dst_rect_;
408 layer_->transform = layer_transform_;
409}
410
Pullakavi Srinivas68a166c2017-05-24 12:17:07 +0530411HWC2::Error HWCLayer::SetCursorPosition(int32_t x, int32_t y) {
412 hwc_rect_t frame = {};
413 frame.left = x;
414 frame.top = y;
415 frame.right = x + INT(layer_->dst_rect.right - layer_->dst_rect.left);
416 frame.bottom = y + INT(layer_->dst_rect.bottom - layer_->dst_rect.top);
417 SetLayerDisplayFrame(frame);
418
419 return HWC2::Error::None;
420}
421
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500422HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) {
Varun Arora2c23e582017-10-10 15:07:13 -0700423 if (alpha < 0.0f || alpha > 1.0f) {
424 return HWC2::Error::BadParameter;
425 }
426
427 // 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 -0700428 uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha));
Varun Arora2c23e582017-10-10 15:07:13 -0700429
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700430 if (layer_->plane_alpha != plane_alpha) {
431 geometry_changes_ |= kPlaneAlpha;
432 layer_->plane_alpha = plane_alpha;
433 }
434
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500435 return HWC2::Error::None;
436}
437
438HWC2::Error HWCLayer::SetLayerSourceCrop(hwc_frect_t crop) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700439 LayerRect src_rect = {};
440 SetRect(crop, &src_rect);
441 if (layer_->src_rect != src_rect) {
442 geometry_changes_ |= kSourceCrop;
443 layer_->src_rect = src_rect;
444 }
445
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500446 return HWC2::Error::None;
447}
448
449HWC2::Error HWCLayer::SetLayerTransform(HWC2::Transform transform) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700450 LayerTransform layer_transform = {};
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500451 switch (transform) {
452 case HWC2::Transform::FlipH:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700453 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500454 break;
455 case HWC2::Transform::FlipV:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700456 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500457 break;
458 case HWC2::Transform::Rotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700459 layer_transform.rotation = 90.0f;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500460 break;
461 case HWC2::Transform::Rotate180:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700462 layer_transform.flip_horizontal = true;
463 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500464 break;
465 case HWC2::Transform::Rotate270:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700466 layer_transform.rotation = 90.0f;
467 layer_transform.flip_horizontal = true;
468 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500469 break;
470 case HWC2::Transform::FlipHRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700471 layer_transform.rotation = 90.0f;
472 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500473 break;
474 case HWC2::Transform::FlipVRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700475 layer_transform.rotation = 90.0f;
476 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500477 break;
Arun Kumar K.R5f20a7a2016-06-17 16:03:54 -0700478 case HWC2::Transform::None:
Arun Kumar K.R5f20a7a2016-06-17 16:03:54 -0700479 break;
Varun Arora2c23e582017-10-10 15:07:13 -0700480 default:
481 // bad transform
482 return HWC2::Error::BadParameter;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500483 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700484
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700485 if (layer_transform_ != layer_transform) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700486 geometry_changes_ |= kTransform;
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700487 layer_transform_ = layer_transform;
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700488 }
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700489
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500490 return HWC2::Error::None;
491}
492
493HWC2::Error HWCLayer::SetLayerVisibleRegion(hwc_region_t visible) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700494 layer_->visible_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400495 for (uint32_t i = 0; i < visible.numRects; i++) {
496 LayerRect rect;
497 SetRect(visible.rects[i], &rect);
498 layer_->visible_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500499 }
500
501 return HWC2::Error::None;
502}
503
504HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700505 if (z_ != z) {
506 geometry_changes_ |= kZOrder;
507 z_ = z;
508 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500509 return HWC2::Error::None;
510}
511
512void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) {
513 target->left = FLOAT(source.left);
514 target->top = FLOAT(source.top);
515 target->right = FLOAT(source.right);
516 target->bottom = FLOAT(source.bottom);
517}
518
519void HWCLayer::SetRect(const hwc_frect_t &source, LayerRect *target) {
520 // Recommended way of rounding as in hwcomposer2.h - SetLayerSourceCrop
521 target->left = std::ceil(source.left);
522 target->top = std::ceil(source.top);
523 target->right = std::floor(source.right);
524 target->bottom = std::floor(source.bottom);
525}
526
527uint32_t HWCLayer::GetUint32Color(const hwc_color_t &source) {
528 // Returns 32 bit ARGB
529 uint32_t a = UINT32(source.a) << 24;
530 uint32_t r = UINT32(source.r) << 16;
531 uint32_t g = UINT32(source.g) << 8;
532 uint32_t b = UINT32(source.b);
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400533 uint32_t color = a | r | g | b;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500534 return color;
535}
536
537LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) {
538 LayerBufferFormat format = kFormatInvalid;
539 if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
540 switch (source) {
541 case HAL_PIXEL_FORMAT_RGBA_8888:
542 format = kFormatRGBA8888Ubwc;
543 break;
544 case HAL_PIXEL_FORMAT_RGBX_8888:
545 format = kFormatRGBX8888Ubwc;
546 break;
547 case HAL_PIXEL_FORMAT_BGR_565:
548 format = kFormatBGR565Ubwc;
549 break;
550 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
551 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
552 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
553 format = kFormatYCbCr420SPVenusUbwc;
554 break;
Saurabh Shah3cc87ed2017-10-24 14:09:35 -0700555 case HAL_PIXEL_FORMAT_RGBA_1010102:
556 format = kFormatRGBA1010102Ubwc;
557 break;
558 case HAL_PIXEL_FORMAT_RGBX_1010102:
559 format = kFormatRGBX1010102Ubwc;
560 break;
Arun Kumar K.R54885f02017-03-23 11:56:59 -0700561 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
562 format = kFormatYCbCr420TP10Ubwc;
563 break;
Rohit Kulkarni7943ec92016-12-20 18:18:46 -0800564 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
565 format = kFormatYCbCr420P010Ubwc;
566 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500567 default:
568 DLOGE("Unsupported format type for UBWC %d", source);
569 return kFormatInvalid;
570 }
571 return format;
572 }
573
574 switch (source) {
575 case HAL_PIXEL_FORMAT_RGBA_8888:
576 format = kFormatRGBA8888;
577 break;
578 case HAL_PIXEL_FORMAT_RGBA_5551:
579 format = kFormatRGBA5551;
580 break;
581 case HAL_PIXEL_FORMAT_RGBA_4444:
582 format = kFormatRGBA4444;
583 break;
584 case HAL_PIXEL_FORMAT_BGRA_8888:
585 format = kFormatBGRA8888;
586 break;
587 case HAL_PIXEL_FORMAT_RGBX_8888:
588 format = kFormatRGBX8888;
589 break;
590 case HAL_PIXEL_FORMAT_BGRX_8888:
591 format = kFormatBGRX8888;
592 break;
593 case HAL_PIXEL_FORMAT_RGB_888:
594 format = kFormatRGB888;
595 break;
Camus Wongc106d082017-03-31 16:07:29 -0400596 case HAL_PIXEL_FORMAT_BGR_888:
597 format = kFormatBGR888;
598 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500599 case HAL_PIXEL_FORMAT_RGB_565:
600 format = kFormatRGB565;
601 break;
602 case HAL_PIXEL_FORMAT_BGR_565:
603 format = kFormatBGR565;
604 break;
605 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
606 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
607 format = kFormatYCbCr420SemiPlanarVenus;
608 break;
609 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
610 format = kFormatYCrCb420SemiPlanarVenus;
611 break;
612 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
613 format = kFormatYCbCr420SPVenusUbwc;
614 break;
615 case HAL_PIXEL_FORMAT_YV12:
616 format = kFormatYCrCb420PlanarStride16;
617 break;
618 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
619 format = kFormatYCrCb420SemiPlanar;
620 break;
621 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
622 format = kFormatYCbCr420SemiPlanar;
623 break;
624 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
625 format = kFormatYCbCr422H2V1SemiPlanar;
626 break;
627 case HAL_PIXEL_FORMAT_YCbCr_422_I:
628 format = kFormatYCbCr422H2V1Packed;
629 break;
Camus Wongc106d082017-03-31 16:07:29 -0400630 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
631 format = kFormatCbYCrY422H2V1Packed;
632 break;
Naseer Ahmed72dea242016-05-03 19:13:07 -0400633 case HAL_PIXEL_FORMAT_RGBA_1010102:
634 format = kFormatRGBA1010102;
635 break;
636 case HAL_PIXEL_FORMAT_ARGB_2101010:
637 format = kFormatARGB2101010;
638 break;
639 case HAL_PIXEL_FORMAT_RGBX_1010102:
640 format = kFormatRGBX1010102;
641 break;
642 case HAL_PIXEL_FORMAT_XRGB_2101010:
643 format = kFormatXRGB2101010;
644 break;
645 case HAL_PIXEL_FORMAT_BGRA_1010102:
646 format = kFormatBGRA1010102;
647 break;
648 case HAL_PIXEL_FORMAT_ABGR_2101010:
649 format = kFormatABGR2101010;
650 break;
651 case HAL_PIXEL_FORMAT_BGRX_1010102:
652 format = kFormatBGRX1010102;
653 break;
654 case HAL_PIXEL_FORMAT_XBGR_2101010:
655 format = kFormatXBGR2101010;
656 break;
657 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
658 format = kFormatYCbCr420P010;
659 break;
660 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
661 format = kFormatYCbCr420TP10Ubwc;
662 break;
Rohit Kulkarni7943ec92016-12-20 18:18:46 -0800663 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
664 format = kFormatYCbCr420P010Ubwc;
665 break;
Mathew Joseph Karimpanala73082e2017-10-16 18:01:21 +0530666 case HAL_PIXEL_FORMAT_YCbCr_420_P010_VENUS:
667 format = kFormatYCbCr420P010Venus;
668 break;
Naseer Ahmed738da072018-01-24 14:41:46 -0500669 case HAL_PIXEL_FORMAT_RGBA_FP16:
670 format = kFormatInvalid;
671 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500672 default:
673 DLOGW("Unsupported format type = %d", source);
674 return kFormatInvalid;
675 }
676
677 return format;
678}
679
680LayerBufferS3DFormat HWCLayer::GetS3DFormat(uint32_t s3d_format) {
681 LayerBufferS3DFormat sdm_s3d_format = kS3dFormatNone;
682 switch (s3d_format) {
683 case HAL_NO_3D:
684 sdm_s3d_format = kS3dFormatNone;
685 break;
686 case HAL_3D_SIDE_BY_SIDE_L_R:
687 sdm_s3d_format = kS3dFormatLeftRight;
688 break;
689 case HAL_3D_SIDE_BY_SIDE_R_L:
690 sdm_s3d_format = kS3dFormatRightLeft;
691 break;
692 case HAL_3D_TOP_BOTTOM:
693 sdm_s3d_format = kS3dFormatTopBottom;
694 break;
695 default:
696 DLOGW("Invalid S3D format %d", s3d_format);
697 }
698 return sdm_s3d_format;
699}
700
Gurunath Ramaswamyf081afe2017-07-04 22:08:36 -0700701void HWCLayer::GetUBWCStatsFromMetaData(UBWCStats *cr_stats, UbwcCrStatsVector *cr_vec) {
702 // TODO(user): Check if we can use UBWCStats directly
703 // in layer_buffer or copy directly to Vector
704 if (cr_stats->bDataValid) {
705 switch (cr_stats->version) {
706 case UBWC_2_0:
707 cr_vec->push_back(std::make_pair(32, cr_stats->ubwc_stats.nCRStatsTile32));
708 cr_vec->push_back(std::make_pair(64, cr_stats->ubwc_stats.nCRStatsTile64));
709 cr_vec->push_back(std::make_pair(96, cr_stats->ubwc_stats.nCRStatsTile96));
710 cr_vec->push_back(std::make_pair(128, cr_stats->ubwc_stats.nCRStatsTile128));
711 cr_vec->push_back(std::make_pair(160, cr_stats->ubwc_stats.nCRStatsTile160));
712 cr_vec->push_back(std::make_pair(192, cr_stats->ubwc_stats.nCRStatsTile192));
713 cr_vec->push_back(std::make_pair(256, cr_stats->ubwc_stats.nCRStatsTile256));
714 break;
715 default:
716 DLOGW("Invalid UBWC Version %d", cr_stats->version);
717 break;
718 } // switch(cr_stats->version)
719 } // if (cr_stats->bDatvalid)
720}
721
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500722DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) {
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800723 LayerBuffer *layer_buffer = &layer->input_buffer;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800724 private_handle_t *handle = const_cast<private_handle_t *>(pvt_handle);
725 IGC_t igc = {};
Sushil Chauhan409e8442017-06-12 17:43:25 -0700726 LayerIGC layer_igc = layer_buffer->igc;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800727 if (getMetaData(handle, GET_IGC, &igc) == 0) {
Sushil Chauhan409e8442017-06-12 17:43:25 -0700728 if (SetIGC(igc, &layer_igc) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500729 return kErrorNotSupported;
730 }
731 }
732
Anjaneya Prasad Musunurid47d15b2017-08-03 10:57:51 +0530733 float fps = 0;
Sushil Chauhan409e8442017-06-12 17:43:25 -0700734 uint32_t frame_rate = layer->frame_rate;
735 if (getMetaData(handle, GET_REFRESH_RATE, &fps) == 0) {
Sushil Chauhan0935c752018-01-19 10:58:13 -0800736 frame_rate = (fps != 0) ? RoundToStandardFPS(fps) : layer->frame_rate;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500737 }
738
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800739 int32_t interlaced = 0;
Sushil Chauhan409e8442017-06-12 17:43:25 -0700740 bool interlace = layer_buffer->flags.interlace;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800741 if (getMetaData(handle, GET_PP_PARAM_INTERLACED, &interlaced) == 0) {
Sushil Chauhan409e8442017-06-12 17:43:25 -0700742 interlace = interlaced ? true : false;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500743 }
Saurabh Dubeyd90a6a42017-10-24 16:28:01 +0530744 if (interlace != layer_buffer->flags.interlace) {
745 DLOGI("Layer buffer interlaced metadata has changed. old=%d, new=%d",
746 layer_buffer->flags.interlace, interlace);
747 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500748
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800749 uint32_t linear_format = 0;
750 if (getMetaData(handle, GET_LINEAR_FORMAT, &linear_format) == 0) {
751 layer_buffer->format = GetSDMFormat(INT32(linear_format), 0);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500752 }
753
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800754 uint32_t s3d = 0;
Sushil Chauhan409e8442017-06-12 17:43:25 -0700755 LayerBufferS3DFormat s3d_format = layer_buffer->s3d_format;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800756 if (getMetaData(handle, GET_S3D_FORMAT, &s3d) == 0) {
Sushil Chauhan409e8442017-06-12 17:43:25 -0700757 s3d_format = GetS3DFormat(s3d);
758 }
759
760 if ((layer_igc != layer_buffer->igc) || (interlace != layer_buffer->flags.interlace) ||
761 (frame_rate != layer->frame_rate) || (s3d_format != layer_buffer->s3d_format)) {
762 // Layer buffer metadata has changed.
763 needs_validate_ = true;
764 layer_buffer->igc = layer_igc;
765 layer->frame_rate = frame_rate;
766 layer_buffer->s3d_format = s3d_format;
767 layer_buffer->flags.interlace = interlace;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500768 }
769
Gurunath Ramaswamyf081afe2017-07-04 22:08:36 -0700770 // Check if metadata is set
771 struct UBWCStats cr_stats[NUM_UBWC_CR_STATS_LAYERS] = {};
772
773 for (int i = 0; i < NUM_UBWC_CR_STATS_LAYERS; i++) {
774 layer_buffer->ubwc_crstats[i].clear();
775 }
776
777 if (getMetaData(handle, GET_UBWC_CR_STATS_INFO, cr_stats) == 0) {
778 // Only copy top layer for now as only top field for interlaced is used
779 GetUBWCStatsFromMetaData(&cr_stats[0], &(layer_buffer->ubwc_crstats[0]));
780 } // if (getMetaData)
781
Ramakant Singhae057092017-08-31 12:34:54 +0530782 single_buffer_ = false;
783 getMetaData(const_cast<private_handle_t *>(handle), GET_SINGLE_BUFFER_MODE, &single_buffer_);
784
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500785 return kErrorNone;
786}
787
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500788DisplayError HWCLayer::SetIGC(IGC_t source, LayerIGC *target) {
789 switch (source) {
790 case IGC_NotSpecified:
791 *target = kIGCNotSpecified;
792 break;
793 case IGC_sRGB:
794 *target = kIGCsRGB;
795 break;
796 default:
797 DLOGE("Unsupported IGC: %d", source);
798 return kErrorNotSupported;
799 }
800
801 return kErrorNone;
802}
803
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530804bool HWCLayer::ValidateAndSetCSC() {
805 if (client_requested_ != HWC2::Composition::Device &&
806 client_requested_ != HWC2::Composition::Cursor) {
807 // Check the layers which are configured to Device
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400808 return true;
809 }
810
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400811 LayerBuffer *layer_buffer = &layer_->input_buffer;
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530812 bool use_color_metadata = true;
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530813 ColorMetaData csc = {};
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530814 if (dataspace_ != HAL_DATASPACE_UNKNOWN) {
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530815 use_color_metadata = false;
816 bool valid_csc = GetSDMColorSpace(dataspace_, &csc);
817 if (!valid_csc) {
818 return false;
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530819 }
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530820 // if we are here here, update the sdm layer csc.
821 layer_buffer->color_metadata.transfer = csc.transfer;
822 layer_buffer->color_metadata.colorPrimaries = csc.colorPrimaries;
823 layer_buffer->color_metadata.range = csc.range;
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530824 }
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530825
Arun Kumar K.R80e58eb2017-07-13 10:37:00 +0530826 if (IsBT2020(layer_buffer->color_metadata.colorPrimaries)) {
827 // android_dataspace_t doesnt support mastering display and light levels
828 // so retrieve it from metadata for BT2020(HDR)
829 use_color_metadata = true;
830 }
831
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530832 if (use_color_metadata) {
833 const private_handle_t *handle =
834 reinterpret_cast<const private_handle_t *>(layer_buffer->buffer_id);
835 if (sdm::SetCSC(handle, &layer_buffer->color_metadata) != kErrorNone) {
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400836 return false;
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530837 }
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400838 }
839
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400840 return true;
841}
842
843
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400844uint32_t HWCLayer::RoundToStandardFPS(float fps) {
845 static const uint32_t standard_fps[4] = {24, 30, 48, 60};
846 uint32_t frame_rate = (uint32_t)(fps);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500847
848 int count = INT(sizeof(standard_fps) / sizeof(standard_fps[0]));
849 for (int i = 0; i < count; i++) {
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400850 if ((standard_fps[i] - frame_rate) < 2) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500851 // Most likely used for video, the fps can fluctuate
852 // Ex: b/w 29 and 30 for 30 fps clip
853 return standard_fps[i];
854 }
855 }
856
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400857 return frame_rate;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500858}
859
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700860void HWCLayer::SetComposition(const LayerComposition &sdm_composition) {
861 auto hwc_composition = HWC2::Composition::Invalid;
862 switch (sdm_composition) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500863 case kCompositionGPU:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700864 hwc_composition = HWC2::Composition::Client;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500865 break;
Saurabh Shaha4af3de2017-04-19 17:15:24 -0700866 case kCompositionCursor:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700867 hwc_composition = HWC2::Composition::Cursor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500868 break;
869 default:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700870 hwc_composition = HWC2::Composition::Device;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500871 break;
872 }
873 // Update solid fill composition
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700874 if (sdm_composition == kCompositionSDE && layer_->flags.solid_fill != 0) {
875 hwc_composition = HWC2::Composition::SolidColor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500876 }
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700877 device_selected_ = hwc_composition;
878
879 return;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500880}
Ramkumar Radhakrishnan00698de2018-01-17 11:39:33 -0800881
882void HWCLayer::PushBackReleaseFence(int32_t fence) {
883 release_fences_.push_back(fence);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500884}
Ramkumar Radhakrishnan00698de2018-01-17 11:39:33 -0800885
886int32_t HWCLayer::PopBackReleaseFence() {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500887 if (release_fences_.empty())
888 return -1;
Ramkumar Radhakrishnan00698de2018-01-17 11:39:33 -0800889
890 auto fence = release_fences_.back();
891 release_fences_.pop_back();
892
893 return fence;
894}
895
896int32_t HWCLayer::PopFrontReleaseFence() {
897 if (release_fences_.empty())
898 return -1;
899
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500900 auto fence = release_fences_.front();
Ramkumar Radhakrishnan00698de2018-01-17 11:39:33 -0800901 release_fences_.pop_front();
902
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500903 return fence;
904}
905
Ramakant Singhae057092017-08-31 12:34:54 +0530906bool HWCLayer::IsRotationPresent() {
907 return ((layer_->transform.rotation != 0.0f) ||
908 layer_->transform.flip_horizontal ||
909 layer_->transform.flip_vertical);
910}
911
912bool HWCLayer::IsScalingPresent() {
913 uint32_t src_width = static_cast<uint32_t>(layer_->src_rect.right - layer_->src_rect.left);
914 uint32_t src_height = static_cast<uint32_t>(layer_->src_rect.bottom - layer_->src_rect.top);
915 uint32_t dst_width = static_cast<uint32_t>(layer_->dst_rect.right - layer_->dst_rect.left);
916 uint32_t dst_height = static_cast<uint32_t>(layer_->dst_rect.bottom - layer_->dst_rect.top);
917
918 return ((src_width != dst_width) || (dst_height != src_height));
919}
920
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500921} // namespace sdm