Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03172d2c authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Remove mese bw vote for video encoder"

parents 653e7ca4 fcc05b6a
Loading
Loading
Loading
Loading
+47 −89
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d)

	lcu_size = d->lcu_size;

	dpb_bpp = d->num_formats >= 1 ? __bpp(d->color_formats[0]) : INT_MAX;
	dpb_bpp = __bpp(d->color_formats[0]);

	unified_dpb_opb = d->num_formats == 1;

@@ -81,25 +81,12 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d)
	opb_compression_enabled = d->num_formats >= 2 &&
		__ubwc(d->color_formats[1]);

	/*
	 * convert q16 number into integer and fractional part upto 2 places.
	 * ex : 105752 / 65536 = 1.61; 1.61 in q16 = 105752;
	 * integer part =  105752 / 65536 = 1;
	 * reminder = 105752 - 1 * 65536 = 40216;
	 * fractional part = 40216 * 100 / 65536 = 61;
	 * now converto to fp(1, 61, 100) for below code.
	 */

	integer_part = d->compression_ratio >> 16;
	frac_part =
		((d->compression_ratio - (integer_part << 16)) * 100) >> 16;

	integer_part = Q16_INT(d->compression_ratio);
	frac_part = Q16_FRAC(d->compression_ratio);
	dpb_read_compression_factor = FP(integer_part, frac_part, 100);

	integer_part = d->complexity_factor >> 16;
	frac_part =
		((d->complexity_factor - (integer_part << 16)) * 100) >> 16;

	integer_part = Q16_INT(d->complexity_factor);
	frac_part = Q16_FRAC(d->complexity_factor);
	motion_vector_complexity = FP(integer_part, frac_part, 100);

	dpb_write_compression_factor = dpb_read_compression_factor;
@@ -122,7 +109,7 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d)
	lcu_per_frame = DIV_ROUND_UP(width, lcu_size) *
		DIV_ROUND_UP(height, lcu_size);

	bitrate = (d->bitrate + 1000000 - 1) / 1000000;
	bitrate = DIV_ROUND_UP(d->bitrate, 1000000);

	bins_to_bit_factor = FP_INT(4);

