From: Christian König Date: Mon, 25 Apr 2011 09:39:41 +0000 (+0200) Subject: vdpau: implement and cleanup PresentationQueueTarget destruction X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5aa26412432dbdb3b1677d6d2f74bba010f443ae;p=mesa.git vdpau: implement and cleanup PresentationQueueTarget destruction --- diff --git a/src/gallium/state_trackers/vdpau/device.c b/src/gallium/state_trackers/vdpau/device.c index 7906757ec1b..b3de0f29305 100644 --- a/src/gallium/state_trackers/vdpau/device.c +++ b/src/gallium/state_trackers/vdpau/device.c @@ -27,9 +27,12 @@ #include #include -#include + #include #include + +#include + #include "vdpau_private.h" PUBLIC VdpStatus @@ -94,8 +97,8 @@ PUBLIC VdpStatus vlVdpPresentationQueueTargetCreateX11(VdpDevice device, Drawable drawable, VdpPresentationQueueTarget *target) { - VdpStatus ret; - vlVdpPresentationQueueTarget *pqt = NULL; + vlVdpPresentationQueueTarget *pqt; + VdpStatus ret; debug_printf("[VDPAU] Creating PresentationQueueTarget\n"); @@ -122,10 +125,27 @@ vlVdpPresentationQueueTargetCreateX11(VdpDevice device, Drawable drawable, return VDP_STATUS_OK; no_handle: - FREE(dev); + FREE(pqt); return ret; } +VdpStatus +vlVdpPresentationQueueTargetDestroy(VdpPresentationQueueTarget presentation_queue_target) +{ + vlVdpPresentationQueueTarget *pqt; + + debug_printf("[VDPAU] Destroying PresentationQueueTarget\n"); + + pqt = vlGetDataHTAB(presentation_queue_target); + if (!pqt) + return VDP_STATUS_INVALID_HANDLE; + + vlRemoveDataHTAB(presentation_queue_target); + FREE(pqt); + + return VDP_STATUS_OK; +} + VdpStatus vlVdpDeviceDestroy(VdpDevice device) { @@ -134,6 +154,7 @@ vlVdpDeviceDestroy(VdpDevice device) vlVdpDevice *dev = vlGetDataHTAB(device); if (!dev) return VDP_STATUS_INVALID_HANDLE; + FREE(dev); vlDestroyHTAB(); diff --git a/src/gallium/state_trackers/vdpau/htab.c b/src/gallium/state_trackers/vdpau/htab.c index 0c958055374..20f5a171f19 100644 --- a/src/gallium/state_trackers/vdpau/htab.c +++ b/src/gallium/state_trackers/vdpau/htab.c @@ -92,3 +92,13 @@ void* vlGetDataHTAB(vlHandle handle) return (void*)handle; #endif } + +void vlRemoveDataHTAB(vlHandle handle) +{ +#ifdef VL_HANDLES + pipe_mutex_lock(htab_lock); + if (htab) + handle_table_remove(htab, handle); + pipe_mutex_unlock(htab_lock); +#endif +} diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index 063c63fb4ee..2837e7a306f 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -27,16 +27,12 @@ #include -#include "vdpau_private.h" #include + #include #include -VdpStatus -vlVdpPresentationQueueTargetDestroy(VdpPresentationQueueTarget presentation_queue_target) -{ - return VDP_STATUS_NO_IMPLEMENTATION; -} +#include "vdpau_private.h" VdpStatus vlVdpPresentationQueueCreate(VdpDevice device, diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index bd77507567f..ac1f9ccef99 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -222,6 +222,8 @@ boolean vlCreateHTAB(void); void vlDestroyHTAB(void); vlHandle vlAddDataHTAB(void *data); void* vlGetDataHTAB(vlHandle handle); +void vlRemoveDataHTAB(vlHandle handle); + boolean vlGetFuncFTAB(VdpFuncId function_id, void **func); /* Public functions */