[PATCH xserver v2 15/22] present: In window flip mode report damage on flip to driver
Roman Gilg
subdiff at gmail.com
Wed Feb 28 16:36:57 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 553fd49..8b2e03f 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 14ab721..da503af 100644
--- a/present/present_wnmd.c
+++ b/present/present_wnmd.c
@@ -341,7 +341,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);
@@ -351,7 +352,8 @@ present_wnmd_flip(WindowPtr window,
event_id,
target_msc,
pixmap,
- sync_flip);
+ sync_flip,
+ damage);
}
static void
@@ -412,12 +414,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);
@@ -427,14 +436,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