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>
This commit is contained in:
parent
029608dd80
commit
66a5c0bccb
|
@ -105,7 +105,8 @@ typedef Bool (*present_wnmd_flip_ptr) (WindowPtr window,
|
||||||
uint64_t event_id,
|
uint64_t event_id,
|
||||||
uint64_t target_msc,
|
uint64_t target_msc,
|
||||||
PixmapPtr pixmap,
|
PixmapPtr pixmap,
|
||||||
Bool sync_flip);
|
Bool sync_flip,
|
||||||
|
RegionPtr damage);
|
||||||
|
|
||||||
/* "unflip" back to the regular screen scanout buffer
|
/* "unflip" back to the regular screen scanout buffer
|
||||||
*
|
*
|
||||||
|
|
|
@ -350,7 +350,8 @@ present_wnmd_flip(WindowPtr window,
|
||||||
uint64_t event_id,
|
uint64_t event_id,
|
||||||
uint64_t target_msc,
|
uint64_t target_msc,
|
||||||
PixmapPtr pixmap,
|
PixmapPtr pixmap,
|
||||||
Bool sync_flip)
|
Bool sync_flip,
|
||||||
|
RegionPtr damage)
|
||||||
{
|
{
|
||||||
ScreenPtr screen = crtc->pScreen;
|
ScreenPtr screen = crtc->pScreen;
|
||||||
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
|
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
|
||||||
|
@ -360,7 +361,8 @@ present_wnmd_flip(WindowPtr window,
|
||||||
event_id,
|
event_id,
|
||||||
target_msc,
|
target_msc,
|
||||||
pixmap,
|
pixmap,
|
||||||
sync_flip);
|
sync_flip,
|
||||||
|
damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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);
|
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
|
/* Try to flip - the vblank is now pending
|
||||||
*/
|
*/
|
||||||
window_priv->flip_pending = vblank;
|
window_priv->flip_pending = vblank;
|
||||||
// ask the driver
|
// ask the driver
|
||||||
if (present_wnmd_flip(vblank->window, vblank->crtc, vblank->event_id,
|
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;
|
ScreenPtr screen = window->drawable.pScreen;
|
||||||
WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window);
|
WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window);
|
||||||
PixmapPtr old_pixmap = screen->GetWindowPixmap(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++;
|
vblank->pixmap->refcnt++;
|
||||||
dixDestroyPixmap(old_pixmap, old_pixmap->drawable.id);
|
dixDestroyPixmap(old_pixmap, old_pixmap->drawable.id);
|
||||||
|
|
||||||
/* Report update region as damaged
|
/* Report damage */
|
||||||
*/
|
|
||||||
if (vblank->update) {
|
|
||||||
damage = vblank->update;
|
|
||||||
RegionIntersect(damage, damage, &window->clipList);
|
|
||||||
} else
|
|
||||||
damage = &window->clipList;
|
|
||||||
|
|
||||||
DamageDamageRegion(&vblank->window->drawable, damage);
|
DamageDamageRegion(&vblank->window->drawable, damage);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue