Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/damage-helper: Add drm_atomic_helper_damage_merged()

Useful for drivers that only care about the combined damage.

v2: Remove unnecessary clearing of damage clips

Cc: Deepak Rawat <drawat@vmware.com>
Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190115043643.2364-3-noralf@tronnes.org

+44
+41
drivers/gpu/drm/drm_damage_helper.c
··· 333 333 return ret; 334 334 } 335 335 EXPORT_SYMBOL(drm_atomic_helper_damage_iter_next); 336 + 337 + /** 338 + * drm_atomic_helper_damage_merged - Merged plane damage 339 + * @old_state: Old plane state for validation. 340 + * @state: Plane state from which to iterate the damage clips. 341 + * @rect: Returns the merged damage rectangle 342 + * 343 + * This function merges any valid plane damage clips into one rectangle and 344 + * returns it in @rect. 345 + * 346 + * For details see: drm_atomic_helper_damage_iter_init() and 347 + * drm_atomic_helper_damage_iter_next(). 348 + * 349 + * Returns: 350 + * True if there is valid plane damage otherwise false. 351 + */ 352 + bool drm_atomic_helper_damage_merged(const struct drm_plane_state *old_state, 353 + struct drm_plane_state *state, 354 + struct drm_rect *rect) 355 + { 356 + struct drm_atomic_helper_damage_iter iter; 357 + struct drm_rect clip; 358 + bool valid = false; 359 + 360 + rect->x1 = INT_MAX; 361 + rect->y1 = INT_MAX; 362 + rect->x2 = 0; 363 + rect->y2 = 0; 364 + 365 + drm_atomic_helper_damage_iter_init(&iter, old_state, state); 366 + drm_atomic_for_each_plane_damage(&iter, &clip) { 367 + rect->x1 = min(rect->x1, clip.x1); 368 + rect->y1 = min(rect->y1, clip.y1); 369 + rect->x2 = max(rect->x2, clip.x2); 370 + rect->y2 = max(rect->y2, clip.y2); 371 + valid = true; 372 + } 373 + 374 + return valid; 375 + } 376 + EXPORT_SYMBOL(drm_atomic_helper_damage_merged);
+3
include/drm/drm_damage_helper.h
··· 78 78 bool 79 79 drm_atomic_helper_damage_iter_next(struct drm_atomic_helper_damage_iter *iter, 80 80 struct drm_rect *rect); 81 + bool drm_atomic_helper_damage_merged(const struct drm_plane_state *old_state, 82 + struct drm_plane_state *state, 83 + struct drm_rect *rect); 81 84 82 85 /** 83 86 * drm_helper_get_plane_damage_clips - Returns damage clips in &drm_rect.