summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/driclient/src/driclient.c15
-rw-r--r--src/libXvMC/context.c6
2 files changed, 21 insertions, 0 deletions
diff --git a/src/driclient/src/driclient.c b/src/driclient/src/driclient.c
index 2d7514166f..dc2189afec 100644
--- a/src/driclient/src/driclient.c
+++ b/src/driclient/src/driclient.c
@@ -111,8 +111,23 @@ free_screen:
int driDestroyScreen(dri_screen_t *dri_screen)
{
+ Drawable draw;
+ dri_drawable_t *dri_draw;
+
assert(dri_screen);
+ if (drmHashFirst(dri_screen->drawable_hash, &draw, (void**)&dri_draw))
+ {
+ dri_draw->refcount = 1;
+ driDestroyDrawable(dri_draw);
+
+ while (drmHashNext(dri_screen->drawable_hash, &draw, (void**)&dri_draw))
+ {
+ dri_draw->refcount = 1;
+ driDestroyDrawable(dri_draw);
+ }
+ }
+
drmHashDestroy(dri_screen->drawable_hash);
drmUnmap(dri_screen->sarea, SAREA_MAX);
drmCloseOnce(dri_screen->fd);
diff --git a/src/libXvMC/context.c b/src/libXvMC/context.c
index 698410d4c2..273f658029 100644
--- a/src/libXvMC/context.c
+++ b/src/libXvMC/context.c
@@ -182,6 +182,8 @@ Status XvMCCreateContext(Display *display, XvPortID port, int surface_type_id, i
Status XvMCDestroyContext(Display *display, XvMCContext *context)
{
struct vlContext *vl_ctx;
+ struct vlScreen *vl_screen;
+ struct vlDisplay *vl_dpy;
struct pipe_context *pipe;
assert(display);
@@ -194,7 +196,11 @@ Status XvMCDestroyContext(Display *display, XvMCContext *context)
assert(display == vlGetNativeDisplay(vlGetDisplay(vlContextGetScreen(vl_ctx))));
pipe = vlGetPipeContext(vl_ctx);
+ vl_screen = vlContextGetScreen(vl_ctx);
+ vl_dpy = vlGetDisplay(vl_screen);
vlDestroyContext(vl_ctx);
+ vlDestroyScreen(vl_screen);
+ vlDestroyDisplay(vl_dpy);
destroy_pipe_context(pipe);
return Success;