1 /* 2 * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include <stdio.h> 31 #include <utils/debug.h> 32 33 #include "hw_scale_drm.h" 34 35 #define __CLASS__ "HWScaleDRM" 36 37 namespace sdm { 38 39 static uint32_t GetScalingFilter(ScalingFilterConfig filter_cfg) { 40 switch (filter_cfg) { 41 case kFilterEdgeDirected: 42 return FILTER_EDGE_DIRECTED_2D; 43 case kFilterCircular: 44 return FILTER_CIRCULAR_2D; 45 case kFilterSeparable: 46 return FILTER_SEPARABLE_1D; 47 case kFilterBilinear: 48 return FILTER_BILINEAR; 49 default: 50 DLOGE("Invalid Scaling Filter"); 51 return kFilterMax; 52 } 53 } 54 55 static uint32_t GetAlphaInterpolation(HWAlphaInterpolation alpha_filter_cfg) { 56 switch (alpha_filter_cfg) { 57 case kInterpolationPixelRepeat: 58 return FILTER_ALPHA_DROP_REPEAT; 59 case kInterpolationBilinear: 60 return FILTER_ALPHA_BILINEAR; 61 default: 62 DLOGE("Invalid Alpha Interpolation"); 63 return kInterpolationMax; 64 } 65 } 66 67 void HWScaleDRM::SetPlaneScaler(const HWScaleData &scale_data, SDEScaler *scaler) { 68 if (version_ == Version::V2) { 69 SetPlaneScalerV2(scale_data, &scaler->scaler_v2); 70 } 71 } 72 73 void HWScaleDRM::SetPlaneScalerV2(const HWScaleData &scale_data, sde_drm_scaler_v2 *scaler) { 74 if (!scale_data.enable.scale && !scale_data.enable.direction_detection && 75 !scale_data.enable.detail_enhance) { 76 return; 77 } 78 79 scaler->enable = scale_data.enable.scale; 80 scaler->dir_en = scale_data.enable.direction_detection; 81 scaler->de.enable = scale_data.detail_enhance.enable; 82 83 for (int i = 0; i < SDE_MAX_PLANES; i++) { 84 const HWPlane &plane = scale_data.plane[i]; 85 scaler->init_phase_x[i] = plane.init_phase_x; 86 scaler->phase_step_x[i] = plane.phase_step_x; 87 scaler->init_phase_y[i] = plane.init_phase_y; 88 scaler->phase_step_y[i] = plane.phase_step_y; 89 90 // TODO(user): Remove right, bottom from HWPlane and rename to LR, TB similar to qseed3 91 // Also remove roi_width which is unused. 92 scaler->pe.num_ext_pxls_lr[i] = plane.left.extension; 93 scaler->pe.num_ext_pxls_tb[i] = plane.top.extension; 94 95 scaler->pe.left_ftch[i] = plane.left.overfetch; 96 scaler->pe.top_ftch[i] = plane.top.overfetch; 97 scaler->pe.right_ftch[i] = plane.right.overfetch; 98 scaler->pe.btm_ftch[i] = plane.bottom.overfetch; 99 100 scaler->pe.left_rpt[i] = plane.left.repeat; 101 scaler->pe.top_rpt[i] = plane.top.repeat; 102 scaler->pe.right_rpt[i] = plane.right.repeat; 103 scaler->pe.btm_rpt[i] = plane.bottom.repeat; 104 105 scaler->preload_x[i] = UINT32(plane.preload_x); 106 scaler->preload_y[i] = UINT32(plane.preload_y); 107 108 scaler->src_width[i] = plane.src_width; 109 scaler->src_height[i] = plane.src_height; 110 } 111 112 scaler->dst_width = scale_data.dst_width; 113 scaler->dst_height = scale_data.dst_height; 114 115 scaler->y_rgb_filter_cfg = GetScalingFilter(scale_data.y_rgb_filter_cfg); 116 scaler->uv_filter_cfg = GetScalingFilter(scale_data.uv_filter_cfg); 117 scaler->alpha_filter_cfg = GetAlphaInterpolation(scale_data.alpha_filter_cfg); 118 scaler->blend_cfg = scale_data.blend_cfg; 119 120 scaler->lut_flag = (scale_data.lut_flag.lut_swap ? SCALER_LUT_SWAP : 0) | 121 (scale_data.lut_flag.lut_dir_wr ? SCALER_LUT_DIR_WR : 0) | 122 (scale_data.lut_flag.lut_y_cir_wr ? SCALER_LUT_Y_CIR_WR : 0) | 123 (scale_data.lut_flag.lut_uv_cir_wr ? SCALER_LUT_UV_CIR_WR : 0) | 124 (scale_data.lut_flag.lut_y_sep_wr ? SCALER_LUT_Y_SEP_WR : 0) | 125 (scale_data.lut_flag.lut_uv_sep_wr ? SCALER_LUT_UV_SEP_WR : 0); 126 127 scaler->dir_lut_idx = scale_data.dir_lut_idx; 128 scaler->y_rgb_cir_lut_idx = scale_data.y_rgb_cir_lut_idx; 129 scaler->uv_cir_lut_idx = scale_data.uv_cir_lut_idx; 130 scaler->y_rgb_sep_lut_idx = scale_data.y_rgb_sep_lut_idx; 131 scaler->uv_sep_lut_idx = scale_data.uv_sep_lut_idx; 132 133 /* TODO(user): Uncomment when de support is added 134 if (scaler->de.enable) { 135 sde_drm_de_v1 *det_enhance = &scaler->de; 136 det_enhance->sharpen_level1 = scale_data.detail_enhance.sharpen_level1; 137 det_enhance->sharpen_level2 = scale_data.detail_enhance.sharpen_level2; 138 det_enhance->clip = scale_data.detail_enhance.clip; 139 det_enhance->limit = scale_data.detail_enhance.limit; 140 det_enhance->thr_quiet = scale_data.detail_enhance.thr_quiet; 141 det_enhance->thr_dieout = scale_data.detail_enhance.thr_dieout; 142 det_enhance->thr_low = scale_data.detail_enhance.thr_low; 143 det_enhance->thr_high = scale_data.detail_enhance.thr_high; 144 det_enhance->prec_shift = scale_data.detail_enhance.prec_shift; 145 146 for (int i = 0; i < SDE_MAX_DE_CURVES; i++) { 147 det_enhance->adjust_a[i] = scale_data.detail_enhance.adjust_a[i]; 148 det_enhance->adjust_b[i] = scale_data.detail_enhance.adjust_b[i]; 149 det_enhance->adjust_c[i] = scale_data.detail_enhance.adjust_c[i]; 150 } 151 } 152 */ 153 154 return; 155 } 156 157 } // namespace sdm 158