summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Osipenko <digetx@gmail.com>2018-02-17 19:33:29 +0300
committerDmitry Osipenko <digetx@gmail.com>2018-02-17 19:33:29 +0300
commitcdc33cfe18493107ead543226e6690d65dcf8c36 (patch)
treee71980d5daf16772becd492cc5aeb230c2f43164
parent9b4f60481c1d827396eb959402654597c1c2dc9e (diff)
Make DRI <-> Xv transition less flashy
-rw-r--r--src/presentation_queue.c4
-rw-r--r--src/presentation_queue_target.c34
-rw-r--r--src/vdpau_tegra.h2
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);