xf86-video-intel: 3 commits - src/sna/sna_dri2.c src/sna/sna_driver.c test/dri2-test.c

Chris Wilson ickle at kemper.freedesktop.org
Fri May 23 04:02:20 PDT 2014


 src/sna/sna_dri2.c   |  118 ++++++++++++++++++++++++++++-----------------------
 src/sna/sna_driver.c |    4 -
 test/dri2-test.c     |   13 +++++
 3 files changed, 81 insertions(+), 54 deletions(-)

New commits:
commit d3781e19cfc3edf61b69617cd60da1e421de8ffc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 23 11:16:56 2014 +0100

    test/dri2: Restore original configuration after testing
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/test/dri2-test.c b/test/dri2-test.c
index d8ff3d9..51b3da9 100644
--- a/test/dri2-test.c
+++ b/test/dri2-test.c
@@ -177,6 +177,7 @@ int main(void)
 		DRI2BufferFrontLeft,
 	};
 	XRRScreenResources *res;
+	XRRCrtcInfo **original_crtc;
 	Window root;
 	uint64_t last_msc;
 
@@ -198,6 +199,10 @@ int main(void)
 	if (res == NULL)
 		return 1;
 
+	original_crtc = malloc(sizeof(XRRCrtcInfo *)*res->ncrtc);
+	for (i = 0; i < res->ncrtc; i++)
+		original_crtc[i] = XRRGetCrtcInfo(dpy, res, res->crtcs[i]);
+
 	printf("noutput=%d, ncrtc=%d\n", res->noutput, res->ncrtc);
 	last_msc = check_msc(dpy, root, 0);
 	for (i = 0; i < res->ncrtc; i++)
@@ -244,5 +249,13 @@ int main(void)
 		XRRFreeOutputInfo(output);
 	}
 
+	for (i = 0; i < res->ncrtc; i++)
+		XRRSetCrtcConfig(dpy, res, res->crtcs[i], CurrentTime,
+				 original_crtc[i]->x,
+				 original_crtc[i]->y,
+				 original_crtc[i]->mode,
+				 original_crtc[i]->rotation,
+				 original_crtc[i]->outputs,
+				 original_crtc[i]->noutput);
 	return 0;
 }
commit 1d6106c2893f2783611715960a0f5099ef54b4a0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 23 10:11:10 2014 +0100

    sna/dri2: Combine the DRI2 Window privates together into a single struct
    
    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 6f1931f..00d0f9c 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -935,22 +935,23 @@ to_frame_event(uintptr_t  data)
 	 return (struct sna_dri2_frame_event *)(data & ~1);
 }
 
-struct window_crtc {
+struct dri2_window {
+	struct sna_dri2_frame_event *chain;
 	xf86CrtcPtr crtc;
 	int64_t msc_delta;
 };
 
-static struct window_crtc *window_get_crtc(WindowPtr win)
+static struct dri2_window *dri2_window(WindowPtr win)
 {
-	return ((void **)__get_private(win, sna_window_key))[3];
+	assert(win->drawable.type == DRAWABLE_WINDOW);
+	return ((void **)__get_private(win, sna_window_key))[1];
 }
 
-static void window_set_crtc(WindowPtr win, struct window_crtc *wc)
+static void dri2_window_attach(WindowPtr win, struct dri2_window *priv)
 {
-	assert(win->drawable.type == DRAWABLE_WINDOW);
-	assert(window_get_crtc(win) == NULL);
-	((void **)__get_private(win, sna_window_key))[3] = wc;
-	assert(window_get_crtc(win) == wc);
+	assert(dri2_window(win) == NULL);
+	((void **)__get_private(win, sna_window_key))[1] = priv;
+	assert(dri2_window(win) == priv);
 }
 
 static xf86CrtcPtr
@@ -974,17 +975,20 @@ sna_dri2_get_crtc(DrawablePtr draw)
 static struct sna_dri2_frame_event *
 sna_dri2_window_get_chain(WindowPtr win)
 {
-	return ((void **)__get_private(win, sna_window_key))[1];
+	struct dri2_window *priv = dri2_window(win);
+	assert(priv != NULL);
+	return priv->chain;
 }
 
 static void
 sna_dri2_window_set_chain(WindowPtr win,
-			 struct sna_dri2_frame_event *chain)
+			  struct sna_dri2_frame_event *chain)
 {
+	struct dri2_window *priv = dri2_window(win);
 	DBG(("%s: head now %p\n", __FUNCTION__, chain));
-	assert(win->drawable.type == DRAWABLE_WINDOW);
+	assert(priv != NULL);
 	assert(sna_dri2_window_get_chain(win) != chain);
-	((void **)__get_private(win, sna_window_key))[1] = chain;
+	priv->chain = chain;
 }
 
 static void
