brintos

brintos / linux-shallow public Read only

0
0
Text · 10.7 KiB · 603552d Raw
220 lines · c
1// SPDX-License-Identifier: MIT2//3// Copyright 2024 Advanced Micro Devices, Inc.4 5#include "dc_spl_translate.h"6#include "spl/dc_spl_types.h"7#include "dcn20/dcn20_dpp.h"8#include "dcn32/dcn32_dpp.h"9#include "dcn401/dcn401_dpp.h"10 11static struct spl_funcs dcn2_spl_funcs = {12	.spl_calc_lb_num_partitions = dscl2_spl_calc_lb_num_partitions,13};14static struct spl_funcs dcn32_spl_funcs = {15	.spl_calc_lb_num_partitions = dscl32_spl_calc_lb_num_partitions,16};17static struct spl_funcs dcn401_spl_funcs = {18	.spl_calc_lb_num_partitions = dscl401_spl_calc_lb_num_partitions,19};20static void populate_splrect_from_rect(struct spl_rect *spl_rect, const struct rect *rect)21{22	spl_rect->x = rect->x;23	spl_rect->y = rect->y;24	spl_rect->width = rect->width;25	spl_rect->height = rect->height;26}27static void populate_rect_from_splrect(struct rect *rect, const struct spl_rect *spl_rect)28{29	rect->x = spl_rect->x;30	rect->y = spl_rect->y;31	rect->width = spl_rect->width;32	rect->height = spl_rect->height;33}34static void populate_spltaps_from_taps(struct spl_taps *spl_scaling_quality,35		const struct scaling_taps *scaling_quality)36{37	spl_scaling_quality->h_taps_c = scaling_quality->h_taps_c;38	spl_scaling_quality->h_taps = scaling_quality->h_taps;39	spl_scaling_quality->v_taps_c = scaling_quality->v_taps_c;40	spl_scaling_quality->v_taps = scaling_quality->v_taps;41}42static void populate_taps_from_spltaps(struct scaling_taps *scaling_quality,43		const struct spl_taps *spl_scaling_quality)44{45	scaling_quality->h_taps_c = spl_scaling_quality->h_taps_c + 1;46	scaling_quality->h_taps = spl_scaling_quality->h_taps + 1;47	scaling_quality->v_taps_c = spl_scaling_quality->v_taps_c + 1;48	scaling_quality->v_taps = spl_scaling_quality->v_taps + 1;49}50static void populate_ratios_from_splratios(struct scaling_ratios *ratios,51		const struct ratio *spl_ratios)52{53	ratios->horz = dc_fixpt_from_ux_dy(spl_ratios->h_scale_ratio >> 5, 3, 19);54	ratios->vert = dc_fixpt_from_ux_dy(spl_ratios->v_scale_ratio >> 5, 3, 19);55	ratios->horz_c = dc_fixpt_from_ux_dy(spl_ratios->h_scale_ratio_c >> 5, 3, 19);56	ratios->vert_c = dc_fixpt_from_ux_dy(spl_ratios->v_scale_ratio_c >> 5, 3, 19);57}58static void populate_inits_from_splinits(struct scl_inits *inits,59		const struct init *spl_inits)60{61	inits->h = dc_fixpt_from_int_dy(spl_inits->h_filter_init_int, spl_inits->h_filter_init_frac >> 5, 0, 19);62	inits->v = dc_fixpt_from_int_dy(spl_inits->v_filter_init_int, spl_inits->v_filter_init_frac >> 5, 0, 19);63	inits->h_c = dc_fixpt_from_int_dy(spl_inits->h_filter_init_int_c, spl_inits->h_filter_init_frac_c >> 5, 0, 19);64	inits->v_c = dc_fixpt_from_int_dy(spl_inits->v_filter_init_int_c, spl_inits->v_filter_init_frac_c >> 5, 0, 19);65}66/// @brief Translate SPL input parameters from pipe context67/// @param pipe_ctx68/// @param spl_in69void translate_SPL_in_params_from_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl_in *spl_in)70{71	const struct dc_plane_state *plane_state = pipe_ctx->plane_state;72	const struct dc_stream_state *stream = pipe_ctx->stream;73	struct rect odm_slice_src = resource_get_odm_slice_src_rect(pipe_ctx);74 75	// Assign the function to calculate the number of partitions in the line buffer76	// This is used to determine the vtap support77	switch (plane_state->ctx->dce_version)	{78	case DCN_VERSION_2_0:79		spl_in->funcs = &dcn2_spl_funcs;80		break;81	case DCN_VERSION_3_2:82		spl_in->funcs = &dcn32_spl_funcs;83		break;84	case DCN_VERSION_4_01:85		spl_in->funcs = &dcn401_spl_funcs;86		break;87	default:88		spl_in->funcs = &dcn2_spl_funcs;89	}90	// Make format field from spl_in point to plane_res scl_data format91	spl_in->basic_in.format = (enum spl_pixel_format)pipe_ctx->plane_res.scl_data.format;92	// Make view_format from basic_out point to view_format from stream93	spl_in->basic_out.view_format = (enum spl_view_3d)stream->view_format;94	// Populate spl input basic input clip rect from plane state clip rect95	populate_splrect_from_rect(&spl_in->basic_in.clip_rect, &plane_state->clip_rect);96	// Populate spl input basic out src rect from stream src rect97	populate_splrect_from_rect(&spl_in->basic_out.src_rect, &stream->src);98	// Populate spl input basic out dst rect from stream dst rect99	populate_splrect_from_rect(&spl_in->basic_out.dst_rect, &stream->dst);100	// Make spl input basic input info rotation field point to plane state rotation101	spl_in->basic_in.rotation = (enum spl_rotation_angle)plane_state->rotation;102	// Populate spl input basic input src rect from plane state src rect103	populate_splrect_from_rect(&spl_in->basic_in.src_rect, &plane_state->src_rect);104	// Populate spl input basic input dst rect from plane state dst rect105	populate_splrect_from_rect(&spl_in->basic_in.dst_rect, &plane_state->dst_rect);106	// Make spl input basic input info horiz mirror field point to plane state horz mirror107	spl_in->basic_in.horizontal_mirror = plane_state->horizontal_mirror;108 109	// Calculate horizontal splits and split index110	spl_in->basic_in.mpc_combine_h = resource_get_mpc_slice_count(pipe_ctx);111 112	if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE)113		spl_in->basic_in.mpc_combine_v = 0;114	else115		spl_in->basic_in.mpc_combine_v = resource_get_mpc_slice_index(pipe_ctx);116 117	populate_splrect_from_rect(&spl_in->basic_out.odm_slice_rect, &odm_slice_src);118	spl_in->basic_out.odm_combine_factor = 0;119	spl_in->odm_slice_index = resource_get_odm_slice_index(pipe_ctx);120	// Make spl input basic out info output_size width point to stream h active121	spl_in->basic_out.output_size.width =122		stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right;123	// Make spl input basic out info output_size height point to v active124	spl_in->basic_out.output_size.height =125		stream->timing.v_addressable + stream->timing.v_border_bottom + stream->timing.v_border_top;126	spl_in->basic_out.max_downscale_src_width =127			pipe_ctx->stream->ctx->dc->debug.max_downscale_src_width;128	spl_in->basic_out.always_scale = pipe_ctx->stream->ctx->dc->debug.always_scale;129	// Make spl input basic output info alpha_en field point to plane res scl_data lb_params alpha_en130	spl_in->basic_out.alpha_en = pipe_ctx->plane_res.scl_data.lb_params.alpha_en;131	spl_in->basic_out.use_two_pixels_per_container = pipe_ctx->stream_res.tg->funcs->is_two_pixels_per_container(&stream->timing);132	// Make spl input basic input info scaling quality field point to plane state scaling_quality133	populate_spltaps_from_taps(&spl_in->scaling_quality, &plane_state->scaling_quality);134	// Translate edge adaptive scaler preference135	spl_in->prefer_easf = pipe_ctx->stream->ctx->dc->config.prefer_easf;136	spl_in->disable_easf = false;137	if (pipe_ctx->stream->ctx->dc->debug.force_easf == 1)138		spl_in->prefer_easf = false;139	else if (pipe_ctx->stream->ctx->dc->debug.force_easf == 2)140		spl_in->disable_easf = true;141	/* Translate adaptive sharpening preference */142	unsigned int sharpness_setting = pipe_ctx->stream->ctx->dc->debug.force_sharpness;143	unsigned int force_sharpness_level = pipe_ctx->stream->ctx->dc->debug.force_sharpness_level;144	if (sharpness_setting == SHARPNESS_HW_OFF)145		spl_in->adaptive_sharpness.enable = false;146	else if (sharpness_setting == SHARPNESS_ZERO) {147		spl_in->adaptive_sharpness.enable = true;148		spl_in->adaptive_sharpness.sharpness_level = 0;149	} else if (sharpness_setting == SHARPNESS_CUSTOM) {150		spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_min = 0;151		spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_max = 1750;152		spl_in->adaptive_sharpness.sharpness_range.sdr_rgb_mid = 750;153		spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_min = 0;154		spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_max = 3500;155		spl_in->adaptive_sharpness.sharpness_range.sdr_yuv_mid = 1500;156		spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_min = 0;157		spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_max = 2750;158		spl_in->adaptive_sharpness.sharpness_range.hdr_rgb_mid = 1500;159 160		if (force_sharpness_level > 0) {161			if (force_sharpness_level > 10)162				force_sharpness_level = 10;163			spl_in->adaptive_sharpness.enable = true;164			spl_in->adaptive_sharpness.sharpness_level = force_sharpness_level;165		} else if (!plane_state->adaptive_sharpness_en) {166			spl_in->adaptive_sharpness.enable = false;167			spl_in->adaptive_sharpness.sharpness_level = 0;168		} else {169			spl_in->adaptive_sharpness.enable = true;170			spl_in->adaptive_sharpness.sharpness_level = plane_state->sharpness_level;171		}172	}173	// Translate linear light scaling preference174	if (pipe_ctx->stream->ctx->dc->debug.force_lls > 0)175		spl_in->lls_pref = pipe_ctx->stream->ctx->dc->debug.force_lls;176	else177		spl_in->lls_pref = plane_state->linear_light_scaling;178	/* Translate chroma subsampling offset ( cositing ) */179	if (pipe_ctx->stream->ctx->dc->debug.force_cositing)180		spl_in->basic_in.cositing = pipe_ctx->stream->ctx->dc->debug.force_cositing - 1;181	else182		spl_in->basic_in.cositing = plane_state->cositing;183	/* Translate transfer function */184	spl_in->basic_in.tf_type = (enum spl_transfer_func_type) plane_state->in_transfer_func.type;185	spl_in->basic_in.tf_predefined_type = (enum spl_transfer_func_predefined) plane_state->in_transfer_func.tf;186 187	spl_in->h_active = pipe_ctx->plane_res.scl_data.h_active;188	spl_in->v_active = pipe_ctx->plane_res.scl_data.v_active;189 190	spl_in->debug.sharpen_policy = (enum sharpen_policy)pipe_ctx->stream->ctx->dc->debug.sharpen_policy;191	spl_in->debug.scale_to_sharpness_policy =192		(enum scale_to_sharpness_policy)pipe_ctx->stream->ctx->dc->debug.scale_to_sharpness_policy;193 194	/* Check if it is stream is in fullscreen and if its HDR.195	 * Use this to determine sharpness levels196	 */197	spl_in->is_fullscreen = dm_helpers_is_fullscreen(pipe_ctx->stream->ctx, pipe_ctx->stream);198	spl_in->is_hdr_on = dm_helpers_is_hdr_on(pipe_ctx->stream->ctx, pipe_ctx->stream);199	spl_in->sdr_white_level_nits = plane_state->sdr_white_level_nits;200}201 202/// @brief Translate SPL output parameters to pipe context203/// @param pipe_ctx204/// @param spl_out205void translate_SPL_out_params_to_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl_out *spl_out)206{207	// Make scaler data recout point to spl output field recout208	populate_rect_from_splrect(&pipe_ctx->plane_res.scl_data.recout, &spl_out->dscl_prog_data->recout);209	// Make scaler data ratios point to spl output field ratios210	populate_ratios_from_splratios(&pipe_ctx->plane_res.scl_data.ratios, &spl_out->dscl_prog_data->ratios);211	// Make scaler data viewport point to spl output field viewport212	populate_rect_from_splrect(&pipe_ctx->plane_res.scl_data.viewport, &spl_out->dscl_prog_data->viewport);213	// Make scaler data viewport_c point to spl output field viewport_c214	populate_rect_from_splrect(&pipe_ctx->plane_res.scl_data.viewport_c, &spl_out->dscl_prog_data->viewport_c);215	// Make scaler data taps point to spl output field scaling taps216	populate_taps_from_spltaps(&pipe_ctx->plane_res.scl_data.taps, &spl_out->dscl_prog_data->taps);217	// Make scaler data init point to spl output field init218	populate_inits_from_splinits(&pipe_ctx->plane_res.scl_data.inits, &spl_out->dscl_prog_data->init);219}220