diff options
author | Dmitry Osipenko <digetx@gmail.com> | 2018-02-17 19:33:29 +0300 |
---|---|---|
committer | Dmitry Osipenko <digetx@gmail.com> | 2018-02-17 19:33:29 +0300 |
commit | cdc33cfe18493107ead543226e6690d65dcf8c36 (patch) | |
tree | e71980d5daf16772becd492cc5aeb230c2f43164 | |
parent | 9b4f60481c1d827396eb959402654597c1c2dc9e (diff) |
Make DRI <-> Xv transition less flashy
-rw-r--r-- | src/presentation_queue.c | 4 | ||||
-rw-r--r-- | src/presentation_queue_target.c | 34 | ||||
-rw-r--r-- | src/vdpau_tegra.h | 2 |
3 files changed, 20 insertions, 20 deletions
diff --git a/src/presentation_queue.c b/src/presentation_queue.c index 128676e..c5e8429 100644 --- a/src/presentation_queue.c +++ b/src/presentation_queue.c @@ -95,7 +95,7 @@ static void * presentation_queue_thr(void *opaque) DebugMsg("displaying surface %u\n", surf->surface_id); - pqt_display_surface(pqt, surf, false); + pqt_display_surface(pqt, surf, true, false); } time = earliest_time; @@ -334,7 +334,7 @@ VdpStatus vdp_presentation_queue_display( if (earliest_presentation_time == 0 || !_Xglobal_lock) { pthread_mutex_lock(&pq->lock); - pqt_display_surface(pq->pqt, surf, false); + pqt_display_surface(pq->pqt, surf, true, false); pthread_mutex_unlock(&pq->lock); goto unlock_surf; diff --git a/src/presentation_queue_target.c b/src/presentation_queue_target.c index d0eacff..5240b6f 100644 --- a/src/presentation_queue_target.c +++ b/src/presentation_queue_target.c @@ -98,12 +98,15 @@ static void pqt_update_dri_pixbuf(tegra_pqt *pqt) static void pqt_display_dri(tegra_pqt *pqt, tegra_surface *surf) { tegra_device *dev = pqt->dev; + CARD64 ust, msc, sbc; CARD64 count; DebugMsg("surface %u DRI\n", surf->surface_id); pthread_mutex_lock(&dev->lock); + DRI2GetMSC(dev->display, pqt->drawable, &ust, &msc, &sbc); DRI2SwapBuffers(dev->display, pqt->drawable, 0, 0, 0, &count); + DRI2WaitMSC(dev->display, pqt->drawable, msc + 1, 1, 1, &ust, &msc, &sbc); pthread_mutex_unlock(&dev->lock); if (pqt->dri_prep_surf == surf) { @@ -165,17 +168,11 @@ static void transit_display_to_xv(tegra_pqt *pqt) { tegra_surface *surf = pqt->disp_surf; tegra_device *dev = pqt->dev; - CARD64 ust, msc, sbc; DebugMsg("surface %u\n", surf->surface_id); - XSync(dev->display, 0); - - DRI2GetMSC(dev->display, pqt->drawable, &ust, &msc, &sbc); - DRI2WaitMSC(dev->display, pqt->drawable, msc + 1, 1, 1, &ust, &msc, &sbc); - - XSetWindowBackground(dev->display, pqt->drawable, pqt->bg_color); XClearWindow(dev->display, pqt->drawable); + XSync(dev->display, 0); } static void transit_display_to_dri(tegra_pqt *pqt) @@ -296,7 +293,7 @@ void pqt_prepare_dri_surface(tegra_pqt *pqt, tegra_surface *surf) } void pqt_display_surface(tegra_pqt *pqt, tegra_surface *surf, - bool update_state) + bool update_status, bool transit) { DebugMsg("surface %u earliest_presentation_time %llu+\n", surf->surface_id, surf->earliest_presentation_time); @@ -304,22 +301,19 @@ void pqt_display_surface(tegra_pqt *pqt, tegra_surface *surf, pthread_mutex_lock(&pqt->lock); pthread_mutex_lock(&surf->lock); - surf->first_presentation_time = get_time(); - surf->status = VDP_PRESENTATION_QUEUE_STATUS_VISIBLE; - if (tegra_vdpau_force_dri || pqt->overlapped_current) { pqt_update_dri_buffer(pqt, surf); pqt_display_dri(pqt, surf); - if (update_state) { + if (transit) { transit_display_to_dri(pqt); } } else { - if (update_state) { + pqt_display_xv(pqt, surf); + + if (transit) { transit_display_to_xv(pqt); } - - pqt_display_xv(pqt, surf); } if (pqt->disp_surf != surf) { @@ -327,6 +321,11 @@ void pqt_display_surface(tegra_pqt *pqt, tegra_surface *surf, pqt->disp_surf = surf; } + if (update_status) { + surf->first_presentation_time = get_time(); + surf->status = VDP_PRESENTATION_QUEUE_STATUS_VISIBLE; + } + pthread_mutex_unlock(&surf->lock); pthread_mutex_unlock(&pqt->lock); @@ -356,14 +355,14 @@ static void * pqt_display_thr(void *opaque) pqt->overlapped_current = overlapped; if (pqt->disp_surf) { - pqt_display_surface(pqt, pqt->disp_surf, true); + pqt_display_surface(pqt, pqt->disp_surf, false, true); } } if (pqt->win_move) { pqt->win_move = false; if (pqt->disp_surf) { - pqt_display_surface(pqt, pqt->disp_surf, false); + pqt_display_surface(pqt, pqt->disp_surf, false, false); } } pthread_mutex_unlock(&pqt->lock); @@ -459,6 +458,7 @@ static bool initialize_dri2(tegra_pqt *pqt) } DRI2CreateDrawable(dev->display, pqt->drawable); + DRI2SwapInterval(dev->display, pqt->drawable, 1); pqt_update_dri_pixbuf(pqt); diff --git a/src/vdpau_tegra.h b/src/vdpau_tegra.h index dd0be45..c524eae 100644 --- a/src/vdpau_tegra.h +++ b/src/vdpau_tegra.h @@ -297,7 +297,7 @@ void set_presentation_queue_target(VdpPresentationQueueTarget target, tegra_pqt *pqt); void pqt_display_surface_to_idle_state(tegra_pqt *pqt); void pqt_display_surface(tegra_pqt *pqt, tegra_surface *surf, - bool update_state); + bool update_status, bool transit); void pqt_prepare_dri_surface(tegra_pqt *pqt, tegra_surface *surf); tegra_pq * __get_presentation_queue(VdpPresentationQueue presentation_queue); |