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