For multi-planar formats, while calculating offsets in planes with index greater than 0 (ie second plane, third plane, etc), one needs to divide (src_x * cpp) with horizontal chroma subsampling factor and (src_y * pitch) with vertical chroma subsampling factor.
The reason being that the planes contain subsampled (ie reduced) data (by a factor of 2) and thus the while calculating the byte position coresponding to the x and y co-ordinates, one needs to be divide it with the sampling factor.
Signed-off-by: Ayan Kumar halder ayan.halder@arm.com --- drivers/gpu/drm/drm_fb_cma_helper.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c index b127061..47e0e2f 100644 --- a/drivers/gpu/drm/drm_fb_cma_helper.c +++ b/drivers/gpu/drm/drm_fb_cma_helper.c @@ -86,14 +86,21 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb, { struct drm_gem_cma_object *obj; dma_addr_t paddr; + u8 h_div = 1, v_div = 1;
obj = drm_fb_cma_get_gem_obj(fb, plane); if (!obj) return 0;
paddr = obj->paddr + fb->offsets[plane]; - paddr += fb->format->cpp[plane] * (state->src_x >> 16); - paddr += fb->pitches[plane] * (state->src_y >> 16); + + if (plane > 0) { + h_div = fb->format->hsub; + v_div = fb->format->vsub; + } + + paddr += (fb->format->cpp[plane] * (state->src_x >> 16)) / h_div; + paddr += (fb->pitches[plane] * (state->src_y >> 16)) / v_div;
return paddr; }
On Fri, Aug 17, 2018 at 06:33:04PM +0100, Ayan Kumar Halder wrote:
For multi-planar formats, while calculating offsets in planes with index greater than 0 (ie second plane, third plane, etc), one needs to divide (src_x * cpp) with horizontal chroma subsampling factor and (src_y * pitch) with vertical chroma subsampling factor.
The reason being that the planes contain subsampled (ie reduced) data (by a factor of 2) and thus the
drop the extraneous "the" at the end of the line.
while calculating the byte position coresponding to the x and y co-ordinates, one needs to be
and drop the extraneous "be" at the end of this line.
divide it with the sampling factor.
Signed-off-by: Ayan Kumar halder ayan.halder@arm.com
Otherwise, it looks good to me!
Reviewed-by: Liviu Dudau liviu.dudau@arm.com
Best regards, Liviu
drivers/gpu/drm/drm_fb_cma_helper.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c index b127061..47e0e2f 100644 --- a/drivers/gpu/drm/drm_fb_cma_helper.c +++ b/drivers/gpu/drm/drm_fb_cma_helper.c @@ -86,14 +86,21 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb, { struct drm_gem_cma_object *obj; dma_addr_t paddr;
u8 h_div = 1, v_div = 1;
obj = drm_fb_cma_get_gem_obj(fb, plane); if (!obj) return 0;
paddr = obj->paddr + fb->offsets[plane];
- paddr += fb->format->cpp[plane] * (state->src_x >> 16);
- paddr += fb->pitches[plane] * (state->src_y >> 16);
if (plane > 0) {
h_div = fb->format->hsub;
v_div = fb->format->vsub;
}
paddr += (fb->format->cpp[plane] * (state->src_x >> 16)) / h_div;
paddr += (fb->pitches[plane] * (state->src_y >> 16)) / v_div;
return paddr;
}
2.7.4
On Mon, Aug 20, 2018 at 12:03:19PM +0100, Liviu Dudau wrote:
On Fri, Aug 17, 2018 at 06:33:04PM +0100, Ayan Kumar Halder wrote:
For multi-planar formats, while calculating offsets in planes with index greater than 0 (ie second plane, third plane, etc), one needs to divide (src_x * cpp) with horizontal chroma subsampling factor and (src_y * pitch) with vertical chroma subsampling factor.
The reason being that the planes contain subsampled (ie reduced) data (by a factor of 2) and thus the
drop the extraneous "the" at the end of the line.
while calculating the byte position coresponding to the x and y co-ordinates, one needs to be
and drop the extraneous "be" at the end of this line.
divide it with the sampling factor.
Signed-off-by: Ayan Kumar halder ayan.halder@arm.com
Otherwise, it looks good to me!
Reviewed-by: Liviu Dudau liviu.dudau@arm.com
Thanks Liviu. I will update the commit message and push this in drm-misc-next.
Best regards, Liviu
drivers/gpu/drm/drm_fb_cma_helper.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c index b127061..47e0e2f 100644 --- a/drivers/gpu/drm/drm_fb_cma_helper.c +++ b/drivers/gpu/drm/drm_fb_cma_helper.c @@ -86,14 +86,21 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb, { struct drm_gem_cma_object *obj; dma_addr_t paddr;
u8 h_div = 1, v_div = 1;
obj = drm_fb_cma_get_gem_obj(fb, plane); if (!obj) return 0;
paddr = obj->paddr + fb->offsets[plane];
- paddr += fb->format->cpp[plane] * (state->src_x >> 16);
- paddr += fb->pitches[plane] * (state->src_y >> 16);
if (plane > 0) {
h_div = fb->format->hsub;
v_div = fb->format->vsub;
}
paddr += (fb->format->cpp[plane] * (state->src_x >> 16)) / h_div;
paddr += (fb->pitches[plane] * (state->src_y >> 16)) / v_div;
return paddr;
}
2.7.4
--
| I would like to | | fix the world, | | but they're not | | giving me the | \ source code! /
??\_(???)_/??
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
On Mon, Aug 20, 2018 at 01:38:59PM +0100, Ayan Halder wrote:
On Mon, Aug 20, 2018 at 12:03:19PM +0100, Liviu Dudau wrote:
On Fri, Aug 17, 2018 at 06:33:04PM +0100, Ayan Kumar Halder wrote:
For multi-planar formats, while calculating offsets in planes with index greater than 0 (ie second plane, third plane, etc), one needs to divide (src_x * cpp) with horizontal chroma subsampling factor and (src_y * pitch) with vertical chroma subsampling factor.
The reason being that the planes contain subsampled (ie reduced) data (by a factor of 2) and thus the
drop the extraneous "the" at the end of the line.
while calculating the byte position coresponding to the x and y co-ordinates, one needs to be
and drop the extraneous "be" at the end of this line.
divide it with the sampling factor.
Signed-off-by: Ayan Kumar halder ayan.halder@arm.com
Otherwise, it looks good to me!
Reviewed-by: Liviu Dudau liviu.dudau@arm.com
Thanks Liviu. I will update the commit message and push this in drm-misc-next.
Worth waiting for another review before pushing.
Best regards, Liviu
Best regards, Liviu
drivers/gpu/drm/drm_fb_cma_helper.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c index b127061..47e0e2f 100644 --- a/drivers/gpu/drm/drm_fb_cma_helper.c +++ b/drivers/gpu/drm/drm_fb_cma_helper.c @@ -86,14 +86,21 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb, { struct drm_gem_cma_object *obj; dma_addr_t paddr;
u8 h_div = 1, v_div = 1;
obj = drm_fb_cma_get_gem_obj(fb, plane); if (!obj) return 0;
paddr = obj->paddr + fb->offsets[plane];
- paddr += fb->format->cpp[plane] * (state->src_x >> 16);
- paddr += fb->pitches[plane] * (state->src_y >> 16);
if (plane > 0) {
h_div = fb->format->hsub;
v_div = fb->format->vsub;
}
paddr += (fb->format->cpp[plane] * (state->src_x >> 16)) / h_div;
paddr += (fb->pitches[plane] * (state->src_y >> 16)) / v_div;
return paddr;
}
2.7.4
dri-devel@lists.freedesktop.org