• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
GetScalingFilter(ScalingFilterConfig filter_cfg)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 
GetAlphaInterpolation(HWAlphaInterpolation alpha_filter_cfg)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     case kInterpolation2D:
62       return FILTER_ALPHA_2D;
63     default:
64       DLOGE("Invalid Alpha Interpolation");
65       return kInterpolationMax;
66   }
67 }
68 
SetScaler(const HWScaleData & scale_data,SDEScaler * scaler)69 void HWScaleDRM::SetScaler(const HWScaleData &scale_data, SDEScaler *scaler) {
70   if (version_ == Version::V2) {
71     SetScalerV2(scale_data, &scaler->scaler_v2);
72   }
73 }
74 
SetScalerV2(const HWScaleData & scale_data,sde_drm_scaler_v2 * scaler)75 void HWScaleDRM::SetScalerV2(const HWScaleData &scale_data, sde_drm_scaler_v2 *scaler) {
76   if (!scale_data.enable.scale && !scale_data.enable.direction_detection &&
77       !scale_data.enable.detail_enhance) {
78     scaler->enable = 0;
79     scaler->dir_en = 0;
80     scaler->de.enable = 0;
81     return;
82   }
83 
84   scaler->enable = scale_data.enable.scale | scale_data.enable.direction_detection |
85                    scale_data.detail_enhance.enable;
86 
87   scaler->dir_en = scale_data.enable.direction_detection;
88   scaler->de.enable = scale_data.detail_enhance.enable;
89 
90   for (int i = 0; i < SDE_MAX_PLANES; i++) {
91     const HWPlane &plane = scale_data.plane[i];
92     scaler->init_phase_x[i] = plane.init_phase_x;
93     scaler->phase_step_x[i] = plane.phase_step_x;
94     scaler->init_phase_y[i] = plane.init_phase_y;
95     scaler->phase_step_y[i] = plane.phase_step_y;
96 
97     // TODO(user): Remove right, bottom from HWPlane and rename to LR, TB similar to qseed3
98     // Also remove roi_width which is unused.
99     scaler->pe.num_ext_pxls_lr[i] = plane.left.extension;
100     scaler->pe.num_ext_pxls_tb[i] = plane.top.extension;
101 
102     scaler->pe.left_ftch[i] = plane.left.overfetch;
103     scaler->pe.top_ftch[i] = plane.top.overfetch;
104     scaler->pe.right_ftch[i] = plane.right.overfetch;
105     scaler->pe.btm_ftch[i] = plane.bottom.overfetch;
106 
107     scaler->pe.left_rpt[i] = plane.left.repeat;
108     scaler->pe.top_rpt[i] = plane.top.repeat;
109     scaler->pe.right_rpt[i] = plane.right.repeat;
110     scaler->pe.btm_rpt[i] = plane.bottom.repeat;
111 
112     scaler->preload_x[i] = UINT32(plane.preload_x);
113     scaler->preload_y[i] = UINT32(plane.preload_y);
114 
115     scaler->src_width[i] = plane.src_width;
116     scaler->src_height[i] = plane.src_height;
117   }
118 
119   scaler->dst_width = scale_data.dst_width;
120   scaler->dst_height = scale_data.dst_height;
121 
122   scaler->y_rgb_filter_cfg = GetScalingFilter(scale_data.y_rgb_filter_cfg);
123   scaler->uv_filter_cfg = GetScalingFilter(scale_data.uv_filter_cfg);
124   scaler->alpha_filter_cfg = GetAlphaInterpolation(scale_data.alpha_filter_cfg);
125   scaler->blend_cfg = scale_data.blend_cfg;
126 
127   scaler->lut_flag = (scale_data.lut_flag.lut_swap ? SCALER_LUT_SWAP : 0) |
128                      (scale_data.lut_flag.lut_dir_wr ? SCALER_LUT_DIR_WR : 0) |
129                      (scale_data.lut_flag.lut_y_cir_wr ? SCALER_LUT_Y_CIR_WR : 0) |
130                      (scale_data.lut_flag.lut_uv_cir_wr ? SCALER_LUT_UV_CIR_WR : 0) |
131                      (scale_data.lut_flag.lut_y_sep_wr ? SCALER_LUT_Y_SEP_WR : 0) |
132                      (scale_data.lut_flag.lut_uv_sep_wr ? SCALER_LUT_UV_SEP_WR : 0);
133 
134   scaler->dir_lut_idx = scale_data.dir_lut_idx;
135   scaler->y_rgb_cir_lut_idx = scale_data.y_rgb_cir_lut_idx;
136   scaler->uv_cir_lut_idx = scale_data.uv_cir_lut_idx;
137   scaler->y_rgb_sep_lut_idx = scale_data.y_rgb_sep_lut_idx;
138   scaler->uv_sep_lut_idx = scale_data.uv_sep_lut_idx;
139 
140   if (scaler->de.enable) {
141     sde_drm_de_v1 *det_enhance = &scaler->de;
142     det_enhance->sharpen_level1 = scale_data.detail_enhance.sharpen_level1;
143     det_enhance->sharpen_level2 = scale_data.detail_enhance.sharpen_level2;
144     det_enhance->clip = scale_data.detail_enhance.clip;
145     det_enhance->limit = scale_data.detail_enhance.limit;
146     det_enhance->thr_quiet = scale_data.detail_enhance.thr_quiet;
147     det_enhance->thr_dieout = scale_data.detail_enhance.thr_dieout;
148     det_enhance->thr_low = scale_data.detail_enhance.thr_low;
149     det_enhance->thr_high = scale_data.detail_enhance.thr_high;
150     det_enhance->prec_shift = scale_data.detail_enhance.prec_shift;
151 
152     for (int i = 0; i < SDE_MAX_DE_CURVES; i++) {
153       det_enhance->adjust_a[i] = scale_data.detail_enhance.adjust_a[i];
154       det_enhance->adjust_b[i] = scale_data.detail_enhance.adjust_b[i];
155       det_enhance->adjust_c[i] = scale_data.detail_enhance.adjust_c[i];
156     }
157   }
158 
159   return;
160 }
161 
162 }  // namespace sdm
163