[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