spl_in
struct spl_in *spl_in = &pipe_ctx->plane_res.spl_in;
translate_SPL_in_params_from_pipe_ctx(pipe_ctx, spl_in);
&spl_in->debug.visual_confirm_base_offset,
&spl_in->debug.visual_confirm_dpp_offset);
res = spl_calculate_scaler_params(spl_in, spl_out);
spl_in->basic_out.view_format = (enum spl_view_3d)stream->view_format;
populate_splrect_from_rect(&spl_in->basic_in.clip_rect, &plane_state->clip_rect);
populate_splrect_from_rect(&spl_in->basic_out.src_rect, &stream->src);
populate_splrect_from_rect(&spl_in->basic_out.dst_rect, &stream->dst);
spl_in->basic_in.rotation = (enum spl_rotation_angle)plane_state->rotation;
populate_splrect_from_rect(&spl_in->basic_in.src_rect, &plane_state->src_rect);
populate_splrect_from_rect(&spl_in->basic_in.dst_rect, &plane_state->dst_rect);
spl_in->basic_in.horizontal_mirror = plane_state->horizontal_mirror;
spl_in->basic_in.num_h_slices_recout_width_align.use_recout_width_aligned = false;
spl_in->basic_in.num_h_slices_recout_width_align.num_slices_recout_width.mpc_num_h_slices =
spl_in->basic_in.mpc_h_slice_index = 0;
spl_in->basic_in.mpc_h_slice_index = resource_get_mpc_slice_index(pipe_ctx);
populate_splrect_from_rect(&spl_in->basic_out.odm_slice_rect, &odm_slice_src);
spl_in->basic_out.odm_combine_factor = 0;
spl_in->odm_slice_index = resource_get_odm_slice_index(pipe_ctx);
spl_in->basic_out.output_size.width =
spl_in->basic_out.output_size.height =
spl_in->basic_out.max_downscale_src_width =
spl_in->basic_out.always_scale = pipe_ctx->stream->ctx->dc->debug.always_scale;
spl_in->basic_out.alpha_en = pipe_ctx->plane_res.scl_data.lb_params.alpha_en;
spl_in->basic_out.use_two_pixels_per_container = pipe_ctx->stream_res.tg->funcs->is_two_pixels_per_container(&stream->timing);
populate_spltaps_from_taps(&spl_in->scaling_quality, &plane_state->scaling_quality);
spl_in->prefer_easf = pipe_ctx->stream->ctx->dc->config.prefer_easf;
spl_in->disable_easf = false;
spl_in->prefer_easf = false;
spl_in->disable_easf = true;
spl_in->override_easf = true;
spl_in->adaptive_sharpness.enable = false;
spl_in->adaptive_sharpness.enable = true;
spl_in->adaptive_sharpness.sharpness_level = 0;
spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_min = plane_state->sharpness_range.sdr_rgb_min;
spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_max = plane_state->sharpness_range.sdr_rgb_max;
spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_mid = plane_state->sharpness_range.sdr_rgb_mid;
spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_min = plane_state->sharpness_range.sdr_yuv_min;
spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_max = plane_state->sharpness_range.sdr_yuv_max;
spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_mid = plane_state->sharpness_range.sdr_yuv_mid;
spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_min = plane_state->sharpness_range.hdr_rgb_min;
spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_max = plane_state->sharpness_range.hdr_rgb_max;
spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_mid = plane_state->sharpness_range.hdr_rgb_mid;
spl_in->adaptive_sharpness.enable = true;
spl_in->adaptive_sharpness.sharpness_level = force_sharpness_level;
spl_in->adaptive_sharpness.enable = false;
spl_in->adaptive_sharpness.sharpness_level = 0;
spl_in->adaptive_sharpness.enable = true;
spl_in->adaptive_sharpness.sharpness_level = plane_state->sharpness_level;
spl_in->lls_pref = pipe_ctx->stream->ctx->dc->debug.force_lls;
spl_in->lls_pref = plane_state->linear_light_scaling;
spl_in->basic_in.cositing = pipe_ctx->stream->ctx->dc->debug.force_cositing - 1;
spl_in->basic_in.cositing = plane_state->cositing;
spl_in->basic_in.tf_type = (enum spl_transfer_func_type) plane_state->in_transfer_func.type;
spl_in->basic_in.tf_predefined_type = (enum spl_transfer_func_predefined) plane_state->in_transfer_func.tf;
spl_in->h_active = pipe_ctx->plane_res.scl_data.h_active;
spl_in->v_active = pipe_ctx->plane_res.scl_data.v_active;
spl_in->sharpen_policy = (enum sharpen_policy)plane_state->adaptive_sharpness_policy;
spl_in->debug.scale_to_sharpness_policy =
spl_in->is_fullscreen = pipe_ctx->stream->sharpening_required;
spl_in->is_hdr_on = dm_helpers_is_hdr_on(pipe_ctx->stream->ctx, pipe_ctx->stream);
spl_in->sdr_white_level_nits = plane_state->sdr_white_level_nits;
void translate_SPL_in_params_from_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl_in *spl_in)
spl_in->callbacks = dcn2_spl_callbacks;
spl_in->callbacks = dcn32_spl_callbacks;
spl_in->callbacks = dcn401_spl_callbacks;
spl_in->callbacks = dcn2_spl_callbacks;
populate_splformat_from_format(&spl_in->basic_in.format, pipe_ctx->plane_res.scl_data.format);
void translate_SPL_in_params_from_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl_in *spl_in);
struct spl_in spl_in;
skip_easf = enable_easf(spl_in, spl_scratch);
if (spl_is_video_format(spl_in->basic_in.format)) {
if (spl_in->override_easf) {
if (spl_is_yuv420(spl_in->basic_in.format))
spl_in->callbacks.spl_calc_lb_num_partitions(spl_in->basic_out.alpha_en, &spl_scratch->scl_data,
if (spl_is_video_format(spl_in->basic_in.format)) {
*enable_isharp = spl_get_isharp_en(spl_in, spl_scratch);
if (!*enable_isharp && !spl_in->basic_out.always_scale) {
static void spl_set_dscl_prog_data(struct spl_in *spl_in, struct spl_scratch *spl_scratch,
dscl_prog_data->dscl_mode = spl_get_dscl_mode(spl_in, data, enable_isharp,
spl_set_black_color_data(spl_in->basic_in.format, scl_black_color);
const struct spl_rect *stream_src = &spl_in->basic_out.src_rect;
const struct spl_rect *stream_dst = &spl_in->basic_out.dst_rect;
static bool spl_calculate_number_of_taps(struct spl_in *spl_in, struct spl_scratch *spl_scratch, struct spl_out *spl_out,
spl_scratch->scl_data.h_active = spl_in->h_active;
spl_scratch->scl_data.v_active = spl_in->v_active;
spl_calculate_recout(spl_in, spl_scratch, spl_out);
spl_calculate_scaling_ratios(spl_in, spl_scratch, spl_out);
spl_opp_adjust_rect(&spl_scratch->scl_data.recout, &spl_in->basic_in.opp_recout_adjust);
spl_calculate_viewport_size(spl_in, spl_scratch);
spl_in->basic_out.max_downscale_src_width, spl_in,
spl_scratch, &spl_in->scaling_quality, enable_easf_v,
bool SPL_NAMESPACE(spl_calculate_scaler_params(struct spl_in *spl_in, struct spl_out *spl_out))
res = spl_calculate_number_of_taps(spl_in, &spl_scratch, spl_out,
spl_calculate_inits_and_viewports(spl_in, &spl_scratch);
spl_handle_3d_recout(spl_in, &spl_scratch.scl_data.recout);
struct spl_in *spl_in,
spl_clamp_viewport(&spl_scratch.scl_data.viewport, spl_in->min_viewport_size);
spl_set_dscl_prog_data(spl_in, &spl_scratch, spl_out, enable_easf_v, enable_easf_h, enable_isharp);
if (spl_in->lls_pref == LLS_PREF_YES) {
if (spl_in->is_hdr_on)
if (spl_in->is_hdr_on)
spl_set_easf_data(&spl_scratch, spl_out, enable_easf_v, enable_easf_h, spl_in->lls_pref,
spl_in->basic_in.format, setup, spl_in->sdr_white_level_nits);
spl_set_isharp_data(spl_out->dscl_prog_data, spl_in->adaptive_sharpness, enable_isharp,
spl_in->lls_pref, spl_in->basic_in.format, data, isharp_scale_ratio, setup,
spl_in->debug.scale_to_sharpness_policy);
spl_in->basic_in.num_h_slices_recout_width_align.use_recout_width_aligned;
bool SPL_NAMESPACE(spl_get_number_of_taps(struct spl_in *spl_in, struct spl_out *spl_out))
res = spl_calculate_number_of_taps(spl_in, &spl_scratch, spl_out,
spl_in->basic_in.num_h_slices_recout_width_align.num_slices_recout_width.mpc_num_h_slices;
spl_in->basic_in.num_h_slices_recout_width_align.num_slices_recout_width.mpc_recout_width_align;
int mpc_slice_idx = spl_in->basic_in.mpc_h_slice_index;
if (spl_in->basic_in.custom_width != 0) {
mpc_rec.width = spl_in->basic_in.custom_width;
mpc_rec.x = spl_in->basic_in.custom_x;
spl_in->basic_out.view_format != SPL_VIEW_3D_SIDE_BY_SIDE ||
mpc_slice_idx > epimo && spl_in->basic_in.custom_width == 0) {
if (spl_in->basic_out.view_format == SPL_VIEW_3D_TOP_AND_BOTTOM) {
static struct spl_rect calculate_odm_slice_in_timing_active(struct spl_in *spl_in)
int odm_slice_count = spl_in->basic_out.odm_combine_factor;
int odm_slice_idx = spl_in->odm_slice_index;
int h_active = spl_in->basic_out.output_size.width;
int v_active = spl_in->basic_out.output_size.height;
if (spl_in->basic_out.odm_combine_factor > 0) {
if (spl_in->basic_out.use_two_pixels_per_container && (odm_slice_width % 2))
return spl_in->basic_out.odm_slice_rect;
static void spl_calculate_recout(struct spl_in *spl_in, struct spl_scratch *spl_scratch, struct spl_out *spl_out)
plane_clip = calculate_plane_rec_in_timing_active(spl_in,
&spl_in->basic_in.clip_rect);
&spl_in->basic_out.dst_rect);
spl_in, &plane_clip);
odm_slice = calculate_odm_slice_in_timing_active(spl_in);
spl_in->debug.visual_confirm_base_offset;
spl_in->debug.visual_confirm_dpp_offset;
static void spl_calculate_scaling_ratios(struct spl_in *spl_in,
const int in_w = spl_in->basic_out.src_rect.width;
const int in_h = spl_in->basic_out.src_rect.height;
const int out_w = spl_in->basic_out.dst_rect.width;
const int out_h = spl_in->basic_out.dst_rect.height;
struct spl_rect surf_src = spl_in->basic_in.src_rect;
if (spl_in->basic_in.rotation == SPL_ROTATION_ANGLE_90 ||
spl_in->basic_in.rotation == SPL_ROTATION_ANGLE_270)
spl_in->basic_in.dst_rect.width));
spl_in->basic_in.dst_rect.height));
if (spl_in->basic_out.view_format == SPL_VIEW_3D_SIDE_BY_SIDE)
else if (spl_in->basic_out.view_format == SPL_VIEW_3D_TOP_AND_BOTTOM)
if (spl_is_yuv420(spl_in->basic_in.format)) {
static void spl_calculate_viewport_size(struct spl_in *spl_in, struct spl_scratch *spl_scratch)
if (spl_in->basic_in.rotation == SPL_ROTATION_ANGLE_90 ||
spl_in->basic_in.rotation == SPL_ROTATION_ANGLE_270) {
static void spl_calculate_inits_and_viewports(struct spl_in *spl_in,
struct spl_rect src = spl_in->basic_in.src_rect;
struct spl_rect odm_slice = calculate_odm_slice_in_timing_active(spl_in);
int vpc_div = spl_is_subsampled_format(spl_in->basic_in.format) ? 2 : 1;
spl_in, &spl_in->basic_in.dst_rect);
spl_in->basic_in.rotation,
spl_in->basic_in.horizontal_mirror,
if (spl_is_subsampled_format(spl_in->basic_in.format)) {
switch (spl_in->basic_in.cositing) {
static void spl_handle_3d_recout(struct spl_in *spl_in, struct spl_rect *recout)
if (spl_in->basic_in.mpc_h_slice_index) {
SPL_ASSERT(spl_in->basic_in.rotation == SPL_ROTATION_ANGLE_0 ||
(spl_in->basic_out.view_format != SPL_VIEW_3D_TOP_AND_BOTTOM &&
spl_in->basic_out.view_format != SPL_VIEW_3D_SIDE_BY_SIDE));
if (spl_in->basic_out.view_format == SPL_VIEW_3D_TOP_AND_BOTTOM)
else if (spl_in->basic_out.view_format == SPL_VIEW_3D_SIDE_BY_SIDE)
static enum scl_mode spl_get_dscl_mode(const struct spl_in *spl_in,
enum spl_pixel_format pixel_format = spl_in->basic_in.format;
&& !spl_in->basic_out.always_scale
if (data->ratios.horz.value == one && data->ratios.vert.value == one && !spl_in->basic_out.always_scale)
static bool enable_easf(struct spl_in *spl_in, struct spl_scratch *spl_scratch)
if (spl_in->disable_easf)
if (spl_in->lls_pref == LLS_PREF_DONT_CARE)
spl_choose_lls_policy(spl_in->basic_in.format,
&spl_in->lls_pref);
if (spl_in->lls_pref != LLS_PREF_YES && !spl_in->prefer_easf)
static bool spl_is_video_fullscreen(struct spl_in *spl_in)
if (spl_is_video_format(spl_in->basic_in.format) && spl_in->is_fullscreen)
static bool spl_get_isharp_en(struct spl_in *spl_in,
bool fullscreen = spl_is_video_fullscreen(spl_in);
if (spl_in->adaptive_sharpness.enable == false)
if (!spl_is_video_format(spl_in->basic_in.format) &&
(spl_in->sharpen_policy == SHARPEN_YUV))
else if ((spl_is_video_format(spl_in->basic_in.format) && !fullscreen) &&
(spl_in->sharpen_policy == SHARPEN_RGB_FULLSCREEN_YUV))
else if (!spl_in->is_fullscreen &&
spl_in->sharpen_policy == SHARPEN_FULLSCREEN_ALL)
struct spl_in *spl_in,
int max_downscale_src_width, struct spl_in *spl_in, struct spl_scratch *spl_scratch,
bool is_subsampled = spl_is_subsampled_format(spl_in->basic_in.format);
if (spl_in->scaling_quality.integer_scaling) {
bool SPL_NAMESPACE(spl_calculate_scaler_params(struct spl_in *spl_in, struct spl_out *spl_out));
bool SPL_NAMESPACE(spl_get_number_of_taps(struct spl_in *spl_in, struct spl_out *spl_out));