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