[PATCH 4/5] wined3d: Send query destruction through the command stream.

Henri Verbeet hverbeet at codeweavers.com
Wed Jun 22 03:39:03 CDT 2016


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 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;
 }
-- 
2.1.4




More information about the wine-patches mailing list