Commit ca84b1b8 authored by Philipp Zabel's avatar Philipp Zabel
Browse files

gpu: ipu-v3: image-convert: move output seam valid interval calculation into find_best_seam



This reduces code duplication and allows to apply the following
modifications in a single place.

Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent 9b75651f
Loading
Loading
Loading
Loading
+12 −22
Original line number Diff line number Diff line
@@ -448,12 +448,10 @@ static int calc_image_resize_coefficients(struct ipu_image_convert_ctx *ctx,
#define round_closest(x, y) round_down((x) + (y)/2, (y))

/*
 * Find the best aligned seam position in the inverval [out_start, out_end].
 * Find the best aligned seam position for the given column / row index.
 * Rotation and image offsets are out of scope.
 *
 * @out_start: start of inverval, must be within 1024 pixels / lines
 *             of out_end
 * @out_end: end of interval, smaller than or equal to out_edge
 * @index: column / row index, used to calculate valid interval
 * @in_edge: input right / bottom edge
 * @out_edge: output right / bottom edge
 * @in_align: input alignment, either horizontal 8-byte line start address
@@ -469,8 +467,7 @@ static int calc_image_resize_coefficients(struct ipu_image_convert_ctx *ctx,
 * @_out_seam: aligned output seam position return value
 */
static void find_best_seam(struct ipu_image_convert_ctx *ctx,
			   unsigned int out_start,
			   unsigned int out_end,
			   unsigned int index,
			   unsigned int in_edge,
			   unsigned int out_edge,
			   unsigned int in_align,
@@ -488,6 +485,13 @@ static void find_best_seam(struct ipu_image_convert_ctx *ctx,
	unsigned int out_seam = 0;
	unsigned int in_seam = 0;
	unsigned int min_diff = UINT_MAX;
	unsigned int out_start;
	unsigned int out_end;

	/* Start within 1024 pixels of the right / bottom edge */
	out_start = max_t(int, 0, out_edge - 1024);
	/* End before having to add more columns to the left / rows above */
	out_end = min_t(unsigned int, out_edge, index * 1024);

	/*
	 * Output tiles must start at a multiple of 8 bytes horizontally and
@@ -718,8 +722,6 @@ static void find_seams(struct ipu_image_convert_ctx *ctx,
					  !(ctx->rot_mode & IPU_ROT_BIT_HFLIP);
		bool allow_out_overshoot = (col < in->num_cols - 1) &&
					   !(ctx->rot_mode & IPU_ROT_BIT_HFLIP);
		unsigned int out_start;
		unsigned int out_end;
		unsigned int in_left;
		unsigned int out_left;

@@ -728,12 +730,7 @@ static void find_seams(struct ipu_image_convert_ctx *ctx,
		 * horizontally.
		 */

		/* Start within 1024 pixels of the right edge */
		out_start = max_t(int, 0, out_right - 1024);
		/* End before having to add more columns to the left */
		out_end = min_t(unsigned int, out_right, col * 1024);

		find_best_seam(ctx, out_start, out_end,
		find_best_seam(ctx, col,
			       in_right, out_right,
			       in_left_align, out_left_align,
			       allow_in_overshoot ? 1 : 8 /* burst length */,
@@ -768,17 +765,10 @@ static void find_seams(struct ipu_image_convert_ctx *ctx,

	for (row = in->num_rows - 1; row > 0; row--) {
		bool allow_overshoot = row < in->num_rows - 1;
		unsigned int out_start;
		unsigned int out_end;
		unsigned int in_top;
		unsigned int out_top;

		/* Start within 1024 lines of the bottom edge */
		out_start = max_t(int, 0, out_bottom - 1024);
		/* End before having to add more rows above */
		out_end = min_t(unsigned int, out_bottom, row * 1024);

		find_best_seam(ctx, out_start, out_end,
		find_best_seam(ctx, row,
			       in_bottom, out_bottom,
			       in_top_align, out_top_align,
			       1, allow_overshoot ? 1 : out_height_align,