drm/simpledrm: Iterate over damage clips
Iterate over all damage clips and updated them one by one. Replaces the merging of damage areas, which can result in significant overhead if damage areas are not close to each other. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220922130944.27138-5-tzimmermann@suse.de
This commit is contained in:
parent
7fcf19301e
commit
52a504e868
@ -478,23 +478,25 @@ static void simpledrm_primary_plane_helper_atomic_update(struct drm_plane *plane
|
||||
struct drm_framebuffer *fb = plane_state->fb;
|
||||
struct drm_device *dev = plane->dev;
|
||||
struct simpledrm_device *sdev = simpledrm_device_of_dev(dev);
|
||||
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);
|
||||
struct drm_rect src_clip, dst_clip;
|
||||
struct drm_atomic_helper_damage_iter iter;
|
||||
struct drm_rect damage;
|
||||
int idx;
|
||||
|
||||
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;
|
||||
|
||||
iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
|
||||
drm_fb_blit(&dst, &sdev->pitch, sdev->format->format, shadow_plane_state->data, fb,
|
||||
&src_clip);
|
||||
drm_atomic_helper_damage_iter_init(&iter, old_plane_state, plane_state);
|
||||
drm_atomic_for_each_plane_damage(&iter, &damage) {
|
||||
struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base);
|
||||
struct drm_rect dst_clip = plane_state->dst;
|
||||
|
||||
if (!drm_rect_intersect(&dst_clip, &damage))
|
||||
continue;
|
||||
|
||||
iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip));
|
||||
drm_fb_blit(&dst, &sdev->pitch, sdev->format->format, shadow_plane_state->data, fb,
|
||||
&damage);
|
||||
}
|
||||
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user