Commit 0dd80b48 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/simpledrm: Enable FB_DAMAGE_CLIPS property

Enable the FB_DAMAGE_CLIPS property to reduce display-update
overhead. Also fixes a warning in the kernel log.

  simple-framebuffer simple-framebuffer.0: [drm] drm_plane_enable_fb_damage_clips() not called

Fix the computation of the blit rectangle. This wasn't an issue so
far, as simpledrm always blitted the full framebuffer. The code now
supports damage clipping and virtual screen sizes.

v3:
	* fix drm_dev_enter() error path (Noralf)
	* remove unnecessary clipping from update function (Noralf)
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarNoralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211110103702.374-8-tzimmermann@suse.de
parent 18ac700d
......@@ -642,19 +642,23 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe,
void *vmap = shadow_plane_state->data[0].vaddr; /* TODO: Use mapping abstraction */
struct drm_device *dev = &sdev->dev;
void __iomem *dst = sdev->screen_base;
struct drm_rect clip;
struct drm_rect src_clip, dst_clip;
int idx;
if (!fb)
return;
if (!drm_dev_enter(dev, &idx))
drm_rect_fp_to_int(&src_clip, &plane_state->src);
dst_clip = plane_state->dst;
if (!drm_rect_intersect(&dst_clip, &src_clip))
return;
drm_rect_init(&clip, 0, 0, fb->width, fb->height);
if (!drm_dev_enter(dev, &idx))
return;
dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &clip);
drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &clip);
dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
drm_dev_exit(idx);
}
......@@ -686,20 +690,24 @@ simpledrm_simple_display_pipe_update(struct drm_simple_display_pipe *pipe,
struct drm_framebuffer *fb = plane_state->fb;
struct drm_device *dev = &sdev->dev;
void __iomem *dst = sdev->screen_base;
struct drm_rect clip;
struct drm_rect src_clip, dst_clip;
int idx;
if (!fb)
return;
if (!drm_atomic_helper_damage_merged(old_plane_state, plane_state, &clip))
if (!drm_atomic_helper_damage_merged(old_plane_state, plane_state, &src_clip))
return;
dst_clip = plane_state->dst;
if (!drm_rect_intersect(&dst_clip, &src_clip))
return;
if (!drm_dev_enter(dev, &idx))
return;
dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &clip);
drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &clip);
dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip);
drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip);
drm_dev_exit(idx);
}
......@@ -794,6 +802,8 @@ static int simpledrm_device_init_modeset(struct simpledrm_device *sdev)
if (ret)
return ret;
drm_plane_enable_fb_damage_clips(&pipe->plane);
drm_mode_config_reset(dev);
return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment