blob: 6b5d470aed9a3ad72821b60f9cb3b69eba57920b [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>
Gurunath Ramaswamyf081afe2017-07-04 22:08:36 -070021#include <utility>
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080022#include <qdMetaData.h>
23
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050024#include "hwc_layers.h"
Naseer Ahmed42752212017-01-27 17:32:21 -050025#ifndef USE_GRALLOC1
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050026#include <gr.h>
Naseer Ahmed42752212017-01-27 17:32:21 -050027#endif
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050028#include <utils/debug.h>
29#include <cmath>
30
31#define __CLASS__ "HWCLayer"
32
33namespace sdm {
34
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050035std::atomic<hwc2_layer_t> HWCLayer::next_id_(1);
36
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080037DisplayError SetCSC(const private_handle_t *pvt_handle, ColorMetaData *color_metadata) {
38 if (getMetaData(const_cast<private_handle_t *>(pvt_handle), GET_COLOR_METADATA,
39 color_metadata) != 0) {
40 ColorSpace_t csc = ITU_R_601;
41 if (getMetaData(const_cast<private_handle_t *>(pvt_handle), GET_COLOR_SPACE,
42 &csc) == 0) {
43 if (csc == ITU_R_601_FR || csc == ITU_R_2020_FR) {
44 color_metadata->range = Range_Full;
45 }
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070046
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080047 switch (csc) {
48 case ITU_R_601:
49 case ITU_R_601_FR:
50 // video and display driver uses 601_525
51 color_metadata->colorPrimaries = ColorPrimaries_BT601_6_525;
52 break;
53 case ITU_R_709:
54 color_metadata->colorPrimaries = ColorPrimaries_BT709_5;
55 break;
56 case ITU_R_2020:
57 case ITU_R_2020_FR:
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070058 color_metadata->colorPrimaries = ColorPrimaries_BT2020;
59 break;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -080060 default:
61 DLOGE("Unsupported CSC: %d", csc);
62 return kErrorNotSupported;
63 }
64 } else {
Arun Kumar K.Rbc0addf2016-10-03 22:38:16 -070065 return kErrorNotSupported;
66 }
67 }
68
69 return kErrorNone;
70}
71
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050072// Layer operations
Naseer Ahmed42752212017-01-27 17:32:21 -050073HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator)
74 : id_(next_id_++), display_id_(display_id), buffer_allocator_(buf_allocator) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050075 layer_ = new Layer();
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050076 // Fences are deferred, so the first time this layer is presented, return -1
77 // TODO(user): Verify that fences are properly obtained on suspend/resume
78 release_fences_.push(-1);
79}
80
81HWCLayer::~HWCLayer() {
82 // Close any fences left for this layer
83 while (!release_fences_.empty()) {
84 close(release_fences_.front());
85 release_fences_.pop();
86 }
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -040087 close(ion_fd_);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050088 if (layer_) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -050089 delete layer_;
90 }
91}
92
93HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence) {
94 if (!buffer) {
Naseer Ahmed2f71fd02017-06-01 19:55:39 -040095 if (client_requested_ == HWC2::Composition::Device ||
96 client_requested_ == HWC2::Composition::Cursor) {
97 DLOGE("Invalid buffer handle: %p on layer: %d", buffer, id_);
98 return HWC2::Error::BadParameter;
99 } else {
100 return HWC2::Error::None;
101 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500102 }
103
Naseer Ahmede3f007a2016-06-07 18:13:28 -0400104 if (acquire_fence == 0) {
105 DLOGE("acquire_fence is zero");
106 return HWC2::Error::BadParameter;
107 }
108
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500109 const private_handle_t *handle = static_cast<const private_handle_t *>(buffer);
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400110
111 // Validate and dup ion fd from surfaceflinger
112 // This works around bug 30281222
113 if (handle->fd < 0) {
114 return HWC2::Error::BadParameter;
115 } else {
116 close(ion_fd_);
117 ion_fd_ = dup(handle->fd);
118 }
119
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800120 LayerBuffer *layer_buffer = &layer_->input_buffer;
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700121 int aligned_width, aligned_height;
Naseer Ahmed42752212017-01-27 17:32:21 -0500122#ifdef USE_GRALLOC1
123 buffer_allocator_->GetCustomWidthAndHeight(handle, &aligned_width, &aligned_height);
124#else
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700125 AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(handle, aligned_width, aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500126#endif
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700127
128 layer_buffer->width = UINT32(aligned_width);
129 layer_buffer->height = UINT32(aligned_height);
Naseer Ahmed42752212017-01-27 17:32:21 -0500130 layer_buffer->unaligned_width = UINT32(handle->unaligned_width);
131 layer_buffer->unaligned_height = UINT32(handle->unaligned_height);
Ramkumar Radhakrishnanb27735f2016-08-26 22:37:23 -0700132
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500133 layer_buffer->format = GetSDMFormat(handle->format, handle->flags);
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800134 if (SetMetaData(const_cast<private_handle_t *>(handle), layer_) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500135 return HWC2::Error::BadLayer;
136 }
137
Naseer Ahmed42752212017-01-27 17:32:21 -0500138#ifdef USE_GRALLOC1
139 // TODO(user): Clean this up
140 if (handle->buffer_type == BUFFER_TYPE_VIDEO) {
141#else
142 if (handle->bufferType == BUFFER_TYPE_VIDEO) {
143#endif
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500144 layer_buffer->flags.video = true;
145 }
146 // TZ Protected Buffer - L1
147 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER) {
148 layer_buffer->flags.secure = true;
Sushil Chauhandfe55a22016-09-12 15:48:29 -0700149 if (handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE) {
150 layer_buffer->flags.secure_camera = true;
151 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500152 }
153 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY) {
154 layer_buffer->flags.secure_display = true;
155 }
156
Naseer Ahmed6fe11ed2016-08-26 21:15:44 -0400157 layer_buffer->planes[0].fd = ion_fd_;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500158 layer_buffer->planes[0].offset = handle->offset;
159 layer_buffer->planes[0].stride = UINT32(handle->width);
160 layer_buffer->acquire_fence_fd = acquire_fence;
Naseer Ahmed18630d32016-10-26 16:14:19 -0400161 layer_buffer->size = handle->size;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500162 layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle);
163
164 return HWC2::Error::None;
165}
166
167HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700168 layer_->dirty_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400169 for (uint32_t i = 0; i < damage.numRects; i++) {
170 LayerRect rect;
171 SetRect(damage.rects[i], &rect);
172 layer_->dirty_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500173 }
174 return HWC2::Error::None;
175}
176
177HWC2::Error HWCLayer::SetLayerBlendMode(HWC2::BlendMode mode) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700178 LayerBlending blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500179 switch (mode) {
180 case HWC2::BlendMode::Coverage:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700181 blending = kBlendingCoverage;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500182 break;
183 case HWC2::BlendMode::Premultiplied:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700184 blending = kBlendingPremultiplied;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500185 break;
186 case HWC2::BlendMode::None:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700187 blending = kBlendingOpaque;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500188 break;
189 default:
190 return HWC2::Error::BadParameter;
191 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700192
193 if (layer_->blending != blending) {
194 geometry_changes_ |= kBlendMode;
195 layer_->blending = blending;
196 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500197 return HWC2::Error::None;
198}
199
200HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) {
201 layer_->solid_fill_color = GetUint32Color(color);
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800202 layer_->input_buffer.format = kFormatARGB8888;
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400203 DLOGV_IF(kTagCompManager, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_,
204 layer_->solid_fill_color);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500205 return HWC2::Error::None;
206}
207
208HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700209 client_requested_ = type;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500210 switch (type) {
211 case HWC2::Composition::Client:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500212 break;
213 case HWC2::Composition::Device:
214 // We try and default to this in SDM
215 break;
216 case HWC2::Composition::SolidColor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500217 break;
218 case HWC2::Composition::Cursor:
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500219 break;
220 case HWC2::Composition::Invalid:
221 return HWC2::Error::BadParameter;
222 default:
223 return HWC2::Error::Unsupported;
224 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700225
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500226 return HWC2::Error::None;
227}
228
229HWC2::Error HWCLayer::SetLayerDataspace(int32_t dataspace) {
Naseer Ahmed43f22bb2017-05-05 17:40:46 -0400230 // Map deprecated dataspace values to appropriate
231 // new enums
232 if (dataspace & 0xffff) {
233 switch (dataspace & 0xffff) {
234 case HAL_DATASPACE_SRGB:
235 dataspace = HAL_DATASPACE_V0_SRGB;
236 break;
237 case HAL_DATASPACE_JFIF:
238 dataspace = HAL_DATASPACE_V0_JFIF;
239 break;
240 case HAL_DATASPACE_SRGB_LINEAR:
241 dataspace = HAL_DATASPACE_V0_SRGB_LINEAR;
242 break;
243 case HAL_DATASPACE_BT601_625:
244 dataspace = HAL_DATASPACE_V0_BT601_625;
245 break;
246 case HAL_DATASPACE_BT601_525:
247 dataspace = HAL_DATASPACE_V0_BT601_525;
248 break;
249 case HAL_DATASPACE_BT709:
250 dataspace = HAL_DATASPACE_V0_BT709;
251 break;
252 default:
253 // unknown legacy dataspace
254 DLOGW_IF(kTagQDCM, "Unsupported dataspace type %d", dataspace);
255 }
256 }
257
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530258 // cache the dataspace, to be used later to update SDM ColorMetaData
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400259 if (dataspace_ != dataspace) {
260 geometry_changes_ |= kDataspace;
261 dataspace_ = dataspace;
262 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500263 return HWC2::Error::None;
264}
265
266HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700267 LayerRect dst_rect = {};
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700268
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700269 SetRect(frame, &dst_rect);
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700270 if (dst_rect_ != dst_rect) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700271 geometry_changes_ |= kDisplayFrame;
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700272 dst_rect_ = dst_rect;
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700273 }
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700274
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500275 return HWC2::Error::None;
276}
277
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700278void HWCLayer::ResetPerFrameData() {
279 layer_->dst_rect = dst_rect_;
280 layer_->transform = layer_transform_;
281}
282
Pullakavi Srinivas68a166c2017-05-24 12:17:07 +0530283HWC2::Error HWCLayer::SetCursorPosition(int32_t x, int32_t y) {
284 hwc_rect_t frame = {};
285 frame.left = x;
286 frame.top = y;
287 frame.right = x + INT(layer_->dst_rect.right - layer_->dst_rect.left);
288 frame.bottom = y + INT(layer_->dst_rect.bottom - layer_->dst_rect.top);
289 SetLayerDisplayFrame(frame);
290
291 return HWC2::Error::None;
292}
293
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500294HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) {
295 // 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 -0700296 uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha));
297 if (layer_->plane_alpha != plane_alpha) {
298 geometry_changes_ |= kPlaneAlpha;
299 layer_->plane_alpha = plane_alpha;
300 }
301
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500302 return HWC2::Error::None;
303}
304
305HWC2::Error HWCLayer::SetLayerSourceCrop(hwc_frect_t crop) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700306 LayerRect src_rect = {};
307 SetRect(crop, &src_rect);
308 if (layer_->src_rect != src_rect) {
309 geometry_changes_ |= kSourceCrop;
310 layer_->src_rect = src_rect;
311 }
312
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500313 return HWC2::Error::None;
314}
315
316HWC2::Error HWCLayer::SetLayerTransform(HWC2::Transform transform) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700317 LayerTransform layer_transform = {};
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500318 switch (transform) {
319 case HWC2::Transform::FlipH:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700320 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500321 break;
322 case HWC2::Transform::FlipV:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700323 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500324 break;
325 case HWC2::Transform::Rotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700326 layer_transform.rotation = 90.0f;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500327 break;
328 case HWC2::Transform::Rotate180:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700329 layer_transform.flip_horizontal = true;
330 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500331 break;
332 case HWC2::Transform::Rotate270:
Arun Kumar K.Rf641dff2016-06-16 13:20:02 -0700333 layer_transform.rotation = 90.0f;
334 layer_transform.flip_horizontal = true;
335 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500336 break;
337 case HWC2::Transform::FlipHRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700338 layer_transform.rotation = 90.0f;
339 layer_transform.flip_horizontal = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500340 break;
341 case HWC2::Transform::FlipVRotate90:
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700342 layer_transform.rotation = 90.0f;
343 layer_transform.flip_vertical = true;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500344 break;
Arun Kumar K.R5f20a7a2016-06-17 16:03:54 -0700345 case HWC2::Transform::None:
346 // do nothing
347 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500348 }
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700349
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700350 if (layer_transform_ != layer_transform) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700351 geometry_changes_ |= kTransform;
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700352 layer_transform_ = layer_transform;
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700353 }
Prabhanjan Kandula5265b052017-05-30 17:13:40 -0700354
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500355 return HWC2::Error::None;
356}
357
358HWC2::Error HWCLayer::SetLayerVisibleRegion(hwc_region_t visible) {
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700359 layer_->visible_regions.clear();
Naseer Ahmed6786e5d2016-06-24 16:38:52 -0400360 for (uint32_t i = 0; i < visible.numRects; i++) {
361 LayerRect rect;
362 SetRect(visible.rects[i], &rect);
363 layer_->visible_regions.push_back(rect);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500364 }
365
366 return HWC2::Error::None;
367}
368
369HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
Arun Kumar K.R3e89f792016-06-01 17:14:15 -0700370 if (z_ != z) {
371 geometry_changes_ |= kZOrder;
372 z_ = z;
373 }
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500374 return HWC2::Error::None;
375}
376
377void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) {
378 target->left = FLOAT(source.left);
379 target->top = FLOAT(source.top);
380 target->right = FLOAT(source.right);
381 target->bottom = FLOAT(source.bottom);
382}
383
384void HWCLayer::SetRect(const hwc_frect_t &source, LayerRect *target) {
385 // Recommended way of rounding as in hwcomposer2.h - SetLayerSourceCrop
386 target->left = std::ceil(source.left);
387 target->top = std::ceil(source.top);
388 target->right = std::floor(source.right);
389 target->bottom = std::floor(source.bottom);
390}
391
392uint32_t HWCLayer::GetUint32Color(const hwc_color_t &source) {
393 // Returns 32 bit ARGB
394 uint32_t a = UINT32(source.a) << 24;
395 uint32_t r = UINT32(source.r) << 16;
396 uint32_t g = UINT32(source.g) << 8;
397 uint32_t b = UINT32(source.b);
Naseer Ahmed16c72b92016-07-22 20:02:31 -0400398 uint32_t color = a | r | g | b;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500399 return color;
400}
401
402LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) {
403 LayerBufferFormat format = kFormatInvalid;
404 if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
405 switch (source) {
406 case HAL_PIXEL_FORMAT_RGBA_8888:
407 format = kFormatRGBA8888Ubwc;
408 break;
409 case HAL_PIXEL_FORMAT_RGBX_8888:
410 format = kFormatRGBX8888Ubwc;
411 break;
412 case HAL_PIXEL_FORMAT_BGR_565:
413 format = kFormatBGR565Ubwc;
414 break;
415 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
416 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
417 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
418 format = kFormatYCbCr420SPVenusUbwc;
419 break;
Arun Kumar K.R54885f02017-03-23 11:56:59 -0700420 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
421 format = kFormatYCbCr420TP10Ubwc;
422 break;
Rohit Kulkarni7943ec92016-12-20 18:18:46 -0800423 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
424 format = kFormatYCbCr420P010Ubwc;
425 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500426 default:
427 DLOGE("Unsupported format type for UBWC %d", source);
428 return kFormatInvalid;
429 }
430 return format;
431 }
432
433 switch (source) {
434 case HAL_PIXEL_FORMAT_RGBA_8888:
435 format = kFormatRGBA8888;
436 break;
437 case HAL_PIXEL_FORMAT_RGBA_5551:
438 format = kFormatRGBA5551;
439 break;
440 case HAL_PIXEL_FORMAT_RGBA_4444:
441 format = kFormatRGBA4444;
442 break;
443 case HAL_PIXEL_FORMAT_BGRA_8888:
444 format = kFormatBGRA8888;
445 break;
446 case HAL_PIXEL_FORMAT_RGBX_8888:
447 format = kFormatRGBX8888;
448 break;
449 case HAL_PIXEL_FORMAT_BGRX_8888:
450 format = kFormatBGRX8888;
451 break;
452 case HAL_PIXEL_FORMAT_RGB_888:
453 format = kFormatRGB888;
454 break;
Camus Wongc106d082017-03-31 16:07:29 -0400455 case HAL_PIXEL_FORMAT_BGR_888:
456 format = kFormatBGR888;
457 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500458 case HAL_PIXEL_FORMAT_RGB_565:
459 format = kFormatRGB565;
460 break;
461 case HAL_PIXEL_FORMAT_BGR_565:
462 format = kFormatBGR565;
463 break;
464 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
465 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
466 format = kFormatYCbCr420SemiPlanarVenus;
467 break;
468 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
469 format = kFormatYCrCb420SemiPlanarVenus;
470 break;
471 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
472 format = kFormatYCbCr420SPVenusUbwc;
473 break;
474 case HAL_PIXEL_FORMAT_YV12:
475 format = kFormatYCrCb420PlanarStride16;
476 break;
477 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
478 format = kFormatYCrCb420SemiPlanar;
479 break;
480 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
481 format = kFormatYCbCr420SemiPlanar;
482 break;
483 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
484 format = kFormatYCbCr422H2V1SemiPlanar;
485 break;
486 case HAL_PIXEL_FORMAT_YCbCr_422_I:
487 format = kFormatYCbCr422H2V1Packed;
488 break;
Camus Wongc106d082017-03-31 16:07:29 -0400489 case HAL_PIXEL_FORMAT_CbYCrY_422_I:
490 format = kFormatCbYCrY422H2V1Packed;
491 break;
Naseer Ahmed72dea242016-05-03 19:13:07 -0400492 case HAL_PIXEL_FORMAT_RGBA_1010102:
493 format = kFormatRGBA1010102;
494 break;
495 case HAL_PIXEL_FORMAT_ARGB_2101010:
496 format = kFormatARGB2101010;
497 break;
498 case HAL_PIXEL_FORMAT_RGBX_1010102:
499 format = kFormatRGBX1010102;
500 break;
501 case HAL_PIXEL_FORMAT_XRGB_2101010:
502 format = kFormatXRGB2101010;
503 break;
504 case HAL_PIXEL_FORMAT_BGRA_1010102:
505 format = kFormatBGRA1010102;
506 break;
507 case HAL_PIXEL_FORMAT_ABGR_2101010:
508 format = kFormatABGR2101010;
509 break;
510 case HAL_PIXEL_FORMAT_BGRX_1010102:
511 format = kFormatBGRX1010102;
512 break;
513 case HAL_PIXEL_FORMAT_XBGR_2101010:
514 format = kFormatXBGR2101010;
515 break;
516 case HAL_PIXEL_FORMAT_YCbCr_420_P010:
517 format = kFormatYCbCr420P010;
518 break;
519 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
520 format = kFormatYCbCr420TP10Ubwc;
521 break;
Rohit Kulkarni7943ec92016-12-20 18:18:46 -0800522 case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
523 format = kFormatYCbCr420P010Ubwc;
524 break;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500525 default:
526 DLOGW("Unsupported format type = %d", source);
527 return kFormatInvalid;
528 }
529
530 return format;
531}
532
533LayerBufferS3DFormat HWCLayer::GetS3DFormat(uint32_t s3d_format) {
534 LayerBufferS3DFormat sdm_s3d_format = kS3dFormatNone;
535 switch (s3d_format) {
536 case HAL_NO_3D:
537 sdm_s3d_format = kS3dFormatNone;
538 break;
539 case HAL_3D_SIDE_BY_SIDE_L_R:
540 sdm_s3d_format = kS3dFormatLeftRight;
541 break;
542 case HAL_3D_SIDE_BY_SIDE_R_L:
543 sdm_s3d_format = kS3dFormatRightLeft;
544 break;
545 case HAL_3D_TOP_BOTTOM:
546 sdm_s3d_format = kS3dFormatTopBottom;
547 break;
548 default:
549 DLOGW("Invalid S3D format %d", s3d_format);
550 }
551 return sdm_s3d_format;
552}
553
Gurunath Ramaswamyf081afe2017-07-04 22:08:36 -0700554void HWCLayer::GetUBWCStatsFromMetaData(UBWCStats *cr_stats, UbwcCrStatsVector *cr_vec) {
555 // TODO(user): Check if we can use UBWCStats directly
556 // in layer_buffer or copy directly to Vector
557 if (cr_stats->bDataValid) {
558 switch (cr_stats->version) {
559 case UBWC_2_0:
560 cr_vec->push_back(std::make_pair(32, cr_stats->ubwc_stats.nCRStatsTile32));
561 cr_vec->push_back(std::make_pair(64, cr_stats->ubwc_stats.nCRStatsTile64));
562 cr_vec->push_back(std::make_pair(96, cr_stats->ubwc_stats.nCRStatsTile96));
563 cr_vec->push_back(std::make_pair(128, cr_stats->ubwc_stats.nCRStatsTile128));
564 cr_vec->push_back(std::make_pair(160, cr_stats->ubwc_stats.nCRStatsTile160));
565 cr_vec->push_back(std::make_pair(192, cr_stats->ubwc_stats.nCRStatsTile192));
566 cr_vec->push_back(std::make_pair(256, cr_stats->ubwc_stats.nCRStatsTile256));
567 break;
568 default:
569 DLOGW("Invalid UBWC Version %d", cr_stats->version);
570 break;
571 } // switch(cr_stats->version)
572 } // if (cr_stats->bDatvalid)
573}
574
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500575DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) {
Arun Kumar K.R9c19cdd2016-11-21 16:48:43 -0800576 LayerBuffer *layer_buffer = &layer->input_buffer;
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800577 private_handle_t *handle = const_cast<private_handle_t *>(pvt_handle);
578 IGC_t igc = {};
579 if (getMetaData(handle, GET_IGC, &igc) == 0) {
580 if (SetIGC(igc, &layer_buffer->igc) != kErrorNone) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500581 return kErrorNotSupported;
582 }
583 }
584
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800585 uint32_t fps = 0;
586 if (getMetaData(handle, GET_REFRESH_RATE , &fps) == 0) {
587 layer->frame_rate = RoundToStandardFPS(fps);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500588 }
589
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800590 int32_t interlaced = 0;
591 if (getMetaData(handle, GET_PP_PARAM_INTERLACED, &interlaced) == 0) {
592 layer_buffer->flags.interlace = interlaced ? true : false;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500593 }
594
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800595 uint32_t linear_format = 0;
596 if (getMetaData(handle, GET_LINEAR_FORMAT, &linear_format) == 0) {
597 layer_buffer->format = GetSDMFormat(INT32(linear_format), 0);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500598 }
599
Arun Kumar K.R3e45ac42017-03-08 19:00:02 -0800600 uint32_t s3d = 0;
601 if (getMetaData(handle, GET_S3D_FORMAT, &s3d) == 0) {
602 layer_buffer->s3d_format = GetS3DFormat(s3d);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500603 }
604
Gurunath Ramaswamyf081afe2017-07-04 22:08:36 -0700605 // Check if metadata is set
606 struct UBWCStats cr_stats[NUM_UBWC_CR_STATS_LAYERS] = {};
607
608 for (int i = 0; i < NUM_UBWC_CR_STATS_LAYERS; i++) {
609 layer_buffer->ubwc_crstats[i].clear();
610 }
611
612 if (getMetaData(handle, GET_UBWC_CR_STATS_INFO, cr_stats) == 0) {
613 // Only copy top layer for now as only top field for interlaced is used
614 GetUBWCStatsFromMetaData(&cr_stats[0], &(layer_buffer->ubwc_crstats[0]));
615 } // if (getMetaData)
616
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500617 return kErrorNone;
618}
619
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500620DisplayError HWCLayer::SetIGC(IGC_t source, LayerIGC *target) {
621 switch (source) {
622 case IGC_NotSpecified:
623 *target = kIGCNotSpecified;
624 break;
625 case IGC_sRGB:
626 *target = kIGCsRGB;
627 break;
628 default:
629 DLOGE("Unsupported IGC: %d", source);
630 return kErrorNotSupported;
631 }
632
633 return kErrorNone;
634}
635
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400636
637
638bool HWCLayer::SupportLocalConversion(ColorPrimaries working_primaries) {
639 if (layer_->input_buffer.color_metadata.colorPrimaries <= ColorPrimaries_BT601_6_525 &&
640 working_primaries <= ColorPrimaries_BT601_6_525) {
641 return true;
642 }
643 return false;
644}
645
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530646bool HWCLayer::ValidateAndSetCSC() {
647 if (client_requested_ != HWC2::Composition::Device &&
648 client_requested_ != HWC2::Composition::Cursor) {
649 // Check the layers which are configured to Device
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400650 return true;
651 }
652
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530653 // Retrieve ColorMetaData from android_data_space_t (STANDARD|TRANSFER|RANGE)
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400654 LayerBuffer *layer_buffer = &layer_->input_buffer;
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530655 bool use_color_metadata = true;
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400656
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530657#ifdef FEATURE_WIDE_COLOR
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400658 GammaTransfer sdm_transfer = {};
659 ColorPrimaries sdm_primaries = {};
660 ColorRange sdm_range = {};
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530661 if (dataspace_ != HAL_DATASPACE_UNKNOWN) {
662 use_color_metadata = false; // avoid using color_metadata
663 auto transfer = dataspace_ & HAL_DATASPACE_TRANSFER_MASK;
664 // Handle transfer
665 switch (transfer) {
666 case HAL_DATASPACE_TRANSFER_SRGB:
667 sdm_transfer = Transfer_sRGB;
668 break;
669 case HAL_DATASPACE_TRANSFER_SMPTE_170M:
670 sdm_transfer = Transfer_SMPTE_170M;
671 break;
672 case HAL_DATASPACE_TRANSFER_ST2084:
673 sdm_transfer = Transfer_SMPTE_ST2084;
674 break;
675 case HAL_DATASPACE_TRANSFER_HLG:
676 sdm_transfer = Transfer_HLG;
677 break;
678 case HAL_DATASPACE_TRANSFER_LINEAR:
679 sdm_transfer = Transfer_Linear;
680 break;
681 case HAL_DATASPACE_TRANSFER_GAMMA2_2:
682 sdm_transfer = Transfer_Gamma2_2;
683 break;
684 default:
685 DLOGV_IF(kTagStrategy, "Unsupported Transfer Request = %d", transfer);
686 return false;
687 }
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400688
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530689 // Handle standard
690 auto standard = dataspace_ & HAL_DATASPACE_STANDARD_MASK;
691 switch (standard) {
692 case HAL_DATASPACE_STANDARD_BT709:
693 sdm_primaries = ColorPrimaries_BT709_5;
694 break;
695 case HAL_DATASPACE_STANDARD_BT601_525:
696 case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
697 sdm_primaries = ColorPrimaries_BT601_6_525;
698 break;
699 case HAL_DATASPACE_STANDARD_BT601_625:
700 case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
701 sdm_primaries = ColorPrimaries_BT601_6_625;
702 break;
703 case HAL_DATASPACE_STANDARD_DCI_P3:
704 sdm_primaries = ColorPrimaries_DCIP3;
705 break;
706 case HAL_DATASPACE_STANDARD_BT2020:
707 sdm_primaries = ColorPrimaries_BT2020;
708 // android_dataspace_t doesnt support mastering display and light levels
709 // so retrieve it from metadata
710 use_color_metadata = true;
711 break;
712 default:
713 DLOGV_IF(kTagStrategy, "Unsupported Standard Request = %d", standard);
714 return false;
715 }
716 // TODO(user): Check transfer + primary combination
717
718 // Handle range
719 auto range = dataspace_ & HAL_DATASPACE_RANGE_MASK;
720 switch (range) {
721 case HAL_DATASPACE_RANGE_FULL:
722 sdm_range = Range_Full;
723 break;
724 case HAL_DATASPACE_RANGE_LIMITED:
725 sdm_range = Range_Limited;
726 break;
727 default:
728 DLOGV_IF(kTagStrategy, "Unsupported Range Request = %d", range);
729 break;
730 }
731 // If we got here, the value is supported, update the layer
732 layer_buffer->color_metadata.transfer = sdm_transfer;
733 layer_buffer->color_metadata.colorPrimaries = sdm_primaries;
734 layer_buffer->color_metadata.range = sdm_range;
735 }
736#endif
737
738 if (use_color_metadata) {
739 const private_handle_t *handle =
740 reinterpret_cast<const private_handle_t *>(layer_buffer->buffer_id);
741 if (sdm::SetCSC(handle, &layer_buffer->color_metadata) != kErrorNone) {
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400742 return false;
Arun Kumar K.R961a28f2017-07-07 15:26:30 +0530743 }
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400744 }
745
Naseer Ahmedade4ee62016-10-07 17:07:38 -0400746 return true;
747}
748
749
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400750uint32_t HWCLayer::RoundToStandardFPS(float fps) {
751 static const uint32_t standard_fps[4] = {24, 30, 48, 60};
752 uint32_t frame_rate = (uint32_t)(fps);
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500753
754 int count = INT(sizeof(standard_fps) / sizeof(standard_fps[0]));
755 for (int i = 0; i < count; i++) {
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400756 if ((standard_fps[i] - frame_rate) < 2) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500757 // Most likely used for video, the fps can fluctuate
758 // Ex: b/w 29 and 30 for 30 fps clip
759 return standard_fps[i];
760 }
761 }
762
Naseer Ahmed89ff4522016-05-17 11:36:27 -0400763 return frame_rate;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500764}
765
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700766void HWCLayer::SetComposition(const LayerComposition &sdm_composition) {
767 auto hwc_composition = HWC2::Composition::Invalid;
768 switch (sdm_composition) {
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500769 case kCompositionGPU:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700770 hwc_composition = HWC2::Composition::Client;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500771 break;
Saurabh Shaha4af3de2017-04-19 17:15:24 -0700772 case kCompositionCursor:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700773 hwc_composition = HWC2::Composition::Cursor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500774 break;
775 default:
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700776 hwc_composition = HWC2::Composition::Device;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500777 break;
778 }
779 // Update solid fill composition
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700780 if (sdm_composition == kCompositionSDE && layer_->flags.solid_fill != 0) {
781 hwc_composition = HWC2::Composition::SolidColor;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500782 }
Arun Kumar K.R2c0ff8d2016-06-01 16:56:52 -0700783 device_selected_ = hwc_composition;
784
785 return;
Naseer Ahmedb92e73f2016-03-12 02:03:48 -0500786}
787void HWCLayer::PushReleaseFence(int32_t fence) {
788 release_fences_.push(fence);
789}
790int32_t HWCLayer::PopReleaseFence(void) {
791 if (release_fences_.empty())
792 return -1;
793 auto fence = release_fences_.front();
794 release_fences_.pop();
795 return fence;
796}
797
798} // namespace sdm