Skip to content

Commit

Permalink
drm/simpledrm: Enable FB_DAMAGE_CLIPS property
Browse files Browse the repository at this point in the history
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: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Noralf Trønnes <noralf@tronnes.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211110103702.374-8-tzimmermann@suse.de
  • Loading branch information
Thomas Zimmermann committed Nov 11, 2021
1 parent 18ac700 commit 0dd80b4
Showing 1 changed file with 19 additions and 9 deletions.
28 changes: 19 additions & 9 deletions drivers/gpu/drm/tiny/simpledrm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 0dd80b4

Please sign in to comment.