Henri Verbeet : wined3d: Send query destruction through the command stream.
Module: wine Branch: master Commit: 97eb359588725f6d1c38146a606856b50588dbdf URL: http://source.winehq.org/git/wine.git/?a=commit;h=97eb359588725f6d1c38146a60... Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Wed Jun 22 10:39:03 2016 +0200 wined3d: Send query destruction through the command stream. Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/query.c | 61 ++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c index 410ce6c..c8d6b47 100644 --- a/dlls/wined3d/query.c +++ b/dlls/wined3d/query.c @@ -233,41 +233,46 @@ ULONG CDECL wined3d_query_incref(struct wined3d_query *query) return refcount; } -ULONG CDECL wined3d_query_decref(struct wined3d_query *query) +static void wined3d_query_destroy_object(void *object) { - ULONG refcount = InterlockedDecrement(&query->ref); + struct wined3d_query *query = object; - TRACE("%p decreasing refcount to %u.\n", query, refcount); + /* Queries are specific to the GL context that created them. Not + * deleting the query will obviously leak it, but that's still better + * than potentially deleting a different query with the same id in this + * context, and (still) leaking the actual query. */ + if (query->type == WINED3D_QUERY_TYPE_EVENT) + { + struct wined3d_event_query *event_query = query->extendedData; + if (event_query) wined3d_event_query_destroy(event_query); + } + else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION) + { + struct wined3d_occlusion_query *oq = query->extendedData; - if (!refcount) + if (oq->context) context_free_occlusion_query(oq); + HeapFree(GetProcessHeap(), 0, query->extendedData); + } + else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP) { - /* Queries are specific to the GL context that created them. Not - * deleting the query will obviously leak it, but that's still better - * than potentially deleting a different query with the same id in this - * context, and (still) leaking the actual query. */ - if (query->type == WINED3D_QUERY_TYPE_EVENT) - { - struct wined3d_event_query *event_query = query->extendedData; - if (event_query) wined3d_event_query_destroy(event_query); - } - else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION) - { - struct wined3d_occlusion_query *oq = query->extendedData; + struct wined3d_timestamp_query *tq = query->extendedData; - if (oq->context) context_free_occlusion_query(oq); - HeapFree(GetProcessHeap(), 0, query->extendedData); - } - else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP) - { - struct wined3d_timestamp_query *tq = query->extendedData; + if (tq->context) + context_free_timestamp_query(tq); + HeapFree(GetProcessHeap(), 0, query->extendedData); + } - if (tq->context) - context_free_timestamp_query(tq); - HeapFree(GetProcessHeap(), 0, query->extendedData); - } + HeapFree(GetProcessHeap(), 0, query); +} - HeapFree(GetProcessHeap(), 0, query); - } +ULONG CDECL wined3d_query_decref(struct wined3d_query *query) +{ + ULONG refcount = InterlockedDecrement(&query->ref); + + TRACE("%p decreasing refcount to %u.\n", query, refcount); + + if (!refcount) + wined3d_cs_emit_destroy_object(query->device->cs, wined3d_query_destroy_object, query); return refcount; }
participants (1)
-
Alexandre Julliard