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@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2014-05-23 10:03:39 +01:00
parent 43fd06ee7d
commit d6c4e72f1a
1 changed files with 20 additions and 18 deletions

View File

@ -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)
{