[PATCH xserver v3 16/24] present: In window flip mode report damage on flip to driver

Roman Gilg subdiff at gmail.com
Tue Mar 13 15:00:49 UTC 2018


Calculate damage before trying to flip and report it to the driver.
This allows drivers to optimize their rendering.

Signed-off-by: Roman Gilg <subdiff at 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 0ea0a0e..affb75f 100644
--- a/present/present.h
+++ b/present/present.h
@@ -105,7 +105,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 c1f879c..72bda2f 100644
--- a/present/present_wnmd.c
+++ b/present/present_wnmd.c
@@ -350,7 +350,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);
@@ -360,7 +361,8 @@ present_wnmd_flip(WindowPtr window,
                                             event_id,
                                             target_msc,
                                             pixmap,
-                                            sync_flip);
+                                            sync_flip,
+                                            damage);
 }
 
 static void
@@ -449,12 +451,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)) {
                 ScreenPtr screen = window->drawable.pScreen;
                 WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window);
                 PixmapPtr old_pixmap = screen->GetWindowPixmap(window);
@@ -464,14 +473,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
                 vblank->pixmap->refcnt++;
                 dixDestroyPixmap(old_pixmap, old_pixmap->drawable.id);
 
-                /* 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



More information about the xorg-devel mailing list