@@ -148,12 +135,15 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d)
			collocated_bytes_per_lcu * fps), FP_INT(bps(1)));
	ddr.collocated_write = ddr.collocated_read;

	y_bw_no_ubwc_8bpp = fp_div(fp_mult(
		FP_INT((int)(width * height)), FP_INT((int)fps)),
	y_bw_no_ubwc_8bpp = fp_div(FP_INT(width * height * fps),
		FP_INT(1000 * 1000));
	y_bw_no_ubwc_10bpp = fp_div(fp_mult(y_bw_no_ubwc_8bpp, FP_INT(256)),

	if (dpb_bpp != 8) {
		y_bw_no_ubwc_10bpp =
			fp_div(fp_mult(y_bw_no_ubwc_8bpp, FP_INT(256)),
				FP_INT(192));
		y_bw_10bpp_p010 = y_bw_no_ubwc_8bpp * 2;
	}

	ddr.dpb_read = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp;
	ddr.dpb_read = fp_div(fp_mult(ddr.dpb_read,
@@ -182,8 +172,9 @@ static unsigned long __calculate_decoder(struct vidc_bus_vote_data *d)
	ddr.opb_write = fp_div(fp_mult(dpb_factor, ddr.opb_write),
		fp_mult(dpb_opb_scaling_ratio, opb_write_compression_factor));

	ddr.line_buffer_read = FP_INT(tnbr_per_lcu *
			lcu_per_frame * fps / bps(1));
	ddr.line_buffer_read =
		fp_div(FP_INT(tnbr_per_lcu * lcu_per_frame * fps),
			FP_INT(bps(1)));
	ddr.line_buffer_write = ddr.line_buffer_read;
	if (llc_top_line_buf_enabled) {
		llc.line_buffer_read = ddr.line_buffer_read;
@@ -288,14 +279,15 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
		llc_top_line_buf_enabled = false,
		llc_vpss_rot_line_buf_enabled = false;

	fp_t bins_to_bit_factor, dpb_compression_factor,
	unsigned int bins_to_bit_factor;
	fp_t dpb_compression_factor,
		original_compression_factor,
		original_compression_factor_y,
		y_bw_no_ubwc_8bpp, y_bw_no_ubwc_10bpp, y_bw_10bpp_p010,
		input_compression_factor,
		downscaling_ratio,
		ref_y_read_bw_factor, ref_cbcr_read_bw_factor,
		recon_write_bw_factor, mese_read_factor,
		recon_write_bw_factor,
		total_ref_read_crcb,
		qsmmu_bw_overhead_factor;
	fp_t integer_part, frac_part;
@@ -307,7 +299,6 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
			ref_read_y, ref_read_crcb, ref_write,
			ref_write_overlap, orig_read,
			line_buffer_read, line_buffer_write,
			mese_read, mese_write,
			total;
	} ddr = {0};

@@ -331,31 +322,33 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
	downscaling_ratio = fp_div(FP_INT(d->input_width * d->input_height),
		FP_INT(d->output_width * d->output_height));
	downscaling_ratio = max(downscaling_ratio, FP_ONE);
	bitrate = d->bitrate > 0 ? d->bitrate / 1000000 :
	bitrate = d->bitrate > 0 ? DIV_ROUND_UP(d->bitrate, 1000000) :
		__lut(width, height, fps)->bitrate;
	lcu_size = d->lcu_size;
	lcu_per_frame = DIV_ROUND_UP(width, lcu_size) *
		DIV_ROUND_UP(height, lcu_size);
	tnbr_per_lcu = 16;

	y_bw_no_ubwc_8bpp = fp_div(fp_mult(
		FP_INT((int)(width * height)), FP_INT(fps)),
	dpb_bpp = __bpp(d->color_formats[0]);

	y_bw_no_ubwc_8bpp = fp_div(FP_INT(width * height * fps),
		FP_INT(1000 * 1000));

	if (dpb_bpp != 8) {
		y_bw_no_ubwc_10bpp = fp_div(fp_mult(y_bw_no_ubwc_8bpp,
			FP_INT(256)), FP_INT(192));
		y_bw_10bpp_p010 = y_bw_no_ubwc_8bpp * 2;
	}

	b_frames_enabled = d->b_frames_enabled;
	original_color_format = d->num_formats >= 1 ?
		d->color_formats[0] : HAL_UNUSED_COLOR;

	dpb_bpp = d->num_formats >= 1 ? __bpp(d->color_formats[0]) : INT_MAX;

	original_compression_enabled = __ubwc(original_color_format);

	work_mode_1 = d->work_mode == HFI_WORKMODE_1;
	low_power = d->power_mode == VIDC_POWER_LOW;
	bins_to_bit_factor = FP_INT(4);
	bins_to_bit_factor = 4;

	if (d->use_sys_cache) {
		llc_ref_chroma_cache_enabled = true;
@@ -363,25 +356,12 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
		llc_vpss_rot_line_buf_enabled = true;
	}

	/*
	 * Convert Q16 number into Integer and Fractional part upto 2 places.
	 * Ex : 105752 / 65536 = 1.61; 1.61 in Q16 = 105752;
	 * Integer part =  105752 / 65536 = 1;
	 * Reminder = 105752 - 1 * 65536 = 40216;
	 * Fractional part = 40216 * 100 / 65536 = 61;
	 * Now converto to FP(1, 61, 100) for below code.
	 */

	integer_part = d->compression_ratio >> 16;
	frac_part =
		((d->compression_ratio - (integer_part * 65536)) * 100) >> 16;

	integer_part = Q16_INT(d->compression_ratio);
	frac_part = Q16_FRAC(d->compression_ratio);
	dpb_compression_factor = FP(integer_part, frac_part, 100);

	integer_part = d->input_cr >> 16;
	frac_part =
		((d->input_cr - (integer_part * 65536)) * 100) >> 16;

	integer_part = Q16_INT(d->input_cr);
	frac_part = Q16_FRAC(d->input_cr);
	input_compression_factor = FP(integer_part, frac_part, 100);

	original_compression_factor = original_compression_factor_y =
@@ -400,13 +380,7 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
			input_compression_factor;
	}

	mese_read_factor = fp_div(FP_INT((width * height * fps)/4),
		original_compression_factor_y);
	mese_read_factor = fp_div(fp_mult(mese_read_factor, FP(2, 53, 100)),
		 FP_INT(1000 * 1000));

	ddr.vsp_read = fp_div(fp_mult(FP_INT(bitrate), bins_to_bit_factor),
			FP_INT(8));
	ddr.vsp_read = fp_div(FP_INT(bitrate * bins_to_bit_factor), FP_INT(8));
	ddr.vsp_write = ddr.vsp_read + fp_div(FP_INT(bitrate), FP_INT(8));

	collocated_bytes_per_lcu = lcu_size == 16 ? 16 :
@@ -417,22 +391,21 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)

	ddr.collocated_write = ddr.collocated_read;

	ddr.ref_read_y = ddr.ref_read_crcb = dpb_bpp == 8 ?
	ddr.ref_read_y = dpb_bpp == 8 ?
		y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp;

	if (b_frames_enabled)
		ddr.ref_read_y = ddr.ref_read_y * 2;
	ddr.ref_read_y = fp_div(ddr.ref_read_y, dpb_compression_factor);

	ddr.ref_read_crcb = ddr.ref_read_y;

	if (width != vertical_tile_width) {
		ddr.ref_read_y = fp_mult(ddr.ref_read_y,
			ref_y_read_bw_factor);
	}

	ddr.ref_read_y = fp_div(ddr.ref_read_y, dpb_compression_factor);
	if (b_frames_enabled)
		ddr.ref_read_y = fp_mult(ddr.ref_read_y, FP_INT(2));

	ddr.ref_read_crcb = fp_mult(ddr.ref_read_crcb, FP(0, 50, 100));
	ddr.ref_read_crcb = fp_div(ddr.ref_read_crcb, dpb_compression_factor);
	if (b_frames_enabled)
		ddr.ref_read_crcb = fp_mult(ddr.ref_read_crcb, FP_INT(2));

	if (llc_ref_chroma_cache_enabled) {
		total_ref_read_crcb = ddr.ref_read_crcb;
@@ -457,8 +430,9 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
	if (rotation == 90 || rotation == 270)
		ddr.orig_read *= lcu_size == 32 ? (dpb_bpp == 8 ? 1 : 3) : 2;

	ddr.line_buffer_read = FP_INT(tnbr_per_lcu * lcu_per_frame *
		fps / bps(1));
	ddr.line_buffer_read =
		fp_div(FP_INT(tnbr_per_lcu * lcu_per_frame * fps),
			FP_INT(bps(1)));

	ddr.line_buffer_write = ddr.line_buffer_read;
	if (llc_top_line_buf_enabled) {
@@ -466,24 +440,12 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
		ddr.line_buffer_read = ddr.line_buffer_write = FP_ZERO;
	}

	ddr.mese_read = dpb_bpp == 8 ? y_bw_no_ubwc_8bpp : y_bw_no_ubwc_10bpp;
	ddr.mese_read = fp_div(fp_mult(ddr.mese_read, FP(1, 37, 100)),
		original_compression_factor_y) + mese_read_factor;

	ddr.mese_write = FP_INT((width * height)/512) +
		fp_div(FP_INT((width * height)/4),
		original_compression_factor_y) +
		FP_INT((width * height)/128);
	ddr.mese_write = fp_div(fp_mult(ddr.mese_write, FP_INT(fps)),
		FP_INT(1000 * 1000));

	ddr.total = ddr.vsp_read + ddr.vsp_write +
		ddr.collocated_read + ddr.collocated_write +
		ddr.ref_read_y + ddr.ref_read_crcb +
		ddr.ref_write + ddr.ref_write_overlap +
		ddr.orig_read +
		ddr.line_buffer_read + ddr.line_buffer_write +
		ddr.mese_read + ddr.mese_write;
		ddr.line_buffer_read + ddr.line_buffer_write;

	qsmmu_bw_overhead_factor = FP(1, 3, 100);
	ddr.total = fp_mult(ddr.total, qsmmu_bw_overhead_factor);
@@ -519,13 +481,11 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
		{"DERIVED PARAMETERS", "", DUMP_HEADER_MAGIC},
		{"lcu size", "%d", lcu_size},
		{"bitrate (Mbit/sec)", "%lu", bitrate},
		{"bins to bit factor", DUMP_FP_FMT, bins_to_bit_factor},
		{"bins to bit factor", "%u", bins_to_bit_factor},
		{"original compression factor", DUMP_FP_FMT,
			original_compression_factor},
		{"original compression factor y", DUMP_FP_FMT,
			original_compression_factor_y},
		{"mese read factor", DUMP_FP_FMT,
			mese_read_factor},
		{"qsmmu_bw_overhead_factor",
			 DUMP_FP_FMT, qsmmu_bw_overhead_factor},
		{"bw for NV12 8bpc)", DUMP_FP_FMT, y_bw_no_ubwc_8bpp},
@@ -543,8 +503,6 @@ static unsigned long __calculate_encoder(struct vidc_bus_vote_data *d)
		{"original read", DUMP_FP_FMT, ddr.orig_read},
		{"line buffer read", DUMP_FP_FMT, ddr.line_buffer_read},
		{"line buffer write", DUMP_FP_FMT, ddr.line_buffer_write},
		{"mese read", DUMP_FP_FMT, ddr.mese_read},
		{"mese write", DUMP_FP_FMT, ddr.mese_write},
		{"INTERMEDIATE LLC B/W", "", DUMP_HEADER_MAGIC},
		{"llc ref read crcb", DUMP_FP_FMT, llc.ref_read_crcb},
		{"llc line buffer", DUMP_FP_FMT, llc.line_buffer},
+11 −0
Original line number Diff line number Diff line
@@ -82,6 +82,17 @@
	(((c) && (c)->core_ops && (c)->core_ops->op) ? \
	((c)->core_ops->op(__VA_ARGS__)) : 0)

/*
 * Convert Q16 number into Integer and Fractional part upto 2 places.
 * Ex : 105752 / 65536 = 1.61; 1.61 in Q16 = 105752;
 * Integer part =  105752 / 65536 = 1;
 * Reminder = 105752 * 0xFFFF = 40216; Last 16 bits.
 * Fractional part = 40216 * 100 / 65536 = 61;
 * Now convert to FP(1, 61, 100).
 */
#define Q16_INT(q) ((q) >> 16)
#define Q16_FRAC(q) ((((q) & 0xFFFF) * 100) >> 16)

struct msm_vidc_inst;

enum vidc_ports {