Commit 52a504e8 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220922130944.27138-5-tzimmermann@suse.de
parent 7fcf1930
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -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))
	if (!drm_dev_enter(dev, &idx))
		return;

	dst_clip = plane_state->dst;
	if (!drm_rect_intersect(&dst_clip, &src_clip))
		return;
	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_dev_enter(dev, &idx))
		return;
		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,
		    &src_clip);
			    &damage);
	}

	drm_dev_exit(idx);
}