@@ -1077,28 +1081,35 @@ sna_dri2_frame_event_info_free(struct sna *sna,
 void sna_dri2_destroy_window(WindowPtr win)
 {
 	struct sna *sna = to_sna_from_drawable(&win->drawable);
-	struct sna_dri2_frame_event *info, *chain;
-
-	free(window_get_crtc(win));
+	struct dri2_window *priv = dri2_window(win);
 
-	info = sna_dri2_window_get_chain(win);
-	if (info == NULL)
+	if (priv == NULL)
 		return;
 
 	DBG(("%s: window=%ld\n", __FUNCTION__, win->drawable.serialNumber));
-	info->draw = NULL;
 
-	chain = info->chain;
-	info->chain = NULL;
+	if (priv->chain) {
+		struct sna_dri2_frame_event *info, *chain;
+
+		DBG(("%s: freeing chain\n", __FUNCTION__));
+
+		info = priv->chain;
+		info->draw = NULL;
 
-	while ((info = chain)) {
 		chain = info->chain;
-		if (info->queued) {
-			info->draw = NULL;
-			info->chain = NULL;
-		} else
-			sna_dri2_frame_event_info_free(sna, NULL, info);
+		info->chain = NULL;
+
+		while ((info = chain)) {
+			chain = info->chain;
+			if (info->queued) {
+				info->draw = NULL;
+				info->chain = NULL;
+			} else
+				sna_dri2_frame_event_info_free(sna, NULL, info);
+		}
 	}
+
+	free(priv);
 }
 
 static bool
@@ -1878,27 +1889,28 @@ sna_dri2_page_flip_handler(struct sna *sna,
 static uint64_t
 draw_current_msc(DrawablePtr draw, xf86CrtcPtr crtc, uint64_t msc)
 {
-	struct window_crtc *wc = window_get_crtc((WindowPtr)draw);
-	if (wc == NULL) {
-		wc = malloc(sizeof(*wc));
-		if (wc != NULL) {
-			wc->crtc = crtc;
-			wc->msc_delta = 0;
-			window_set_crtc((WindowPtr)draw, wc);
+	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 (wc->crtc != crtc) {
-			const struct ust_msc *last = sna_crtc_last_swap(wc->crtc);
+		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(wc->crtc), (long long)last->msc,
+			     sna_crtc_to_pipe(priv->crtc), (long long)last->msc,
 			     sna_crtc_to_pipe(crtc), (long long)this->msc,
-			     (long long)(wc->msc_delta + this->msc - last->msc)));
-			wc->msc_delta += this->msc - last->msc;
-			wc->crtc = crtc;
+			     (long long)(priv->msc_delta + this->msc - last->msc)));
+			priv->msc_delta += this->msc - last->msc;
+			priv->crtc = crtc;
 		}
-		msc -= wc->msc_delta;
+		msc -= priv->msc_delta;
 	}
 	return  msc;
 }
