1 /* 2 * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. 3 * Not a Contribution. 4 * 5 * Copyright 2015 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20 #include "hwc_layers.h" 21 #include <gr.h> 22 #include <utils/debug.h> 23 #include <cmath> 24 25 #define __CLASS__ "HWCLayer" 26 27 namespace sdm { 28 29 std::atomic<hwc2_layer_t> HWCLayer::next_id_(1); 30 31 // Layer operations 32 HWCLayer::HWCLayer(hwc2_display_t display_id) : id_(next_id_++), display_id_(display_id) { 33 layer_ = new Layer(); 34 layer_->input_buffer = new LayerBuffer(); 35 // Fences are deferred, so the first time this layer is presented, return -1 36 // TODO(user): Verify that fences are properly obtained on suspend/resume 37 release_fences_.push(-1); 38 } 39 40 HWCLayer::~HWCLayer() { 41 // Close any fences left for this layer 42 while (!release_fences_.empty()) { 43 close(release_fences_.front()); 44 release_fences_.pop(); 45 } 46 close(ion_fd_); 47 if (layer_) { 48 if (layer_->input_buffer) { 49 delete (layer_->input_buffer); 50 } 51 delete layer_; 52 } 53 } 54 55 HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence) { 56 if (!buffer) { 57 DLOGE("Invalid buffer handle: %p on layer: %d", buffer, id_); 58 return HWC2::Error::BadParameter; 59 } 60 61 if (acquire_fence == 0) { 62 DLOGE("acquire_fence is zero"); 63 return HWC2::Error::BadParameter; 64 } 65 66 const private_handle_t *handle = static_cast<const private_handle_t *>(buffer); 67 68 // Validate and dup ion fd from surfaceflinger 69 // This works around bug 30281222 70 if (handle->fd < 0) { 71 return HWC2::Error::BadParameter; 72 } else { 73 close(ion_fd_); 74 ion_fd_ = dup(handle->fd); 75 } 76 77 LayerBuffer *layer_buffer = layer_->input_buffer; 78 layer_buffer->width = UINT32(handle->width); 79 layer_buffer->height = UINT32(handle->height); 80 layer_buffer->format = GetSDMFormat(handle->format, handle->flags); 81 if (SetMetaData(handle, layer_) != kErrorNone) { 82 return HWC2::Error::BadLayer; 83 } 84 85 if (handle->bufferType == BUFFER_TYPE_VIDEO) { 86 layer_buffer->flags.video = true; 87 } 88 // TZ Protected Buffer - L1 89 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER) { 90 layer_buffer->flags.secure = true; 91 } 92 if (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY) { 93 layer_buffer->flags.secure_display = true; 94 } 95 96 layer_buffer->planes[0].fd = ion_fd_; 97 layer_buffer->planes[0].offset = handle->offset; 98 layer_buffer->planes[0].stride = UINT32(handle->width); 99 layer_buffer->acquire_fence_fd = acquire_fence; 100 layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle); 101 102 return HWC2::Error::None; 103 } 104 105 HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) { 106 layer_->dirty_regions.clear(); 107 for (uint32_t i = 0; i < damage.numRects; i++) { 108 LayerRect rect; 109 SetRect(damage.rects[i], &rect); 110 layer_->dirty_regions.push_back(rect); 111 } 112 return HWC2::Error::None; 113 } 114 115 HWC2::Error HWCLayer::SetLayerBlendMode(HWC2::BlendMode mode) { 116 LayerBlending blending = kBlendingPremultiplied; 117 switch (mode) { 118 case HWC2::BlendMode::Coverage: 119 blending = kBlendingCoverage; 120 break; 121 case HWC2::BlendMode::Premultiplied: 122 blending = kBlendingPremultiplied; 123 break; 124 case HWC2::BlendMode::None: 125 blending = kBlendingOpaque; 126 break; 127 default: 128 return HWC2::Error::BadParameter; 129 } 130 131 if (layer_->blending != blending) { 132 geometry_changes_ |= kBlendMode; 133 layer_->blending = blending; 134 } 135 return HWC2::Error::None; 136 } 137 138 HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) { 139 layer_->solid_fill_color = GetUint32Color(color); 140 layer_->input_buffer->format = kFormatARGB8888; 141 DLOGV_IF(kTagCompManager, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_, 142 layer_->solid_fill_color); 143 return HWC2::Error::None; 144 } 145 146 HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) { 147 client_requested_ = type; 148 switch (type) { 149 case HWC2::Composition::Client: 150 break; 151 case HWC2::Composition::Device: 152 // We try and default to this in SDM 153 break; 154 case HWC2::Composition::SolidColor: 155 break; 156 case HWC2::Composition::Cursor: 157 break; 158 case HWC2::Composition::Invalid: 159 return HWC2::Error::BadParameter; 160 default: 161 return HWC2::Error::Unsupported; 162 } 163 164 return HWC2::Error::None; 165 } 166 167 HWC2::Error HWCLayer::SetLayerDataspace(int32_t dataspace) { 168 // TODO(user): Implement later 169 geometry_changes_ |= kDataspace; 170 return HWC2::Error::None; 171 } 172 173 HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) { 174 LayerRect dst_rect = {}; 175 SetRect(frame, &dst_rect); 176 if (layer_->dst_rect != dst_rect) { 177 geometry_changes_ |= kDisplayFrame; 178 layer_->dst_rect = dst_rect; 179 } 180 return HWC2::Error::None; 181 } 182 183 HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) { 184 // Conversion of float alpha in range 0.0 to 1.0 similar to the HWC Adapter 185 uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha)); 186 if (layer_->plane_alpha != plane_alpha) { 187 geometry_changes_ |= kPlaneAlpha; 188 layer_->plane_alpha = plane_alpha; 189 } 190 191 return HWC2::Error::None; 192 } 193 194 HWC2::Error HWCLayer::SetLayerSourceCrop(hwc_frect_t crop) { 195 LayerRect src_rect = {}; 196 SetRect(crop, &src_rect); 197 if (layer_->src_rect != src_rect) { 198 geometry_changes_ |= kSourceCrop; 199 layer_->src_rect = src_rect; 200 } 201 202 return HWC2::Error::None; 203 } 204 205 HWC2::Error HWCLayer::SetLayerTransform(HWC2::Transform transform) { 206 LayerTransform layer_transform = {}; 207 switch (transform) { 208 case HWC2::Transform::FlipH: 209 layer_transform.flip_horizontal = true; 210 break; 211 case HWC2::Transform::FlipV: 212 layer_transform.flip_vertical = true; 213 break; 214 case HWC2::Transform::Rotate90: 215 layer_transform.rotation = 90.0f; 216 break; 217 case HWC2::Transform::Rotate180: 218 layer_transform.flip_horizontal = true; 219 layer_transform.flip_vertical = true; 220 break; 221 case HWC2::Transform::Rotate270: 222 layer_transform.rotation = 90.0f; 223 layer_transform.flip_horizontal = true; 224 layer_transform.flip_vertical = true; 225 break; 226 case HWC2::Transform::FlipHRotate90: 227 layer_transform.rotation = 90.0f; 228 layer_transform.flip_horizontal = true; 229 break; 230 case HWC2::Transform::FlipVRotate90: 231 layer_transform.rotation = 90.0f; 232 layer_transform.flip_vertical = true; 233 break; 234 case HWC2::Transform::None: 235 // do nothing 236 break; 237 } 238 239 if (layer_->transform != layer_transform) { 240 geometry_changes_ |= kTransform; 241 layer_->transform = layer_transform; 242 } 243 return HWC2::Error::None; 244 } 245 246 HWC2::Error HWCLayer::SetLayerVisibleRegion(hwc_region_t visible) { 247 layer_->visible_regions.clear(); 248 for (uint32_t i = 0; i < visible.numRects; i++) { 249 LayerRect rect; 250 SetRect(visible.rects[i], &rect); 251 layer_->visible_regions.push_back(rect); 252 } 253 254 return HWC2::Error::None; 255 } 256 257 HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) { 258 if (z_ != z) { 259 geometry_changes_ |= kZOrder; 260 z_ = z; 261 } 262 return HWC2::Error::None; 263 } 264 265 void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) { 266 target->left = FLOAT(source.left); 267 target->top = FLOAT(source.top); 268 target->right = FLOAT(source.right); 269 target->bottom = FLOAT(source.bottom); 270 } 271 272 void HWCLayer::SetRect(const hwc_frect_t &source, LayerRect *target) { 273 // Recommended way of rounding as in hwcomposer2.h - SetLayerSourceCrop 274 target->left = std::ceil(source.left); 275 target->top = std::ceil(source.top); 276 target->right = std::floor(source.right); 277 target->bottom = std::floor(source.bottom); 278 } 279 280 uint32_t HWCLayer::GetUint32Color(const hwc_color_t &source) { 281 // Returns 32 bit ARGB 282 uint32_t a = UINT32(source.a) << 24; 283 uint32_t r = UINT32(source.r) << 16; 284 uint32_t g = UINT32(source.g) << 8; 285 uint32_t b = UINT32(source.b); 286 uint32_t color = a | r | g | b; 287 return color; 288 } 289 290 LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) { 291 LayerBufferFormat format = kFormatInvalid; 292 if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) { 293 switch (source) { 294 case HAL_PIXEL_FORMAT_RGBA_8888: 295 format = kFormatRGBA8888Ubwc; 296 break; 297 case HAL_PIXEL_FORMAT_RGBX_8888: 298 format = kFormatRGBX8888Ubwc; 299 break; 300 case HAL_PIXEL_FORMAT_BGR_565: 301 format = kFormatBGR565Ubwc; 302 break; 303 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 304 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: 305 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 306 format = kFormatYCbCr420SPVenusUbwc; 307 break; 308 default: 309 DLOGE("Unsupported format type for UBWC %d", source); 310 return kFormatInvalid; 311 } 312 return format; 313 } 314 315 switch (source) { 316 case HAL_PIXEL_FORMAT_RGBA_8888: 317 format = kFormatRGBA8888; 318 break; 319 case HAL_PIXEL_FORMAT_RGBA_5551: 320 format = kFormatRGBA5551; 321 break; 322 case HAL_PIXEL_FORMAT_RGBA_4444: 323 format = kFormatRGBA4444; 324 break; 325 case HAL_PIXEL_FORMAT_BGRA_8888: 326 format = kFormatBGRA8888; 327 break; 328 case HAL_PIXEL_FORMAT_RGBX_8888: 329 format = kFormatRGBX8888; 330 break; 331 case HAL_PIXEL_FORMAT_BGRX_8888: 332 format = kFormatBGRX8888; 333 break; 334 case HAL_PIXEL_FORMAT_RGB_888: 335 format = kFormatRGB888; 336 break; 337 case HAL_PIXEL_FORMAT_RGB_565: 338 format = kFormatRGB565; 339 break; 340 case HAL_PIXEL_FORMAT_BGR_565: 341 format = kFormatBGR565; 342 break; 343 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 344 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 345 format = kFormatYCbCr420SemiPlanarVenus; 346 break; 347 case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS: 348 format = kFormatYCrCb420SemiPlanarVenus; 349 break; 350 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: 351 format = kFormatYCbCr420SPVenusUbwc; 352 break; 353 case HAL_PIXEL_FORMAT_YV12: 354 format = kFormatYCrCb420PlanarStride16; 355 break; 356 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 357 format = kFormatYCrCb420SemiPlanar; 358 break; 359 case HAL_PIXEL_FORMAT_YCbCr_420_SP: 360 format = kFormatYCbCr420SemiPlanar; 361 break; 362 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 363 format = kFormatYCbCr422H2V1SemiPlanar; 364 break; 365 case HAL_PIXEL_FORMAT_YCbCr_422_I: 366 format = kFormatYCbCr422H2V1Packed; 367 break; 368 case HAL_PIXEL_FORMAT_RGBA_1010102: 369 format = kFormatRGBA1010102; 370 break; 371 case HAL_PIXEL_FORMAT_ARGB_2101010: 372 format = kFormatARGB2101010; 373 break; 374 case HAL_PIXEL_FORMAT_RGBX_1010102: 375 format = kFormatRGBX1010102; 376 break; 377 case HAL_PIXEL_FORMAT_XRGB_2101010: 378 format = kFormatXRGB2101010; 379 break; 380 case HAL_PIXEL_FORMAT_BGRA_1010102: 381 format = kFormatBGRA1010102; 382 break; 383 case HAL_PIXEL_FORMAT_ABGR_2101010: 384 format = kFormatABGR2101010; 385 break; 386 case HAL_PIXEL_FORMAT_BGRX_1010102: 387 format = kFormatBGRX1010102; 388 break; 389 case HAL_PIXEL_FORMAT_XBGR_2101010: 390 format = kFormatXBGR2101010; 391 break; 392 case HAL_PIXEL_FORMAT_YCbCr_420_P010: 393 format = kFormatYCbCr420P010; 394 break; 395 case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: 396 format = kFormatYCbCr420TP10Ubwc; 397 break; 398 default: 399 DLOGW("Unsupported format type = %d", source); 400 return kFormatInvalid; 401 } 402 403 return format; 404 } 405 406 LayerBufferS3DFormat HWCLayer::GetS3DFormat(uint32_t s3d_format) { 407 LayerBufferS3DFormat sdm_s3d_format = kS3dFormatNone; 408 switch (s3d_format) { 409 case HAL_NO_3D: 410 sdm_s3d_format = kS3dFormatNone; 411 break; 412 case HAL_3D_SIDE_BY_SIDE_L_R: 413 sdm_s3d_format = kS3dFormatLeftRight; 414 break; 415 case HAL_3D_SIDE_BY_SIDE_R_L: 416 sdm_s3d_format = kS3dFormatRightLeft; 417 break; 418 case HAL_3D_TOP_BOTTOM: 419 sdm_s3d_format = kS3dFormatTopBottom; 420 break; 421 default: 422 DLOGW("Invalid S3D format %d", s3d_format); 423 } 424 return sdm_s3d_format; 425 } 426 427 DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) { 428 const MetaData_t *meta_data = reinterpret_cast<MetaData_t *>(pvt_handle->base_metadata); 429 LayerBuffer *layer_buffer = layer->input_buffer; 430 431 if (!meta_data) { 432 return kErrorNone; 433 } 434 435 if (meta_data->operation & UPDATE_COLOR_SPACE) { 436 if (SetCSC(meta_data->colorSpace, &layer_buffer->csc) != kErrorNone) { 437 return kErrorNotSupported; 438 } 439 } 440 441 if (meta_data->operation & SET_IGC) { 442 if (SetIGC(meta_data->igc, &layer_buffer->igc) != kErrorNone) { 443 return kErrorNotSupported; 444 } 445 } 446 447 if (meta_data->operation & UPDATE_REFRESH_RATE) { 448 layer->frame_rate = RoundToStandardFPS(meta_data->refreshrate); 449 } 450 451 if ((meta_data->operation & PP_PARAM_INTERLACED) && meta_data->interlaced) { 452 layer_buffer->flags.interlace = true; 453 } 454 455 if (meta_data->operation & LINEAR_FORMAT) { 456 layer_buffer->format = GetSDMFormat(INT32(meta_data->linearFormat), 0); 457 } 458 459 if (meta_data->operation & UPDATE_BUFFER_GEOMETRY) { 460 int actual_width = pvt_handle->width; 461 int actual_height = pvt_handle->height; 462 AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(pvt_handle, actual_width, actual_height); 463 layer_buffer->width = UINT32(actual_width); 464 layer_buffer->height = UINT32(actual_height); 465 } 466 467 if (meta_data->operation & S3D_FORMAT) { 468 layer_buffer->s3d_format = GetS3DFormat(meta_data->s3dFormat); 469 } 470 471 return kErrorNone; 472 } 473 474 DisplayError HWCLayer::SetCSC(ColorSpace_t source, LayerCSC *target) { 475 switch (source) { 476 case ITU_R_601: 477 *target = kCSCLimitedRange601; 478 break; 479 case ITU_R_601_FR: 480 *target = kCSCFullRange601; 481 break; 482 case ITU_R_709: 483 *target = kCSCLimitedRange709; 484 break; 485 default: 486 DLOGE("Unsupported CSC: %d", source); 487 return kErrorNotSupported; 488 } 489 490 return kErrorNone; 491 } 492 493 DisplayError HWCLayer::SetIGC(IGC_t source, LayerIGC *target) { 494 switch (source) { 495 case IGC_NotSpecified: 496 *target = kIGCNotSpecified; 497 break; 498 case IGC_sRGB: 499 *target = kIGCsRGB; 500 break; 501 default: 502 DLOGE("Unsupported IGC: %d", source); 503 return kErrorNotSupported; 504 } 505 506 return kErrorNone; 507 } 508 509 uint32_t HWCLayer::RoundToStandardFPS(float fps) { 510 static const uint32_t standard_fps[4] = {24, 30, 48, 60}; 511 uint32_t frame_rate = (uint32_t)(fps); 512 513 int count = INT(sizeof(standard_fps) / sizeof(standard_fps[0])); 514 for (int i = 0; i < count; i++) { 515 if ((standard_fps[i] - frame_rate) < 2) { 516 // Most likely used for video, the fps can fluctuate 517 // Ex: b/w 29 and 30 for 30 fps clip 518 return standard_fps[i]; 519 } 520 } 521 522 return frame_rate; 523 } 524 525 void HWCLayer::SetComposition(const LayerComposition &sdm_composition) { 526 auto hwc_composition = HWC2::Composition::Invalid; 527 switch (sdm_composition) { 528 case kCompositionGPU: 529 hwc_composition = HWC2::Composition::Client; 530 break; 531 case kCompositionHWCursor: 532 hwc_composition = HWC2::Composition::Cursor; 533 break; 534 default: 535 hwc_composition = HWC2::Composition::Device; 536 break; 537 } 538 // Update solid fill composition 539 if (sdm_composition == kCompositionSDE && layer_->flags.solid_fill != 0) { 540 hwc_composition = HWC2::Composition::SolidColor; 541 } 542 device_selected_ = hwc_composition; 543 544 return; 545 } 546 void HWCLayer::PushReleaseFence(int32_t fence) { 547 release_fences_.push(fence); 548 } 549 int32_t HWCLayer::PopReleaseFence(void) { 550 if (release_fences_.empty()) 551 return -1; 552 auto fence = release_fences_.front(); 553 release_fences_.pop(); 554 return fence; 555 } 556 557 } // namespace sdm 558