Home | History | Annotate | Download | only in hwc2
      1 /*
      2  * Copyright (c) 2014-2017, 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 <stdint.h>
     21 #include <qdMetaData.h>
     22 
     23 #include "hwc_layers.h"
     24 #ifndef USE_GRALLOC1
     25 #include <gr.h>
     26 #endif
     27 #include <utils/debug.h>
     28 #include <cmath>
     29 
     30 #define __CLASS__ "HWCLayer"
     31 
     32 namespace sdm {
     33 
     34 std::atomic<hwc2_layer_t> HWCLayer::next_id_(1);
     35 
     36 DisplayError 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       }
     45 
     46       switch (csc) {
     47       case ITU_R_601:
     48       case ITU_R_601_FR:
     49         // video and display driver uses 601_525
     50         color_metadata->colorPrimaries = ColorPrimaries_BT601_6_525;
     51         break;
     52       case ITU_R_709:
     53         color_metadata->colorPrimaries = ColorPrimaries_BT709_5;
     54         break;
     55       case ITU_R_2020:
     56       case ITU_R_2020_FR:
     57         color_metadata->colorPrimaries = ColorPrimaries_BT2020;
     58         break;
     59       default:
     60         DLOGE("Unsupported CSC: %d", csc);
     61         return kErrorNotSupported;
     62       }
     63     } else {
     64       return kErrorNotSupported;
     65     }
     66   }
     67 
     68   return kErrorNone;
     69 }
     70 
     71 // Returns true when color primary is supported
     72 bool GetColorPrimary(const int32_t &dataspace, ColorPrimaries *color_primary) {
     73   auto standard = dataspace & HAL_DATASPACE_STANDARD_MASK;
     74   bool supported_csc = true;
     75   switch (standard) {
     76     case  HAL_DATASPACE_STANDARD_BT709:
     77       *color_primary = ColorPrimaries_BT709_5;
     78       break;
     79     case HAL_DATASPACE_STANDARD_BT601_525:
     80     case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
     81       *color_primary = ColorPrimaries_BT601_6_525;
     82       break;
     83     case HAL_DATASPACE_STANDARD_BT601_625:
     84     case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
     85       *color_primary = ColorPrimaries_BT601_6_625;
     86       break;
     87     case HAL_DATASPACE_STANDARD_DCI_P3:
     88       *color_primary = ColorPrimaries_DCIP3;
     89       break;
     90     case HAL_DATASPACE_STANDARD_BT2020:
     91       *color_primary = ColorPrimaries_BT2020;
     92       break;
     93     default:
     94       DLOGV_IF(kTagClient, "Unsupported Standard Request = %d", standard);
     95       supported_csc = false;
     96   }
     97   return supported_csc;
     98 }
     99 
    100 bool GetTransfer(const int32_t &dataspace, GammaTransfer *gamma_transfer) {
    101   auto transfer = dataspace & HAL_DATASPACE_TRANSFER_MASK;
    102   bool supported_transfer = true;
    103   switch (transfer) {
    104     case HAL_DATASPACE_TRANSFER_SRGB:
    105       *gamma_transfer = Transfer_sRGB;
    106       break;
    107     case HAL_DATASPACE_TRANSFER_SMPTE_170M:
    108       *gamma_transfer = Transfer_SMPTE_170M;
    109       break;
    110     case HAL_DATASPACE_TRANSFER_ST2084:
    111       *gamma_transfer = Transfer_SMPTE_ST2084;
    112       break;
    113     case HAL_DATASPACE_TRANSFER_HLG:
    114       *gamma_transfer = Transfer_HLG;
    115       break;
    116     case HAL_DATASPACE_TRANSFER_LINEAR:
    117       *gamma_transfer = Transfer_Linear;
    118       break;
    119     case HAL_DATASPACE_TRANSFER_GAMMA2_2:
    120       *gamma_transfer = Transfer_Gamma2_2;
    121       break;
    122     default:
    123       DLOGV_IF(kTagClient, "Unsupported Transfer Request = %d", transfer);
    124       supported_transfer = false;
    125   }
    126   return supported_transfer;
    127 }
    128 
    129 void GetRange(const int32_t &dataspace, ColorRange *color_range) {
    130   auto range = dataspace & HAL_DATASPACE_RANGE_MASK;
    131   switch (range) {
    132     case HAL_DATASPACE_RANGE_FULL:
    133       *color_range = Range_Full;
    134       break;
    135     case HAL_DATASPACE_RANGE_LIMITED:
    136       *color_range = Range_Limited;
    137       break;
    138     default:
    139       DLOGV_IF(kTagClient, "Unsupported Range Request = %d", range);
    140       break;
    141   }
    142 }
    143 
    144 bool IsBT2020(const ColorPrimaries &color_primary) {
    145   switch (color_primary) {
    146   case ColorPrimaries_BT2020:
    147     return true;
    148     break;
    149   default:
    150     return false;
    151   }
    152 }
    153 
    154 // Retrieve ColorMetaData from android_data_space_t (STANDARD|TRANSFER|RANGE)
    155 bool GetSDMColorSpace(const int32_t &dataspace, ColorMetaData *color_metadata) {
    156   bool valid = false;
    157   valid = GetColorPrimary(dataspace, &(color_metadata->colorPrimaries));
    158   if (!valid) {
    159     return valid;
    160   }
    161   valid = GetTransfer(dataspace, &(color_metadata->transfer));
    162   if (!valid) {
    163     return valid;
    164   }
    165   GetRange(dataspace, &(color_metadata->range));
    166 
    167   return true;
    168 }
    169 
    170 // Layer operations
    171 HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator)
    172   : id_(next_id_++), display_id_(display_id), buffer_allocator_(buf_allocator) {
    173   layer_ = new Layer();
    174   // 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
    176   release_fences_.push(-1);
    177 }
    178 
    179 HWCLayer::~HWCLayer() {
    180   // Close any fences left for this layer
    181   while (!release_fences_.empty()) {
    182     close(release_fences_.front());
    183     release_fences_.pop();
    184   }
    185   close(ion_fd_);
    186   if (layer_) {
    187     delete layer_;
    188   }
    189 }
    190 
    191 HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence) {
    192   if (!buffer) {
    193     DLOGE("Invalid buffer handle: %p on layer: %d", buffer, id_);
    194     return HWC2::Error::BadParameter;
    195   }
    196 
    197   if (acquire_fence == 0) {
    198     DLOGE("acquire_fence is zero");
    199     return HWC2::Error::BadParameter;
    200   }
    201 
    202   const private_handle_t *handle = static_cast<const private_handle_t *>(buffer);
    203 
    204   // Validate and dup ion fd from surfaceflinger
    205   // This works around bug 30281222
    206   if (handle->fd < 0) {
    207     return HWC2::Error::BadParameter;
    208   } else {
    209     close(ion_fd_);
    210     ion_fd_ = dup(handle->fd);
    211   }
    212 
    213   LayerBuffer *layer_buffer = &layer_->input_buffer;
    214   int aligned_width, aligned_height;
    215 #ifdef USE_GRALLOC1
    216   buffer_allocator_->GetCustomWidthAndHeight(handle, &aligned_width, &aligned_height);
    217 #else
    218   AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(handle, aligned_width, aligned_height);
    219 #endif
    220 
    221   LayerBufferFormat format = GetSDMFormat(handle->format, handle->flags);
    222   if ((format != layer_buffer->format) || (UINT32(aligned_width) != layer_buffer->width) ||
    223       (UINT32(aligned_height) != layer_buffer->height)) {
    224     // Layer buffer geometry has changed.
    225     geometry_changes_ |= kBufferGeometry;
    226   }
    227 
    228   layer_buffer->format = format;
    229   layer_buffer->width = UINT32(aligned_width);
    230   layer_buffer->height = UINT32(aligned_height);
    231   layer_buffer->unaligned_width = UINT32(handle->unaligned_width);
    232   layer_buffer->unaligned_height = UINT32(handle->unaligned_height);
    233 
    234   if (SetMetaData(const_cast<private_handle_t *>(handle), layer_) != kErrorNone) {
    235     return HWC2::Error::BadLayer;
    236   }
    237 
    238   layer_buffer->flags.video = (handle->buffer_type == BUFFER_TYPE_VIDEO) ? true : false;
    239 
    240   // TZ Protected Buffer - L1
    241   bool secure = (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER);
    242   bool secure_camera = secure && (handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE);
    243   bool secure_display = (handle->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY);
    244   if (secure != layer_buffer->flags.secure || secure_camera != layer_buffer->flags.secure_camera ||
    245       secure_display != layer_buffer->flags.secure_display) {
    246     // Secure attribute of layer buffer has changed.
    247     needs_validate_ = true;
    248   }
    249 
    250   layer_buffer->flags.secure = secure;
    251   layer_buffer->flags.secure_camera = secure_camera;
    252   layer_buffer->flags.secure_display = secure_display;
    253 
    254   layer_buffer->planes[0].fd = ion_fd_;
    255   layer_buffer->planes[0].offset = handle->offset;
    256   layer_buffer->planes[0].stride = UINT32(handle->width);
    257   layer_buffer->acquire_fence_fd = acquire_fence;
    258   layer_buffer->size = handle->size;
    259   layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle);
    260 
    261   return HWC2::Error::None;
    262 }
    263 
    264 HWC2::Error HWCLayer::SetLayerSurfaceDamage(hwc_region_t damage) {
    265   // Check if there is an update in SurfaceDamage rects
    266   if (layer_->dirty_regions.size() != damage.numRects) {
    267     needs_validate_ = true;
    268   } else {
    269     for (uint32_t j = 0; j < damage.numRects; j++) {
    270       LayerRect damage_rect;
    271       SetRect(damage.rects[j], &damage_rect);
    272       if (damage_rect != layer_->dirty_regions.at(j)) {
    273         needs_validate_ = true;
    274         break;
    275       }
    276     }
    277   }
    278 
    279   layer_->dirty_regions.clear();
    280   for (uint32_t i = 0; i < damage.numRects; i++) {
    281     LayerRect rect;
    282     SetRect(damage.rects[i], &rect);
    283     layer_->dirty_regions.push_back(rect);
    284   }
    285   return HWC2::Error::None;
    286 }
    287 
    288 HWC2::Error HWCLayer::SetLayerBlendMode(HWC2::BlendMode mode) {
    289   LayerBlending blending = kBlendingPremultiplied;
    290   switch (mode) {
    291     case HWC2::BlendMode::Coverage:
    292       blending = kBlendingCoverage;
    293       break;
    294     case HWC2::BlendMode::Premultiplied:
    295       blending = kBlendingPremultiplied;
    296       break;
    297     case HWC2::BlendMode::None:
    298       blending = kBlendingOpaque;
    299       break;
    300     default:
    301       return HWC2::Error::BadParameter;
    302   }
    303 
    304   if (layer_->blending != blending) {
    305     geometry_changes_ |= kBlendMode;
    306     layer_->blending = blending;
    307   }
    308   return HWC2::Error::None;
    309 }
    310 
    311 HWC2::Error HWCLayer::SetLayerColor(hwc_color_t color) {
    312   if (client_requested_ != HWC2::Composition::SolidColor) {
    313     return HWC2::Error::None;
    314   }
    315   layer_->solid_fill_color = GetUint32Color(color);
    316   layer_->input_buffer.format = kFormatARGB8888;
    317   DLOGV_IF(kTagClient, "[%" PRIu64 "][%" PRIu64 "] Layer color set to %x", display_id_, id_,
    318            layer_->solid_fill_color);
    319   return HWC2::Error::None;
    320 }
    321 
    322 HWC2::Error HWCLayer::SetLayerCompositionType(HWC2::Composition type) {
    323   client_requested_ = type;
    324   switch (type) {
    325     case HWC2::Composition::Client:
    326       break;
    327     case HWC2::Composition::Device:
    328       // We try and default to this in SDM
    329       break;
    330     case HWC2::Composition::SolidColor:
    331       break;
    332     case HWC2::Composition::Cursor:
    333       break;
    334     case HWC2::Composition::Invalid:
    335       return HWC2::Error::BadParameter;
    336     default:
    337       return HWC2::Error::Unsupported;
    338   }
    339 
    340   return HWC2::Error::None;
    341 }
    342 
    343 HWC2::Error HWCLayer::SetLayerDataspace(int32_t dataspace) {
    344   // Map deprecated dataspace values to appropriate
    345   // new enums
    346   if (dataspace & 0xffff) {
    347     switch (dataspace & 0xffff) {
    348       case HAL_DATASPACE_SRGB:
    349         dataspace = HAL_DATASPACE_V0_SRGB;
    350         break;
    351       case HAL_DATASPACE_JFIF:
    352         dataspace = HAL_DATASPACE_V0_JFIF;
    353         break;
    354       case HAL_DATASPACE_SRGB_LINEAR:
    355         dataspace = HAL_DATASPACE_V0_SRGB_LINEAR;
    356         break;
    357       case HAL_DATASPACE_BT601_625:
    358         dataspace = HAL_DATASPACE_V0_BT601_625;
    359         break;
    360       case HAL_DATASPACE_BT601_525:
    361         dataspace = HAL_DATASPACE_V0_BT601_525;
    362         break;
    363       case HAL_DATASPACE_BT709:
    364         dataspace = HAL_DATASPACE_V0_BT709;
    365         break;
    366       default:
    367         // unknown legacy dataspace
    368         DLOGW_IF(kTagClient, "Unsupported dataspace type %d", dataspace);
    369     }
    370   }
    371 
    372   // cache the dataspace, to be used later to update SDM ColorMetaData
    373   if (dataspace_ != dataspace) {
    374     geometry_changes_ |= kDataspace;
    375     dataspace_ = dataspace;
    376   }
    377   return HWC2::Error::None;
    378 }
    379 
    380 HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) {
    381   LayerRect dst_rect = {};
    382   SetRect(frame, &dst_rect);
    383   if (layer_->dst_rect != dst_rect) {
    384     geometry_changes_ |= kDisplayFrame;
    385     layer_->dst_rect = dst_rect;
    386   }
    387   return HWC2::Error::None;
    388 }
    389 
    390 HWC2::Error HWCLayer::SetCursorPosition(int32_t x, int32_t y) {
    391   hwc_rect_t frame = {};
    392   frame.left = x;
    393   frame.top = y;
    394   frame.right = x + INT(layer_->dst_rect.right - layer_->dst_rect.left);
    395   frame.bottom = y + INT(layer_->dst_rect.bottom - layer_->dst_rect.top);
    396   SetLayerDisplayFrame(frame);
    397 
    398   return HWC2::Error::None;
    399 }
    400 
    401 HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) {
    402   // Conversion of float alpha in range 0.0 to 1.0 similar to the HWC Adapter
    403   uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha));
    404   if (layer_->plane_alpha != plane_alpha) {
    405     geometry_changes_ |= kPlaneAlpha;
    406     layer_->plane_alpha = plane_alpha;
    407   }
    408 
    409   return HWC2::Error::None;
    410 }
    411 
    412 HWC2::Error HWCLayer::SetLayerSourceCrop(hwc_frect_t crop) {
    413   LayerRect src_rect = {};
    414   SetRect(crop, &src_rect);
    415   if (layer_->src_rect != src_rect) {
    416     geometry_changes_ |= kSourceCrop;
    417     layer_->src_rect = src_rect;
    418   }
    419 
    420   return HWC2::Error::None;
    421 }
    422 
    423 HWC2::Error HWCLayer::SetLayerTransform(HWC2::Transform transform) {
    424   LayerTransform layer_transform = {};
    425   switch (transform) {
    426     case HWC2::Transform::FlipH:
    427       layer_transform.flip_horizontal = true;
    428       break;
    429     case HWC2::Transform::FlipV:
    430       layer_transform.flip_vertical = true;
    431       break;
    432     case HWC2::Transform::Rotate90:
    433       layer_transform.rotation = 90.0f;
    434       break;
    435     case HWC2::Transform::Rotate180:
    436       layer_transform.flip_horizontal = true;
    437       layer_transform.flip_vertical = true;
    438       break;
    439     case HWC2::Transform::Rotate270:
    440       layer_transform.rotation = 90.0f;
    441       layer_transform.flip_horizontal = true;
    442       layer_transform.flip_vertical = true;
    443       break;
    444     case HWC2::Transform::FlipHRotate90:
    445       layer_transform.rotation = 90.0f;
    446       layer_transform.flip_horizontal = true;
    447       break;
    448     case HWC2::Transform::FlipVRotate90:
    449       layer_transform.rotation = 90.0f;
    450       layer_transform.flip_vertical = true;
    451       break;
    452     case HWC2::Transform::None:
    453       // do nothing
    454       break;
    455   }
    456 
    457   if (layer_->transform != layer_transform) {
    458     geometry_changes_ |= kTransform;
    459     layer_->transform = layer_transform;
    460   }
    461   return HWC2::Error::None;
    462 }
    463 
    464 HWC2::Error HWCLayer::SetLayerVisibleRegion(hwc_region_t visible) {
    465   layer_->visible_regions.clear();
    466   for (uint32_t i = 0; i < visible.numRects; i++) {
    467     LayerRect rect;
    468     SetRect(visible.rects[i], &rect);
    469     layer_->visible_regions.push_back(rect);
    470   }
    471 
    472   return HWC2::Error::None;
    473 }
    474 
    475 HWC2::Error HWCLayer::SetLayerZOrder(uint32_t z) {
    476   if (z_ != z) {
    477     geometry_changes_ |= kZOrder;
    478     z_ = z;
    479   }
    480   return HWC2::Error::None;
    481 }
    482 
    483 void HWCLayer::SetRect(const hwc_rect_t &source, LayerRect *target) {
    484   target->left = FLOAT(source.left);
    485   target->top = FLOAT(source.top);
    486   target->right = FLOAT(source.right);
    487   target->bottom = FLOAT(source.bottom);
    488 }
    489 
    490 void HWCLayer::SetRect(const hwc_frect_t &source, LayerRect *target) {
    491   // Recommended way of rounding as in hwcomposer2.h - SetLayerSourceCrop
    492   target->left = std::ceil(source.left);
    493   target->top = std::ceil(source.top);
    494   target->right = std::floor(source.right);
    495   target->bottom = std::floor(source.bottom);
    496 }
    497 
    498 uint32_t HWCLayer::GetUint32Color(const hwc_color_t &source) {
    499   // Returns 32 bit ARGB
    500   uint32_t a = UINT32(source.a) << 24;
    501   uint32_t r = UINT32(source.r) << 16;
    502   uint32_t g = UINT32(source.g) << 8;
    503   uint32_t b = UINT32(source.b);
    504   uint32_t color = a | r | g | b;
    505   return color;
    506 }
    507 
    508 LayerBufferFormat HWCLayer::GetSDMFormat(const int32_t &source, const int flags) {
    509   LayerBufferFormat format = kFormatInvalid;
    510   if (flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
    511     switch (source) {
    512       case HAL_PIXEL_FORMAT_RGBA_8888:
    513         format = kFormatRGBA8888Ubwc;
    514         break;
    515       case HAL_PIXEL_FORMAT_RGBX_8888:
    516         format = kFormatRGBX8888Ubwc;
    517         break;
    518       case HAL_PIXEL_FORMAT_BGR_565:
    519         format = kFormatBGR565Ubwc;
    520         break;
    521       case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
    522       case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
    523       case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
    524         format = kFormatYCbCr420SPVenusUbwc;
    525         break;
    526       case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
    527         format = kFormatYCbCr420TP10Ubwc;
    528         break;
    529       case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
    530         format = kFormatYCbCr420P010Ubwc;
    531         break;
    532       default:
    533         DLOGE("Unsupported format type for UBWC %d", source);
    534         return kFormatInvalid;
    535     }
    536     return format;
    537   }
    538 
    539   switch (source) {
    540     case HAL_PIXEL_FORMAT_RGBA_8888:
    541       format = kFormatRGBA8888;
    542       break;
    543     case HAL_PIXEL_FORMAT_RGBA_5551:
    544       format = kFormatRGBA5551;
    545       break;
    546     case HAL_PIXEL_FORMAT_RGBA_4444:
    547       format = kFormatRGBA4444;
    548       break;
    549     case HAL_PIXEL_FORMAT_BGRA_8888:
    550       format = kFormatBGRA8888;
    551       break;
    552     case HAL_PIXEL_FORMAT_RGBX_8888:
    553       format = kFormatRGBX8888;
    554       break;
    555     case HAL_PIXEL_FORMAT_BGRX_8888:
    556       format = kFormatBGRX8888;
    557       break;
    558     case HAL_PIXEL_FORMAT_RGB_888:
    559       format = kFormatRGB888;
    560       break;
    561     case HAL_PIXEL_FORMAT_BGR_888:
    562       format = kFormatBGR888;
    563       break;
    564     case HAL_PIXEL_FORMAT_RGB_565:
    565       format = kFormatRGB565;
    566       break;
    567     case HAL_PIXEL_FORMAT_BGR_565:
    568       format = kFormatBGR565;
    569       break;
    570     case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
    571     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
    572       format = kFormatYCbCr420SemiPlanarVenus;
    573       break;
    574     case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
    575       format = kFormatYCrCb420SemiPlanarVenus;
    576       break;
    577     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
    578       format = kFormatYCbCr420SPVenusUbwc;
    579       break;
    580     case HAL_PIXEL_FORMAT_YV12:
    581       format = kFormatYCrCb420PlanarStride16;
    582       break;
    583     case HAL_PIXEL_FORMAT_YCrCb_420_SP:
    584       format = kFormatYCrCb420SemiPlanar;
    585       break;
    586     case HAL_PIXEL_FORMAT_YCbCr_420_SP:
    587       format = kFormatYCbCr420SemiPlanar;
    588       break;
    589     case HAL_PIXEL_FORMAT_YCbCr_422_SP:
    590       format = kFormatYCbCr422H2V1SemiPlanar;
    591       break;
    592     case HAL_PIXEL_FORMAT_YCbCr_422_I:
    593       format = kFormatYCbCr422H2V1Packed;
    594       break;
    595     case HAL_PIXEL_FORMAT_CbYCrY_422_I:
    596       format = kFormatCbYCrY422H2V1Packed;
    597       break;
    598     case HAL_PIXEL_FORMAT_RGBA_1010102:
    599       format = kFormatRGBA1010102;
    600       break;
    601     case HAL_PIXEL_FORMAT_ARGB_2101010:
    602       format = kFormatARGB2101010;
    603       break;
    604     case HAL_PIXEL_FORMAT_RGBX_1010102:
    605       format = kFormatRGBX1010102;
    606       break;
    607     case HAL_PIXEL_FORMAT_XRGB_2101010:
    608       format = kFormatXRGB2101010;
    609       break;
    610     case HAL_PIXEL_FORMAT_BGRA_1010102:
    611       format = kFormatBGRA1010102;
    612       break;
    613     case HAL_PIXEL_FORMAT_ABGR_2101010:
    614       format = kFormatABGR2101010;
    615       break;
    616     case HAL_PIXEL_FORMAT_BGRX_1010102:
    617       format = kFormatBGRX1010102;
    618       break;
    619     case HAL_PIXEL_FORMAT_XBGR_2101010:
    620       format = kFormatXBGR2101010;
    621       break;
    622     case HAL_PIXEL_FORMAT_YCbCr_420_P010:
    623       format = kFormatYCbCr420P010;
    624       break;
    625     case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC:
    626       format = kFormatYCbCr420TP10Ubwc;
    627       break;
    628     case HAL_PIXEL_FORMAT_YCbCr_420_P010_UBWC:
    629       format = kFormatYCbCr420P010Ubwc;
    630       break;
    631     default:
    632       DLOGW("Unsupported format type = %d", source);
    633       return kFormatInvalid;
    634   }
    635 
    636   return format;
    637 }
    638 
    639 LayerBufferS3DFormat HWCLayer::GetS3DFormat(uint32_t s3d_format) {
    640   LayerBufferS3DFormat sdm_s3d_format = kS3dFormatNone;
    641   switch (s3d_format) {
    642     case HAL_NO_3D:
    643       sdm_s3d_format = kS3dFormatNone;
    644       break;
    645     case HAL_3D_SIDE_BY_SIDE_L_R:
    646       sdm_s3d_format = kS3dFormatLeftRight;
    647       break;
    648     case HAL_3D_SIDE_BY_SIDE_R_L:
    649       sdm_s3d_format = kS3dFormatRightLeft;
    650       break;
    651     case HAL_3D_TOP_BOTTOM:
    652       sdm_s3d_format = kS3dFormatTopBottom;
    653       break;
    654     default:
    655       DLOGW("Invalid S3D format %d", s3d_format);
    656   }
    657   return sdm_s3d_format;
    658 }
    659 
    660 DisplayError HWCLayer::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) {
    661   LayerBuffer *layer_buffer = &layer->input_buffer;
    662   private_handle_t *handle = const_cast<private_handle_t *>(pvt_handle);
    663   IGC_t igc = {};
    664   LayerIGC layer_igc = layer_buffer->igc;
    665   if (getMetaData(handle, GET_IGC, &igc) == 0) {
    666     if (SetIGC(igc, &layer_igc) != kErrorNone) {
    667       return kErrorNotSupported;
    668     }
    669   }
    670 
    671   float fps = 0;
    672   uint32_t frame_rate = layer->frame_rate;
    673   if (getMetaData(handle, GET_REFRESH_RATE, &fps) == 0) {
    674     frame_rate = RoundToStandardFPS(fps);
    675   }
    676 
    677   int32_t interlaced = 0;
    678   bool interlace = layer_buffer->flags.interlace;
    679   if (getMetaData(handle, GET_PP_PARAM_INTERLACED, &interlaced) == 0) {
    680     interlace = interlaced ? true : false;
    681   }
    682   if (interlace != layer_buffer->flags.interlace) {
    683     DLOGI("Layer buffer interlaced metadata has changed. old=%d, new=%d",
    684           layer_buffer->flags.interlace, interlace);
    685   }
    686 
    687   uint32_t linear_format = 0;
    688   if (getMetaData(handle, GET_LINEAR_FORMAT, &linear_format) == 0) {
    689     layer_buffer->format = GetSDMFormat(INT32(linear_format), 0);
    690   }
    691 
    692   uint32_t s3d = 0;
    693   LayerBufferS3DFormat s3d_format = layer_buffer->s3d_format;
    694   if (getMetaData(handle, GET_S3D_FORMAT, &s3d) == 0) {
    695     s3d_format = GetS3DFormat(s3d);
    696   }
    697 
    698   if ((layer_igc != layer_buffer->igc) || (interlace != layer_buffer->flags.interlace) ||
    699       (frame_rate != layer->frame_rate) || (s3d_format != layer_buffer->s3d_format)) {
    700     // Layer buffer metadata has changed.
    701     needs_validate_ = true;
    702     layer_buffer->igc = layer_igc;
    703     layer->frame_rate = frame_rate;
    704     layer_buffer->s3d_format = s3d_format;
    705     layer_buffer->flags.interlace = interlace;
    706   }
    707 
    708   return kErrorNone;
    709 }
    710 
    711 DisplayError HWCLayer::SetIGC(IGC_t source, LayerIGC *target) {
    712   switch (source) {
    713     case IGC_NotSpecified:
    714       *target = kIGCNotSpecified;
    715       break;
    716     case IGC_sRGB:
    717       *target = kIGCsRGB;
    718       break;
    719     default:
    720       DLOGE("Unsupported IGC: %d", source);
    721       return kErrorNotSupported;
    722   }
    723 
    724   return kErrorNone;
    725 }
    726 
    727 
    728 
    729 bool HWCLayer::SupportLocalConversion(ColorPrimaries working_primaries) {
    730   if (layer_->input_buffer.color_metadata.colorPrimaries <= ColorPrimaries_BT601_6_525 &&
    731       working_primaries <= ColorPrimaries_BT601_6_525) {
    732     return true;
    733   }
    734   return false;
    735 }
    736 
    737 bool HWCLayer::ValidateAndSetCSC() {
    738   if (client_requested_ != HWC2::Composition::Device &&
    739       client_requested_ != HWC2::Composition::Cursor) {
    740     // Check the layers which are configured to Device
    741     return true;
    742   }
    743 
    744   LayerBuffer *layer_buffer = &layer_->input_buffer;
    745   bool use_color_metadata = true;
    746 #ifdef FEATURE_WIDE_COLOR
    747   ColorMetaData csc = {};
    748   if (dataspace_ != HAL_DATASPACE_UNKNOWN) {
    749     use_color_metadata = false;
    750     bool valid_csc = GetSDMColorSpace(dataspace_, &csc);
    751     if (!valid_csc) {
    752       return false;
    753     }
    754     // if we are here here, update the sdm layer csc.
    755     layer_buffer->color_metadata.transfer = csc.transfer;
    756     layer_buffer->color_metadata.colorPrimaries = csc.colorPrimaries;
    757     layer_buffer->color_metadata.range = csc.range;
    758   }
    759 #endif
    760 
    761   if (IsBT2020(layer_buffer->color_metadata.colorPrimaries)) {
    762      // android_dataspace_t doesnt support mastering display and light levels
    763      // so retrieve it from metadata for BT2020(HDR)
    764      use_color_metadata = true;
    765   }
    766 
    767   if (use_color_metadata) {
    768     const private_handle_t *handle =
    769       reinterpret_cast<const private_handle_t *>(layer_buffer->buffer_id);
    770     if (sdm::SetCSC(handle, &layer_buffer->color_metadata) != kErrorNone) {
    771       return false;
    772     }
    773   }
    774 
    775   return true;
    776 }
    777 
    778 
    779 uint32_t HWCLayer::RoundToStandardFPS(float fps) {
    780   static const uint32_t standard_fps[4] = {24, 30, 48, 60};
    781   uint32_t frame_rate = (uint32_t)(fps);
    782 
    783   int count = INT(sizeof(standard_fps) / sizeof(standard_fps[0]));
    784   for (int i = 0; i < count; i++) {
    785     if ((standard_fps[i] - frame_rate) < 2) {
    786       // Most likely used for video, the fps can fluctuate
    787       // Ex: b/w 29 and 30 for 30 fps clip
    788       return standard_fps[i];
    789     }
    790   }
    791 
    792   return frame_rate;
    793 }
    794 
    795 void HWCLayer::SetComposition(const LayerComposition &sdm_composition) {
    796   auto hwc_composition = HWC2::Composition::Invalid;
    797   switch (sdm_composition) {
    798     case kCompositionGPU:
    799       hwc_composition = HWC2::Composition::Client;
    800       break;
    801     case kCompositionHWCursor:
    802       hwc_composition = HWC2::Composition::Cursor;
    803       break;
    804     default:
    805       hwc_composition = HWC2::Composition::Device;
    806       break;
    807   }
    808   // Update solid fill composition
    809   if (sdm_composition == kCompositionSDE && layer_->flags.solid_fill != 0) {
    810     hwc_composition = HWC2::Composition::SolidColor;
    811   }
    812   device_selected_ = hwc_composition;
    813 
    814   return;
    815 }
    816 void HWCLayer::PushReleaseFence(int32_t fence) {
    817   release_fences_.push(fence);
    818 }
    819 int32_t HWCLayer::PopReleaseFence(void) {
    820   if (release_fences_.empty())
    821     return -1;
    822   auto fence = release_fences_.front();
    823   release_fences_.pop();
    824   return fence;
    825 }
    826 
    827 }  // namespace sdm
    828