@@ -1906,12 +1918,12 @@ draw_current_msc(DrawablePtr draw, xf86CrtcPtr crtc, uint64_t msc)
 static uint32_t
 draw_target_seq(DrawablePtr draw, uint64_t msc)
 {
-	struct window_crtc *wc = window_get_crtc((WindowPtr)draw);
-	if (wc == NULL)
+	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 + wc->msc_delta)));
-	return msc + wc->msc_delta;
+	     __FUNCTION__, (long long)msc, (unsigned)(msc + priv->msc_delta)));
+	return msc + priv->msc_delta;
 }
 
 static uint64_t
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index fffb6ec..f609254 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -896,7 +896,7 @@ sna_register_all_privates(void)
 		return FALSE;
 
 	if (!dixRegisterPrivateKey(&sna_window_key, PRIVATE_WINDOW,
-				   4*sizeof(void *)))
+				   3*sizeof(void *)))
 		return FALSE;
 
 	if (!dixRegisterPrivateKey(&sna_client_key, PRIVATE_CLIENT,
@@ -912,7 +912,7 @@ sna_register_all_privates(void)
 	if (!dixRequestPrivate(&sna_glyph_key, sizeof(struct sna_glyph)))
 		return FALSE;
 
-	if (!dixRequestPrivate(&sna_window_key, 4*sizeof(void *)))
+	if (!dixRequestPrivate(&sna_window_key, 3*sizeof(void *)))
 		return FALSE;
 
 	if (!dixRequestPrivate(&sna_client_key, sizeof(struct sna_client)))
commit d6c4e72f1a8008818fc0e5c19c9dc147f1794777
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri May 23 10:03:39 2014 +0100

    sna/dri2: Free the private CRTC tracker on each window
    
    Remember to clean up our privates when the window is destroyed.
    
    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 20995d5..6f1931f 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -935,6 +935,24 @@ to_frame_event(uintptr_t  data)
 	 return (struct sna_dri2_frame_event *)(data & ~1);
 }
 
+struct window_crtc {
+	xf86CrtcPtr crtc;
+	int64_t msc_delta;
+};
+
+static struct window_crtc *window_get_crtc(WindowPtr win)
+{
+	return ((void **)__get_private(win, sna_window_key))[3];
+}
+
+static void window_set_crtc(WindowPtr win, struct window_crtc *wc)
+{
+	assert(win->drawable.type == DRAWABLE_WINDOW);
+	assert(window_get_crtc(win) == NULL);
+	((void **)__get_private(win, sna_window_key))[3] = wc;
+	assert(window_get_crtc(win) == wc);
+}
+
 static xf86CrtcPtr
 sna_dri2_get_crtc(DrawablePtr draw)
 {
@@ -1061,6 +1079,8 @@ void sna_dri2_destroy_window(WindowPtr win)
 	struct sna *sna = to_sna_from_drawable(&win->drawable);
 	struct sna_dri2_frame_event *info, *chain;
 
+	free(window_get_crtc(win));
+
 	info = sna_dri2_window_get_chain(win);
 	if (info == NULL)
 		return;
@@ -1855,24 +1875,6 @@ sna_dri2_page_flip_handler(struct sna *sna,
 	sna_dri2_flip_event(sna, info);
 }
 
-struct window_crtc {
-	xf86CrtcPtr crtc;
-	int64_t msc_delta;
-};
-
-static struct window_crtc *window_get_crtc(WindowPtr win)
-{
-	return ((void **)__get_private(win, sna_window_key))[3];
-}
-
-static void window_set_crtc(WindowPtr win, struct window_crtc *wc)
-{
-	assert(win->drawable.type == DRAWABLE_WINDOW);
-	assert(window_get_crtc(win) == NULL);
-	((void **)__get_private(win, sna_window_key))[3] = wc;
-	assert(window_get_crtc(win) == wc);
-}
-
 static uint64_t
 draw_current_msc(DrawablePtr draw, xf86CrtcPtr crtc, uint64_t msc)
 {


More information about the xorg-commit mailing list