Clip the damage area horizontally if only a single scanline has been
changed. This is helpful to reduce the memcpy overhead for small writes.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
---
 drivers/gpu/drm/drm_fb_helper.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index bed58be1b205..71e65d8999c2 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -690,6 +690,18 @@ static void drm_fb_helper_clip_to_memory_range(struct 
fb_info *info, off_t off,
        u32 x2 = info->var.xres;
        u32 y2 = DIV_ROUND_UP(end, info->fix.line_length);
 
+       if ((y2 - y1) == 1) {
+               /*
+                * We've only written to a single scanline. Try to reduce
+                * the number of horizontal pixels that need an update.
+                */
+               off_t bit_off = (off % info->fix.line_length) * 8;
+               off_t bit_end = (end % info->fix.line_length) * 8;
+
+               x1 = bit_off / info->var.bits_per_pixel;
+               x2 = DIV_ROUND_UP(bit_end, info->var.bits_per_pixel);
+       }
+
        drm_rect_init(clip, x1, y1, x2 - x1, y2 - y1);
 }
 
-- 
2.34.1

Reply via email to