summaryrefslogtreecommitdiff
path: root/present
diff options
context:
space:
mode:
authorRoman Gilg <subdiff@gmail.com>2018-03-13 16:00:49 +0100
committerAdam Jackson <ajax@redhat.com>2018-03-28 14:36:39 -0400
commit66a5c0bccb222ad8b9b57b10490c3041e1b3f05e (patch)
treef538ba9f3c255014462a6097a0647d6b851d294a /present
parent029608dd80204ac96423ef79ec46c1a18bbdd5ff (diff)
present: In window flip mode report damage on flip to driver
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@gmail.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'present')
-rw-r--r--present/present.h3
-rw-r--r--present/present_wnmd.c24
2 files changed, 15 insertions, 12 deletions
diff --git a/present/present.h b/present/present.h
index 0ea0a0eb6..affb75f35 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 c1f879cac..72bda2fbf 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;
}