diff mbox

[05/10] drm/imx: ipuv3-plane: let drm_plane_state_to_ubo/vbo handle chroma subsampling other than 4:2:0

Message ID 1476872477-29493-5-git-send-email-p.zabel@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Philipp Zabel Oct. 19, 2016, 10:21 a.m. UTC
To support 4:2:2 or 4:4:4 chroma subsampling, divide the x/y offsets in
drm_plane_state_to_ubo/vbo only if necessary for the given pixel format.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
 drivers/gpu/drm/imx/ipuv3-plane.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

Comments

Ying Liu Oct. 20, 2016, 6:19 a.m. UTC | #1
On Wed, Oct 19, 2016 at 6:21 PM, Philipp Zabel <p.zabel@pengutronix.de> wrote:
> To support 4:2:2 or 4:4:4 chroma subsampling, divide the x/y offsets in
> drm_plane_state_to_ubo/vbo only if necessary for the given pixel format.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

Acked-by: Liu Ying <gnuiyl@gmail.com>

> ---
>  drivers/gpu/drm/imx/ipuv3-plane.c | 27 ++++++++++++++++++---------
>  1 file changed, 18 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
> index 32871be..52784cb 100644
> --- a/drivers/gpu/drm/imx/ipuv3-plane.c
> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c
> @@ -64,13 +64,14 @@ drm_plane_state_to_eba(struct drm_plane_state *state)
>  {
>         struct drm_framebuffer *fb = state->fb;
>         struct drm_gem_cma_object *cma_obj;
> +       int x = state->src_x >> 16;
> +       int y = state->src_y >> 16;
>
>         cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
>         BUG_ON(!cma_obj);
>
> -       return cma_obj->paddr + fb->offsets[0] +
> -              fb->pitches[0] * (state->src_y >> 16) +
> -              (fb->bits_per_pixel >> 3) * (state->src_x >> 16);
> +       return cma_obj->paddr + fb->offsets[0] + fb->pitches[0] * y +
> +              drm_format_plane_cpp(fb->pixel_format, 0) * x;
>  }
>
>  static inline unsigned long
> @@ -79,13 +80,17 @@ drm_plane_state_to_ubo(struct drm_plane_state *state)
>         struct drm_framebuffer *fb = state->fb;
>         struct drm_gem_cma_object *cma_obj;
>         unsigned long eba = drm_plane_state_to_eba(state);
> +       int x = state->src_x >> 16;
> +       int y = state->src_y >> 16;
>
>         cma_obj = drm_fb_cma_get_gem_obj(fb, 1);
>         BUG_ON(!cma_obj);
>
> -       return cma_obj->paddr + fb->offsets[1] +
> -              fb->pitches[1] * (state->src_y >> 16) / 2 +
> -              (state->src_x >> 16) / 2 - eba;
> +       x /= drm_format_horz_chroma_subsampling(fb->pixel_format);
> +       y /= drm_format_vert_chroma_subsampling(fb->pixel_format);
> +
> +       return cma_obj->paddr + fb->offsets[1] + fb->pitches[1] * y +
> +              drm_format_plane_cpp(fb->pixel_format, 1) * x - eba;
>  }
>
>  static inline unsigned long
> @@ -94,13 +99,17 @@ drm_plane_state_to_vbo(struct drm_plane_state *state)
>         struct drm_framebuffer *fb = state->fb;
>         struct drm_gem_cma_object *cma_obj;
>         unsigned long eba = drm_plane_state_to_eba(state);
> +       int x = state->src_x >> 16;
> +       int y = state->src_y >> 16;
>
>         cma_obj = drm_fb_cma_get_gem_obj(fb, 2);
>         BUG_ON(!cma_obj);
>
> -       return cma_obj->paddr + fb->offsets[2] +
> -              fb->pitches[2] * (state->src_y >> 16) / 2 +
> -              (state->src_x >> 16) / 2 - eba;
> +       x /= drm_format_horz_chroma_subsampling(fb->pixel_format);
> +       y /= drm_format_vert_chroma_subsampling(fb->pixel_format);
> +
> +       return cma_obj->paddr + fb->offsets[2] + fb->pitches[2] * y +
> +              drm_format_plane_cpp(fb->pixel_format, 2) * x - eba;
>  }
>
>  void ipu_plane_put_resources(struct ipu_plane *ipu_plane)
> --
> 2.9.3
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c
index 32871be..52784cb 100644
--- a/drivers/gpu/drm/imx/ipuv3-plane.c
+++ b/drivers/gpu/drm/imx/ipuv3-plane.c
@@ -64,13 +64,14 @@  drm_plane_state_to_eba(struct drm_plane_state *state)
 {
 	struct drm_framebuffer *fb = state->fb;
 	struct drm_gem_cma_object *cma_obj;
+	int x = state->src_x >> 16;
+	int y = state->src_y >> 16;
 
 	cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
 	BUG_ON(!cma_obj);
 
-	return cma_obj->paddr + fb->offsets[0] +
-	       fb->pitches[0] * (state->src_y >> 16) +
-	       (fb->bits_per_pixel >> 3) * (state->src_x >> 16);
+	return cma_obj->paddr + fb->offsets[0] + fb->pitches[0] * y +
+	       drm_format_plane_cpp(fb->pixel_format, 0) * x;
 }
 
 static inline unsigned long
@@ -79,13 +80,17 @@  drm_plane_state_to_ubo(struct drm_plane_state *state)
 	struct drm_framebuffer *fb = state->fb;
 	struct drm_gem_cma_object *cma_obj;
 	unsigned long eba = drm_plane_state_to_eba(state);
+	int x = state->src_x >> 16;
+	int y = state->src_y >> 16;
 
 	cma_obj = drm_fb_cma_get_gem_obj(fb, 1);
 	BUG_ON(!cma_obj);
 
-	return cma_obj->paddr + fb->offsets[1] +
-	       fb->pitches[1] * (state->src_y >> 16) / 2 +
-	       (state->src_x >> 16) / 2 - eba;
+	x /= drm_format_horz_chroma_subsampling(fb->pixel_format);
+	y /= drm_format_vert_chroma_subsampling(fb->pixel_format);
+
+	return cma_obj->paddr + fb->offsets[1] + fb->pitches[1] * y +
+	       drm_format_plane_cpp(fb->pixel_format, 1) * x - eba;
 }
 
 static inline unsigned long
@@ -94,13 +99,17 @@  drm_plane_state_to_vbo(struct drm_plane_state *state)
 	struct drm_framebuffer *fb = state->fb;
 	struct drm_gem_cma_object *cma_obj;
 	unsigned long eba = drm_plane_state_to_eba(state);
+	int x = state->src_x >> 16;
+	int y = state->src_y >> 16;
 
 	cma_obj = drm_fb_cma_get_gem_obj(fb, 2);
 	BUG_ON(!cma_obj);
 
-	return cma_obj->paddr + fb->offsets[2] +
-	       fb->pitches[2] * (state->src_y >> 16) / 2 +
-	       (state->src_x >> 16) / 2 - eba;
+	x /= drm_format_horz_chroma_subsampling(fb->pixel_format);
+	y /= drm_format_vert_chroma_subsampling(fb->pixel_format);
+
+	return cma_obj->paddr + fb->offsets[2] + fb->pitches[2] * y +
+	       drm_format_plane_cpp(fb->pixel_format, 2) * x - eba;
 }
 
 void ipu_plane_put_resources(struct ipu_plane *ipu_plane)