12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/*
22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without modification, are permitted
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* provided that the following conditions are met:
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions of source code must retain the above copyright notice, this list of
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      conditions and the following disclaimer.
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions in binary form must reproduce the above copyright notice, this list of
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      conditions and the following disclaimer in the documentation and/or other materials provided
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      with the distribution.
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Neither the name of The Linux Foundation nor the names of its contributors may be used to
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      endorse or promote products derived from this software without specific prior written
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      permission.
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <math.h>
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/constants.h>
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/debug.h>
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/rect.h>
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/formats.h>
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/sys.h>
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <dlfcn.h>
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <algorithm>
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "resource_default.h"
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __CLASS__ "ResourceDefault"
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm {
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
40eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError ResourceDefault::CreateResourceDefault(const HWResourceInfo &hw_resource_info,
41eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel                                                    ResourceInterface **resource_intf) {
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
44eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  ResourceDefault *resource_default = new ResourceDefault(hw_resource_info);
45eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  if (!resource_default) {
46eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel    return kErrorNone;
47eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  }
48eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
49eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  error = resource_default->Init();
50eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  if (error != kErrorNone) {
51eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel    delete resource_default;
52eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  }
53eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
54eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  *resource_intf = resource_default;
55eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
56eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  return kErrorNone;
57eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel}
58eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
59eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError ResourceDefault::DestroyResourceDefault(ResourceInterface *resource_intf) {
60eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  ResourceDefault *resource_default = static_cast<ResourceDefault *>(resource_intf);
61eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
62eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  resource_default->Deinit();
63eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  delete resource_default;
64eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
65eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  return kErrorNone;
66eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel}
67eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
68eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelResourceDefault::ResourceDefault(const HWResourceInfo &hw_res_info)
69eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  : hw_res_info_(hw_res_info) {
70eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel}
71eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
72eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError ResourceDefault::Init() {
73eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  DisplayError error = kErrorNone;
74eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
75eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  num_pipe_ = hw_res_info_.num_vig_pipe + hw_res_info_.num_rgb_pipe + hw_res_info_.num_dma_pipe;
762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!num_pipe_) {
782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGE("Number of H/W pipes is Zero!");
792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorParameters;
802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_pipes_.resize(num_pipe_);
832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Priority order of pipes: VIG, RGB, DMA
852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t vig_index = 0;
862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t rgb_index = hw_res_info_.num_vig_pipe;
872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t dma_index = rgb_index + hw_res_info_.num_rgb_pipe;
882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < num_pipe_; i++) {
902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    const HWPipeCaps &pipe_caps = hw_res_info_.hw_pipes.at(i);
912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (pipe_caps.type == kPipeTypeVIG) {
922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[vig_index].type = kPipeTypeVIG;
932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[vig_index].index = i;
942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[vig_index].mdss_pipe_id = pipe_caps.id;
952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      vig_index++;
962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    } else if (pipe_caps.type == kPipeTypeRGB) {
972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[rgb_index].type = kPipeTypeRGB;
982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[rgb_index].index = i;
992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[rgb_index].mdss_pipe_id = pipe_caps.id;
1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      rgb_index++;
1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    } else if (pipe_caps.type == kPipeTypeDMA) {
1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[dma_index].type = kPipeTypeDMA;
1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[dma_index].index = i;
1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[dma_index].mdss_pipe_id = pipe_caps.id;
1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      dma_index++;
1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < num_pipe_; i++) {
1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    src_pipes_[i].priority = INT(i);
1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGI("hw_rev=%x, DMA=%d RGB=%d VIG=%d", hw_res_info_.hw_revision, hw_res_info_.num_dma_pipe,
1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    hw_res_info_.num_rgb_pipe, hw_res_info_.num_vig_pipe);
1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (hw_res_info_.max_scale_down < 1 || hw_res_info_.max_scale_up < 1) {
1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGE("Max scaling setting is invalid! max_scale_down = %d, max_scale_up = %d",
1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel          hw_res_info_.max_scale_down, hw_res_info_.max_scale_up);
1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    hw_res_info_.max_scale_down = 1;
1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    hw_res_info_.max_scale_up = 1;
1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // TODO(user): clean it up, query from driver for initial pipe status.
1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#ifndef SDM_VIRTUAL_DRIVER
1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  rgb_index = hw_res_info_.num_vig_pipe;
1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_pipes_[rgb_index].owner = kPipeOwnerKernelMode;
1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_pipes_[rgb_index + 1].owner = kPipeOwnerKernelMode;
1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#endif
1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return error;
1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::Deinit() {
1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::RegisterDisplay(DisplayType type,
1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                              const HWDisplayAttributes &display_attributes,
1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                              const HWPanelInfo &hw_panel_info,
1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                              const HWMixerAttributes &mixer_attributes,
1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                              Handle *display_ctx) {
1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWBlockType hw_block_id = kHWBlockMax;
1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  switch (type) {
1462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  case kPrimary:
1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (!hw_block_ctx_[kHWPrimary].is_in_use) {
1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      hw_block_id = kHWPrimary;
1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    break;
1512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  case kHDMI:
1532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (!hw_block_ctx_[kHWHDMI].is_in_use) {
1542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      hw_block_id = kHWHDMI;
1552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    break;
1572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  default:
1592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGW("RegisterDisplay, invalid type %d", type);
1602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorParameters;
1612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (hw_block_id == kHWBlockMax) {
1642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorResources;
1652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayResourceContext *display_resource_ctx = new DisplayResourceContext();
1682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!display_resource_ctx) {
1692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorMemory;
1702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
1712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  hw_block_ctx_[hw_block_id].is_in_use = true;
1732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  display_resource_ctx->display_attributes = display_attributes;
1752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  display_resource_ctx->hw_block_id = hw_block_id;
1762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  display_resource_ctx->mixer_attributes = mixer_attributes;
1772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  *display_ctx = display_resource_ctx;
1792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return error;
1802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::UnregisterDisplay(Handle display_ctx) {
1832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayResourceContext *display_resource_ctx =
1842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          reinterpret_cast<DisplayResourceContext *>(display_ctx);
1852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Purge(display_ctx);
1862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  hw_block_ctx_[display_resource_ctx->hw_block_id].is_in_use = false;
1882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  delete display_resource_ctx;
1902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
1922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ReconfigureDisplay(Handle display_ctx,
1952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                 const HWDisplayAttributes &display_attributes,
1962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                 const HWPanelInfo &hw_panel_info,
1972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                 const HWMixerAttributes &mixer_attributes) {
1982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SCOPE_LOCK(locker_);
1992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayResourceContext *display_resource_ctx =
2012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          reinterpret_cast<DisplayResourceContext *>(display_ctx);
2022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  display_resource_ctx->display_attributes = display_attributes;
2042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  display_resource_ctx->mixer_attributes = mixer_attributes;
2052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
2072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::Start(Handle display_ctx) {
2102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  locker_.Lock();
2112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
2132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::Stop(Handle display_ctx) {
2162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  locker_.Unlock();
2172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
2192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
221eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError ResourceDefault::Prepare(Handle display_ctx, HWLayers *hw_layers) {
2222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayResourceContext *display_resource_ctx =
2232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          reinterpret_cast<DisplayResourceContext *>(display_ctx);
2242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
2262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const struct HWLayersInfo &layer_info = hw_layers->info;
2272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWBlockType hw_block_id = display_resource_ctx->hw_block_id;
2282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "==== Resource reserving start: hw_block = %d ====", hw_block_id);
2302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
231b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  if (layer_info.hw_layers.size() > 1) {
2322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "More than one FB layers");
2332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorResources;
2342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
236b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  const Layer &layer = layer_info.hw_layers.at(0);
2372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
238b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  if (layer.composition != kCompositionGPUTarget) {
2392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "Not an FB layer");
2402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorParameters;
2412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = Config(display_resource_ctx, hw_layers);
2442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
2452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "Resource config failed");
2462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
2472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < num_pipe_; i++) {
2502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (src_pipes_[i].hw_block_id == hw_block_id && src_pipes_[i].owner == kPipeOwnerUserMode) {
2512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[i].ResetState();
2522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t left_index = num_pipe_;
2562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t right_index = num_pipe_;
2572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool need_scale = false;
2582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  struct HWLayerConfig &layer_config = hw_layers->config[0];
2602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo *left_pipe = &layer_config.left_pipe;
2622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo *right_pipe = &layer_config.right_pipe;
2632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // left pipe is needed
2652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (left_pipe->valid) {
2662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    need_scale = IsScalingNeeded(left_pipe);
2672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_index = GetPipe(hw_block_id, need_scale);
2682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (left_index >= num_pipe_) {
2692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      DLOGV_IF(kTagResources, "Get left pipe failed: hw_block_id = %d, need_scale = %d",
2702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel               hw_block_id, need_scale);
2712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      ResourceStateLog();
2722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      goto CleanupOnError;
2732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = SetDecimationFactor(left_pipe);
2772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
2782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    goto CleanupOnError;
2792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!right_pipe->valid) {
2822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // assign single pipe
2832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (left_index < num_pipe_) {
2842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      left_pipe->pipe_id = src_pipes_[left_index].mdss_pipe_id;
2852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "1 pipe acquired for FB layer, left_pipe = %x", left_pipe->pipe_id);
2872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNone;
2882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  need_scale = IsScalingNeeded(right_pipe);
2912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  right_index = GetPipe(hw_block_id, need_scale);
2932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (right_index >= num_pipe_) {
2942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "Get right pipe failed: hw_block_id = %d, need_scale = %d", hw_block_id,
2952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel             need_scale);
2962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    ResourceStateLog();
2972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    goto CleanupOnError;
2982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
2992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (src_pipes_[right_index].priority < src_pipes_[left_index].priority) {
3012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // Swap pipe based on priority
3022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    std::swap(left_index, right_index);
3032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
3042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // assign dual pipes
3062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  left_pipe->pipe_id = src_pipes_[left_index].mdss_pipe_id;
3072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  right_pipe->pipe_id = src_pipes_[right_index].mdss_pipe_id;
3082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = SetDecimationFactor(right_pipe);
3102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
3112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    goto CleanupOnError;
3122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
3132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "2 pipes acquired for FB layer, left_pipe = %x, right_pipe = %x",
3152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel           left_pipe->pipe_id,  right_pipe->pipe_id);
3162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
3182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelCleanupOnError:
3202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "Resource reserving failed! hw_block = %d", hw_block_id);
3212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorResources;
3232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::PostPrepare(Handle display_ctx, HWLayers *hw_layers) {
3262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SCOPE_LOCK(locker_);
3272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
3292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
331eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError ResourceDefault::Commit(Handle display_ctx, HWLayers *hw_layers) {
332eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  SCOPE_LOCK(locker_);
333eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
334eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel  return kErrorNone;
335eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel}
336eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel
3372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::PostCommit(Handle display_ctx, HWLayers *hw_layers) {
3382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SCOPE_LOCK(locker_);
3392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayResourceContext *display_resource_ctx =
3402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          reinterpret_cast<DisplayResourceContext *>(display_ctx);
3412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWBlockType hw_block_id = display_resource_ctx->hw_block_id;
3422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint64_t frame_count = display_resource_ctx->frame_count;
3432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "Resource for hw_block = %d, frame_count = %d", hw_block_id, frame_count);
3452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // handoff pipes which are used by splash screen
3472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if ((frame_count == 0) && (hw_block_id == kHWPrimary)) {
3482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    for (uint32_t i = 0; i < num_pipe_; i++) {
3492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      if (src_pipes_[i].hw_block_id == hw_block_id && src_pipes_[i].owner == kPipeOwnerKernelMode) {
3502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        src_pipes_[i].owner = kPipeOwnerUserMode;
3512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      }
3522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
3542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (hw_layers->info.sync_handle >= 0)
3562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Sys::close_(hw_layers->info.sync_handle);
3572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  display_resource_ctx->frame_count++;
3592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
3612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid ResourceDefault::Purge(Handle display_ctx) {
3642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SCOPE_LOCK(locker_);
3652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayResourceContext *display_resource_ctx =
3672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          reinterpret_cast<DisplayResourceContext *>(display_ctx);
3682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWBlockType hw_block_id = display_resource_ctx->hw_block_id;
3692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < num_pipe_; i++) {
3712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (src_pipes_[i].hw_block_id == hw_block_id && src_pipes_[i].owner == kPipeOwnerUserMode) {
3722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipes_[i].ResetState();
3732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
3752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "display id = %d", display_resource_ctx->hw_block_id);
3762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages) {
3792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SCOPE_LOCK(locker_);
3802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
3822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeluint32_t ResourceDefault::SearchPipe(HWBlockType hw_block_id, SourcePipe *src_pipes,
3852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                uint32_t num_pipe) {
3862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t index = num_pipe_;
3872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SourcePipe *src_pipe;
3882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // search the pipe being used
3902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < num_pipe; i++) {
3912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    src_pipe = &src_pipes[i];
3922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (src_pipe->owner == kPipeOwnerUserMode && src_pipe->hw_block_id == kHWBlockMax) {
3932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      index = src_pipe->index;
3942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      src_pipe->hw_block_id = hw_block_id;
3952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
3962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
3982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return index;
4002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
4012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeluint32_t ResourceDefault::NextPipe(PipeType type, HWBlockType hw_block_id) {
4032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t num_pipe = 0;
4042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  SourcePipe *src_pipes = NULL;
4052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  switch (type) {
4072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  case kPipeTypeVIG:
4082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    src_pipes = &src_pipes_[0];
4092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    num_pipe = hw_res_info_.num_vig_pipe;
4102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    break;
4112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  case kPipeTypeRGB:
4122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    src_pipes = &src_pipes_[hw_res_info_.num_vig_pipe];
4132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    num_pipe = hw_res_info_.num_rgb_pipe;
4142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    break;
4152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  case kPipeTypeDMA:
4162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  default:
4172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    src_pipes = &src_pipes_[hw_res_info_.num_vig_pipe + hw_res_info_.num_rgb_pipe];
4182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    num_pipe = hw_res_info_.num_dma_pipe;
4192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    break;
4202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
4212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return SearchPipe(hw_block_id, src_pipes, num_pipe);
4232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
4242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeluint32_t ResourceDefault::GetPipe(HWBlockType hw_block_id, bool need_scale) {
4262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t index = num_pipe_;
4272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // The default behavior is to assume RGB and VG pipes have scalars
4292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!need_scale) {
4302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    index = NextPipe(kPipeTypeDMA, hw_block_id);
4312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
4322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if ((index >= num_pipe_) && (!need_scale || !hw_res_info_.has_non_scalar_rgb)) {
4342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    index = NextPipe(kPipeTypeRGB, hw_block_id);
4352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
4362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (index >= num_pipe_) {
4382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    index = NextPipe(kPipeTypeVIG, hw_block_id);
4392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
4402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return index;
4422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
4432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool ResourceDefault::IsScalingNeeded(const HWPipeInfo *pipe_info) {
4452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const LayerRect &src_roi = pipe_info->src_roi;
4462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const LayerRect &dst_roi = pipe_info->dst_roi;
4472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return ((dst_roi.right - dst_roi.left) != (src_roi.right - src_roi.left)) ||
4492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel          ((dst_roi.bottom - dst_roi.top) != (src_roi.bottom - src_roi.top));
4502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
4512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid ResourceDefault::ResourceStateLog() {
4532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "==== resource manager pipe state ====");
4542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t i;
4552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (i = 0; i < num_pipe_; i++) {
4562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    SourcePipe *src_pipe = &src_pipes_[i];
4572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "index = %d, id = %x, hw_block = %d, owner = %s",
4582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                 src_pipe->index, src_pipe->mdss_pipe_id, src_pipe->hw_block_id,
4592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                 (src_pipe->owner == kPipeOwnerUserMode) ? "user mode" : "kernel mode");
4602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
4612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
4622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::SrcSplitConfig(DisplayResourceContext *display_resource_ctx,
4642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                        const LayerRect &src_rect, const LayerRect &dst_rect,
4652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                        HWLayerConfig *layer_config) {
4662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo *left_pipe = &layer_config->left_pipe;
4672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo *right_pipe = &layer_config->right_pipe;
4682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float src_width = src_rect.right - src_rect.left;
4692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_width = dst_rect.right - dst_rect.left;
4702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Layer cannot qualify for SrcSplit if source or destination width exceeds max pipe width.
4722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if ((src_width > hw_res_info_.max_pipe_width) || (dst_width > hw_res_info_.max_pipe_width)) {
4732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    SplitRect(src_rect, dst_rect, &left_pipe->src_roi, &left_pipe->dst_roi, &right_pipe->src_roi,
4742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel              &right_pipe->dst_roi);
4752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->valid = true;
4762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->valid = true;
4772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  } else {
4782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->src_roi = src_rect;
4792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->dst_roi = dst_rect;
4802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->valid = true;
4812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->Reset();
4822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
4832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
4852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
4862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::DisplaySplitConfig(DisplayResourceContext *display_resource_ctx,
4882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                            const LayerRect &src_rect, const LayerRect &dst_rect,
4892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                            HWLayerConfig *layer_config) {
4902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWMixerAttributes &mixer_attributes = display_resource_ctx->mixer_attributes;
4912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // for display split case
4932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo *left_pipe = &layer_config->left_pipe;
4942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo *right_pipe = &layer_config->right_pipe;
4952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  LayerRect scissor_left, scissor_right, dst_left, crop_left, crop_right, dst_right;
4962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
4972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  scissor_left.right = FLOAT(mixer_attributes.split_left);
4982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  scissor_left.bottom = FLOAT(mixer_attributes.height);
4992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  scissor_right.left = FLOAT(mixer_attributes.split_left);
5012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  scissor_right.top = 0.0f;
5022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  scissor_right.right = FLOAT(mixer_attributes.width);
5032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  scissor_right.bottom = FLOAT(mixer_attributes.height);
5042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  crop_left = src_rect;
5062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_left = dst_rect;
5072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  crop_right = crop_left;
5082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_right = dst_left;
5092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool crop_left_valid = CalculateCropRects(scissor_left, &crop_left, &dst_left);
5112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool crop_right_valid = false;
5122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (IsValid(scissor_right)) {
5142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    crop_right_valid = CalculateCropRects(scissor_right, &crop_right, &dst_right);
5152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Reset left_pipe and right_pipe to invalid by default
5182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  left_pipe->Reset();
5192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  right_pipe->Reset();
5202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (crop_left_valid) {
5222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // assign left pipe
5232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->src_roi = crop_left;
5242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->dst_roi = dst_left;
5252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_pipe->valid = true;
5262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // assign right pipe if needed
5292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (crop_right_valid) {
5302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->src_roi = crop_right;
5312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->dst_roi = dst_right;
5322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->valid = true;
5332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
5362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
5372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::Config(DisplayResourceContext *display_resource_ctx,
5392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                HWLayers *hw_layers) {
5402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWLayersInfo &layer_info = hw_layers->info;
5412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
542b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  const Layer &layer = layer_info.hw_layers.at(0);
5432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
544b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  error = ValidateLayerParams(&layer);
5452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
5462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
5472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  struct HWLayerConfig *layer_config = &hw_layers->config[0];
5502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo &left_pipe = layer_config->left_pipe;
5512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWPipeInfo &right_pipe = layer_config->right_pipe;
5522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
553b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  LayerRect src_rect = layer.src_rect;
554b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  LayerRect dst_rect = layer.dst_rect;
5552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = ValidateDimensions(src_rect, dst_rect);
5572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
5582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
5592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
561b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  BufferLayout layout = GetBufferLayout(layer.input_buffer.format);
562051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel  error = ValidateScaling(src_rect, dst_rect, false /*rotated90 */, layout,
5632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          false /* use_rotator_downscale */);
5642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
5652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
5662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (hw_res_info_.is_src_split) {
5692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    error = SrcSplitConfig(display_resource_ctx, src_rect, dst_rect, layer_config);
5702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  } else {
5712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    error = DisplaySplitConfig(display_resource_ctx, src_rect, dst_rect, layer_config);
5722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
5752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
5762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
578b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  error = AlignPipeConfig(&layer, &left_pipe, &right_pipe);
5792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
5802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
5812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // set z_order, left_pipe should always be valid
5842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  left_pipe.z_order = 0;
5852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "==== FB layer Config ====");
587b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  Log(kTagResources, "input layer src_rect", layer.src_rect);
588b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  Log(kTagResources, "input layer dst_rect", layer.dst_rect);
5892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Log(kTagResources, "cropped src_rect", src_rect);
5902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Log(kTagResources, "cropped dst_rect", dst_rect);
5912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Log(kTagResources, "left pipe src", layer_config->left_pipe.src_roi);
5922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Log(kTagResources, "left pipe dst", layer_config->left_pipe.dst_roi);
5932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (right_pipe.valid) {
5942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe.z_order = 0;
5952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Log(kTagResources, "right pipe src", layer_config->right_pipe.src_roi);
5962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Log(kTagResources, "right pipe dst", layer_config->right_pipe.dst_roi);
5972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
5982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
5992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return error;
6002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
6012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool ResourceDefault::CalculateCropRects(const LayerRect &scissor, LayerRect *crop,
6032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                         LayerRect *dst) {
6042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &crop_left = crop->left;
6052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &crop_top = crop->top;
6062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &crop_right = crop->right;
6072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &crop_bottom = crop->bottom;
6082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float crop_width = crop->right - crop->left;
6092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float crop_height = crop->bottom - crop->top;
6102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &dst_left = dst->left;
6122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &dst_top = dst->top;
6132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &dst_right = dst->right;
6142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float &dst_bottom = dst->bottom;
6152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_width = dst->right - dst->left;
6162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_height = dst->bottom - dst->top;
6172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const float &sci_left = scissor.left;
6192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const float &sci_top = scissor.top;
6202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const float &sci_right = scissor.right;
6212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const float &sci_bottom = scissor.bottom;
6222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float left_cut_ratio = 0.0, right_cut_ratio = 0.0, top_cut_ratio = 0.0, bottom_cut_ratio = 0.0;
6242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool need_cut = false;
6252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (dst_left < sci_left) {
6272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    left_cut_ratio = (sci_left - dst_left) / dst_width;
6282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    dst_left = sci_left;
6292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    need_cut = true;
6302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (dst_right > sci_right) {
6332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_cut_ratio = (dst_right - sci_right) / dst_width;
6342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    dst_right = sci_right;
6352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    need_cut = true;
6362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (dst_top < sci_top) {
6392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    top_cut_ratio = (sci_top - dst_top) / (dst_height);
6402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    dst_top = sci_top;
6412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    need_cut = true;
6422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (dst_bottom > sci_bottom) {
6452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    bottom_cut_ratio = (dst_bottom - sci_bottom) / (dst_height);
6462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    dst_bottom = sci_bottom;
6472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    need_cut = true;
6482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!need_cut)
6512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return true;
6522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  crop_left += crop_width * left_cut_ratio;
6542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  crop_top += crop_height * top_cut_ratio;
6552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  crop_right -= crop_width * right_cut_ratio;
6562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  crop_bottom -= crop_height * bottom_cut_ratio;
6572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Normalize(1, 1, crop);
6582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Normalize(1, 1, dst);
6592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (IsValid(*crop) && IsValid(*dst))
6602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return true;
6612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  else
6622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return false;
6632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
6642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateLayerParams(const Layer *layer) {
6662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const LayerRect &src = layer->src_rect;
6672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const LayerRect &dst = layer->dst_rect;
668b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  const LayerBuffer &input_buffer = layer->input_buffer;
6692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
670b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  if (input_buffer.format == kFormatInvalid) {
671b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel    DLOGV_IF(kTagResources, "Invalid input buffer format %d", input_buffer.format);
6722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
6732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!IsValid(src) || !IsValid(dst)) {
6762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Log(kTagResources, "input layer src_rect", src);
6772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Log(kTagResources, "input layer dst_rect", dst);
6782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
6792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Make sure source in integral only if it is a non secure layer.
682b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  if (!input_buffer.flags.secure &&
6832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      ((src.left - roundf(src.left) != 0.0f) ||
6842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel       (src.top - roundf(src.top) != 0.0f) ||
6852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel       (src.right - roundf(src.right) != 0.0f) ||
6862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel       (src.bottom - roundf(src.bottom) != 0.0f))) {
6872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "Input ROI is not integral");
6882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
6892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
6922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
6932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
6942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateDimensions(const LayerRect &crop, const LayerRect &dst) {
6952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!IsValid(crop)) {
6962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Log(kTagResources, "Invalid crop rect", crop);
6972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
6982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
6992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!IsValid(dst)) {
7012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Log(kTagResources, "Invalid dst rect", dst);
7022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
7032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float crop_width = crop.right - crop.left;
7062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float crop_height = crop.bottom - crop.top;
7072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_width = dst.right - dst.left;
7082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_height = dst.bottom - dst.top;
7092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if ((UINT32(crop_width - dst_width) == 1) || (UINT32(crop_height - dst_height) == 1)) {
7112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "One pixel downscaling detected crop_w = %.0f, dst_w = %.0f, " \
7122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel             "crop_h = %.0f, dst_h = %.0f", crop_width, dst_width, crop_height, dst_height);
7132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
7142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
7172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
7182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
719051dfd82677c3ad0bb124eb403b75e243650234eThierry StrudelDisplayError ResourceDefault::ValidatePipeParams(HWPipeInfo *pipe_info, LayerBufferFormat format) {
7202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
7212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const LayerRect &src_rect = pipe_info->src_roi;
7232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  const LayerRect &dst_rect = pipe_info->dst_roi;
7242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = ValidateDimensions(src_rect, dst_rect);
7262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
7272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
7282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
730051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel  BufferLayout layout = GetBufferLayout(format);
731051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel  error = ValidateScaling(src_rect, dst_rect, false /* rotated90 */, layout,
7322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                          false /* use_rotator_downscale */);
7332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
7342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
7352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
7382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
7392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateScaling(const LayerRect &crop, const LayerRect &dst,
741051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel                                              bool rotate90, BufferLayout layout,
7422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                              bool use_rotator_downscale) {
7432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
7442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float scale_x = 1.0f;
7462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float scale_y = 1.0f;
7472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = GetScaleFactor(crop, dst, &scale_x, &scale_y);
7492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
7502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
7512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
753051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel  error = ValidateDownScaling(scale_x, scale_y, (layout != kLinear));
7542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
7552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
7562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  error = ValidateUpScaling(scale_x, scale_y);
7592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
7602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return error;
7612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
7642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
7652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateDownScaling(float scale_x, float scale_y, bool ubwc_tiled) {
7672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if ((UINT32(scale_x) > 1) || (UINT32(scale_y) > 1)) {
7682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    float max_scale_down = FLOAT(hw_res_info_.max_scale_down);
7692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // MDP H/W cannot apply decimation on UBWC tiled framebuffer
7712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (!ubwc_tiled && hw_res_info_.has_decimation) {
7722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      max_scale_down *= FLOAT(kMaxDecimationDownScaleRatio);
7732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
7742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (scale_x > max_scale_down || scale_y > max_scale_down) {
7762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      DLOGV_IF(kTagResources,
7772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel               "Scaling down is over the limit: scale_x = %.0f, scale_y = %.0f, " \
7782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel               "has_deci = %d", scale_x, scale_y, hw_res_info_.has_decimation);
7792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      return kErrorNotSupported;
7802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
7812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "scale_x = %.4f, scale_y = %.4f", scale_x, scale_y);
7842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
7862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
7872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateUpScaling(float scale_x, float scale_y) {
7892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float max_scale_up = FLOAT(hw_res_info_.max_scale_up);
7902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (UINT32(scale_x) < 1 && scale_x > 0.0f) {
7922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if ((1.0f / scale_x) > max_scale_up) {
7932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      DLOGV_IF(kTagResources, "Scaling up is over limit scale_x = %f", 1.0f / scale_x);
7942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      return kErrorNotSupported;
7952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
7962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
7972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
7982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (UINT32(scale_y) < 1 && scale_y > 0.0f) {
7992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if ((1.0f / scale_y) > max_scale_up) {
8002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      DLOGV_IF(kTagResources, "Scaling up is over limit scale_y = %f", 1.0f / scale_y);
8012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      return kErrorNotSupported;
8022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
8032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
8042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGV_IF(kTagResources, "scale_x = %.4f, scale_y = %.4f", scale_x, scale_y);
8062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
8082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
8092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::GetScaleFactor(const LayerRect &crop, const LayerRect &dst,
8112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                        float *scale_x, float *scale_y) {
8122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float crop_width = crop.right - crop.left;
8132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float crop_height = crop.bottom - crop.top;
8142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_width = dst.right - dst.left;
8152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_height = dst.bottom - dst.top;
8162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  *scale_x = crop_width / dst_width;
8182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  *scale_y = crop_height / dst_height;
8192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
8212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
8222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::SetDecimationFactor(HWPipeInfo *pipe) {
8242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float src_h = pipe->src_roi.bottom - pipe->src_roi.top;
8252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_h = pipe->dst_roi.bottom - pipe->dst_roi.top;
8262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float down_scale_h = src_h / dst_h;
8272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float src_w = pipe->src_roi.right - pipe->src_roi.left;
8292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_w = pipe->dst_roi.right - pipe->dst_roi.left;
8302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float down_scale_w = src_w / dst_w;
8312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  pipe->horizontal_decimation = 0;
8332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  pipe->vertical_decimation = 0;
8342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (CalculateDecimation(down_scale_w, &pipe->horizontal_decimation) != kErrorNone) {
8362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
8372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
8382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (CalculateDecimation(down_scale_h, &pipe->vertical_decimation) != kErrorNone) {
8402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
8412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
8422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DLOGI_IF(kTagResources, "horizontal_decimation %d, vertical_decimation %d",
8442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel           pipe->horizontal_decimation, pipe->vertical_decimation);
8452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
8472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
8482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid ResourceDefault::SplitRect(const LayerRect &src_rect, const LayerRect &dst_rect,
8502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                           LayerRect *src_left, LayerRect *dst_left, LayerRect *src_right,
8512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                           LayerRect *dst_right) {
8522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Split rectangle horizontally and evenly into two.
8532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float src_width = src_rect.right - src_rect.left;
8542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float dst_width = dst_rect.right - dst_rect.left;
8552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float src_width_ori = src_width;
8562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_width = ROUND_UP_ALIGN_DOWN(src_width / 2, 1);
8572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_width = ROUND_UP_ALIGN_DOWN(dst_width * src_width / src_width_ori, 1);
8582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_left->left = src_rect.left;
8602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_left->right = src_rect.left + src_width;
8612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_right->left = src_left->right;
8622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_right->right = src_rect.right;
8632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_left->top = src_rect.top;
8652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_left->bottom = src_rect.bottom;
8662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_right->top = src_rect.top;
8672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  src_right->bottom = src_rect.bottom;
8682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_left->top = dst_rect.top;
8702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_left->bottom = dst_rect.bottom;
8712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_right->top = dst_rect.top;
8722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_right->bottom = dst_rect.bottom;
8732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_left->left = dst_rect.left;
8752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_left->right = dst_rect.left + dst_width;
8762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_right->left = dst_left->right;
8772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  dst_right->right = dst_rect.right;
8782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
8792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::AlignPipeConfig(const Layer *layer, HWPipeInfo *left_pipe,
8812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                              HWPipeInfo *right_pipe) {
8822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DisplayError error = kErrorNone;
8832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!left_pipe->valid) {
8842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGE_IF(kTagResources, "left_pipe should not be invalid");
8852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
8862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
8872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
888b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  error = ValidatePipeParams(left_pipe, layer->input_buffer.format);
8892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
8902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    goto PipeConfigExit;
8912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
8922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
8932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (right_pipe->valid) {
8942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    // Make sure the  left and right ROI are conjunct
8952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->src_roi.left = left_pipe->src_roi.right;
8962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    right_pipe->dst_roi.left = left_pipe->dst_roi.right;
897b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel    error = ValidatePipeParams(right_pipe, layer->input_buffer.format);
8982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
8992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelPipeConfigExit:
9012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (error != kErrorNone) {
9022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGV_IF(kTagResources, "AlignPipeConfig failed");
9032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
9042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return error;
9052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::CalculateDecimation(float downscale, uint8_t *decimation) {
9082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  float max_down_scale = FLOAT(hw_res_info_.max_scale_down);
9092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (downscale <= max_down_scale) {
9112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    *decimation = 0;
9122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNone;
9132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  } else if (!hw_res_info_.has_decimation) {
9142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DLOGE("Downscaling exceeds the maximum MDP downscale limit but decimation not enabled");
9152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorNotSupported;
9162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
9172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Decimation is the remaining downscale factor after doing max SDE downscale.
9192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // In SDE, decimation is supported in powers of 2.
9202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // For ex: If a pipe needs downscale of 8 but max_down_scale is 4
9212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // So decimation = powf(2.0, ceilf(log2f(8 / 4))) = powf(2.0, 1.0) = 2
9222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  *decimation = UINT8(ceilf(log2f(downscale / max_down_scale)));
9232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
9242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateCursorConfig(Handle display_ctx, const Layer *layer,
9272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                   bool is_top) {
9282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNotSupported;
9292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers,
9322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                     int x, int y) {
9332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNotSupported;
9342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::SetMaxBandwidthMode(HWBwModes mode) {
9372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNotSupported;
9382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::GetScaleLutConfig(HWScaleLutInfo *lut_info) {
9412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
9422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError ResourceDefault::SetDetailEnhancerData(Handle display_ctx,
9452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                    const DisplayDetailEnhancerData &de_data) {
9462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNotSupported;
9472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
9482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
9492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}  // namespace sdm
950