Module: wine Branch: master Commit: 97eb359588725f6d1c38146a606856b50588dbdf URL: http://source.winehq.org/git/wine.git/?a=commit;h=97eb359588725f6d1c38146a60...
Author: Henri Verbeet hverbeet@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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; }