Calculate damage before trying to flip and report it to the driver. This allows supporting drivers to optimize their rendering.
Signed-off-by: Roman Gilg <subd...@gmail.com> --- present/present.h | 3 ++- present/present_wnmd.c | 24 +++++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/present/present.h b/present/present.h index 7929cf9..b9e7839 100644 --- a/present/present.h +++ b/present/present.h @@ -96,7 +96,8 @@ typedef Bool (*present_wnmd_flip_ptr) (WindowPtr window, uint64_t event_id, uint64_t target_msc, PixmapPtr pixmap, - Bool sync_flip); + Bool sync_flip, + RegionPtr damage); /* "unflip" back to the regular screen scanout buffer * diff --git a/present/present_wnmd.c b/present/present_wnmd.c index c428232..77f4f19 100644 --- a/present/present_wnmd.c +++ b/present/present_wnmd.c @@ -351,7 +351,8 @@ present_wnmd_flip(WindowPtr window, uint64_t event_id, uint64_t target_msc, PixmapPtr pixmap, - Bool sync_flip) + Bool sync_flip, + RegionPtr damage) { ScreenPtr screen = crtc->pScreen; present_screen_priv_ptr screen_priv = present_screen_priv(screen); @@ -361,7 +362,8 @@ present_wnmd_flip(WindowPtr window, event_id, target_msc, pixmap, - sync_flip); + sync_flip, + damage); } static void @@ -422,12 +424,19 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) */ xorg_list_add(&vblank->event_queue, &window_priv->flip_queue); + /* Set update region as damaged */ + if (vblank->update) { + damage = vblank->update; + RegionIntersect(damage, damage, &window->clipList); + } else + damage = &window->clipList; + /* Try to flip - the vblank is now pending */ window_priv->flip_pending = vblank; // ask the driver if (present_wnmd_flip(vblank->window, vblank->crtc, vblank->event_id, - vblank->target_msc, vblank->pixmap, vblank->sync_flip)) { + vblank->target_msc, vblank->pixmap, vblank->sync_flip, damage)) { /* Fix window pixmap: Copy pixmap content to window drawable */ present_copy_region(&window->drawable, @@ -436,14 +445,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) vblank->x_off, vblank->y_off); - /* Report update region as damaged - */ - if (vblank->update) { - damage = vblank->update; - RegionIntersect(damage, damage, &window->clipList); - } else - damage = &window->clipList; - + /* Report damage */ DamageDamageRegion(&vblank->window->drawable, damage); return; } -- 2.7.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel