xf86-video-intel: src/sna/sna_dri2.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri May 23 04:41:45 PDT 2014
src/sna/sna_dri2.c | 106 +++++++++++++++++++++++++++++------------------------
1 file changed, 59 insertions(+), 47 deletions(-)
New commits:
commit 417997f3892b3a5fe43f5951dbde1476092ec82c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri May 23 12:40:10 2014 +0100
sna/dri2: Handle offscreen Window and Pixmap with CRTC tracking
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 00d0f9c..7f2b056 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -954,6 +954,51 @@ static void dri2_window_attach(WindowPtr win, struct dri2_window *priv)
assert(dri2_window(win) == priv);
}
+static uint64_t
+draw_current_msc(DrawablePtr draw, xf86CrtcPtr crtc, uint64_t msc)
+{
+ struct dri2_window *priv;
+
+ if (draw->type != DRAWABLE_WINDOW)
+ return msc;
+
+ priv = dri2_window((WindowPtr)draw);
+ if (priv == NULL) {
+ priv = malloc(sizeof(*priv));
+ if (priv != NULL) {
+ priv->crtc = crtc;
+ priv->msc_delta = 0;
+ priv->chain = NULL;
+ dri2_window_attach((WindowPtr)draw, priv);
+ }
+ } else {
+ if (priv->crtc != crtc) {
+ const struct ust_msc *last = sna_crtc_last_swap(priv->crtc);
+ const struct ust_msc *this = sna_crtc_last_swap(crtc);
+ DBG(("%s: Window transferring from pipe=%d [msc=%llu] to pipe=%d [msc=%llu], delta now %lld\n",
+ __FUNCTION__,
+ sna_crtc_to_pipe(priv->crtc), (long long)last->msc,
+ sna_crtc_to_pipe(crtc), (long long)this->msc,
+ (long long)(priv->msc_delta + this->msc - last->msc)));
+ priv->msc_delta += this->msc - last->msc;
+ priv->crtc = crtc;
+ }
+ msc -= priv->msc_delta;
+ }
+ return msc;
+}
+
+static uint32_t
+draw_target_seq(DrawablePtr draw, uint64_t msc)
+{
+ struct dri2_window *priv = dri2_window((WindowPtr)draw);
+ if (priv == NULL)
+ return msc;
+ DBG(("%s: converting target_msc=%llu to seq %u\n",
+ __FUNCTION__, (long long)msc, (unsigned)(msc + priv->msc_delta)));
+ return msc + priv->msc_delta;
+}
+
static xf86CrtcPtr
sna_dri2_get_crtc(DrawablePtr draw)
{
@@ -1344,12 +1389,15 @@ static void frame_swap_complete(struct sna *sna,
return;
swap = sna_crtc_last_swap(frame->crtc);
- DBG(("%s: pipe=%d, frame=%lld, tv=%d.%06d\n",
+ DBG(("%s: pipe=%d, frame=%lld [msc=%lld], tv=%d.%06d\n",
__FUNCTION__, frame->pipe,
- (long long)swap->msc, swap->tv_sec, swap->tv_usec));
+ (long long)swap->msc,
+ (long long)draw_current_msc(frame->draw, frame->crtc, swap->msc),
+ swap->tv_sec, swap->tv_usec));
DRI2SwapComplete(frame->client, frame->draw,
- swap->msc, swap->tv_sec, swap->tv_usec,
+ draw_current_msc(frame->draw, frame->crtc, swap->msc),
+ swap->tv_sec, swap->tv_usec,
type, frame->event_complete, frame->event_data);
}
@@ -1360,12 +1408,15 @@ static void fake_swap_complete(struct sna *sna, ClientPtr client,
const struct ust_msc *swap;
swap = sna_crtc_last_swap(crtc);
- DBG(("%s: pipe=%d, frame=%lld, tv=%d.%06d\n",
+ DBG(("%s: pipe=%d, frame=%lld [msc %lld], tv=%d.%06d\n",
__FUNCTION__, crtc ? sna_crtc_to_pipe(crtc) : -1,
- (long long)swap->msc, swap->tv_sec, swap->tv_usec));
+ (long long)swap->msc,
+ (long long)draw_current_msc(draw, crtc, swap->msc),
+ swap->tv_sec, swap->tv_usec));
DRI2SwapComplete(client, draw,
- swap->msc, swap->tv_sec, swap->tv_usec,
+ draw_current_msc(draw, crtc, swap->msc),
+ swap->tv_sec, swap->tv_usec,
type, func, data);
}
@@ -1887,46 +1938,6 @@ sna_dri2_page_flip_handler(struct sna *sna,
}
static uint64_t
-draw_current_msc(DrawablePtr draw, xf86CrtcPtr crtc, uint64_t msc)
-{
- struct dri2_window *priv = dri2_window((WindowPtr)draw);
- if (priv == NULL) {
- priv = malloc(sizeof(*priv));
- if (priv != NULL) {
- priv->crtc = crtc;
- priv->msc_delta = 0;
- priv->chain = NULL;
- dri2_window_attach((WindowPtr)draw, priv);
- }
- } else {
- if (priv->crtc != crtc) {
- const struct ust_msc *last = sna_crtc_last_swap(priv->crtc);
- const struct ust_msc *this = sna_crtc_last_swap(crtc);
- DBG(("%s: Window transferring from pipe=%d [msc=%llu] to pipe=%d [msc=%llu], delta now %lld\n",
- __FUNCTION__,
- sna_crtc_to_pipe(priv->crtc), (long long)last->msc,
- sna_crtc_to_pipe(crtc), (long long)this->msc,
- (long long)(priv->msc_delta + this->msc - last->msc)));
- priv->msc_delta += this->msc - last->msc;
- priv->crtc = crtc;
- }
- msc -= priv->msc_delta;
- }
- return msc;
-}
-
-static uint32_t
-draw_target_seq(DrawablePtr draw, uint64_t msc)
-{
- struct dri2_window *priv = dri2_window((WindowPtr)draw);
- if (priv == NULL)
- return msc;
- DBG(("%s: converting target_msc=%llu to seq %u\n",
- __FUNCTION__, (long long)msc, (unsigned)(msc + priv->msc_delta)));
- return msc + priv->msc_delta;
-}
-
-static uint64_t
get_current_msc(struct sna *sna, DrawablePtr draw, xf86CrtcPtr crtc)
{
union drm_wait_vblank vbl;
@@ -2485,7 +2496,8 @@ out_complete:
crtc = sna_mode_first_crtc(sna);
swap = sna_crtc_last_swap(crtc);
DRI2WaitMSCComplete(client, draw,
- swap->msc, swap->tv_sec, swap->tv_usec);
+ draw_current_msc(draw, crtc, swap->msc),
+ swap->tv_sec, swap->tv_usec);
return TRUE;
}
#else
More information about the xorg-commit
mailing list