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) { /* 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 (oq->context) context_free_occlusion_query(oq); HeapFree(GetProcessHeap(), 0, query->extendedData); } HeapFree(GetProcessHeap(), 0, query); } return refcount; }
static ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) { IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface; ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->ref); ref = InterlockedDecrement(&This->ref); if (!ref) { /* 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 (This->type == WINED3DQUERYTYPE_EVENT) { struct wined3d_event_query *query = This->extendedData; if (query) wined3d_event_query_destroy(query); } else if (This->type == WINED3DQUERYTYPE_OCCLUSION) { struct wined3d_occlusion_query *query = This->extendedData; if (query->context) context_free_occlusion_query(query); HeapFree(GetProcessHeap(), 0, This->extendedData); } HeapFree(GetProcessHeap(), 0, This); } return ref; }
void wined3d_query_destroy(struct wined3d_query *query) { /* 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 (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); } HeapFree(GetProcessHeap(), 0, query); }
static void wined3d_query_destroy_object(void *object) { struct wined3d_query *query = object; #if defined(STAGING_CSMT) if (!list_empty(&query->poll_list_entry)) list_remove(&query->poll_list_entry); #endif /* STAGING_CSMT */ /* 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) { wined3d_event_query_destroy(wined3d_event_query_from_query(query)); } else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION) { struct wined3d_occlusion_query *oq = wined3d_occlusion_query_from_query(query); if (oq->context) context_free_occlusion_query(oq); HeapFree(GetProcessHeap(), 0, oq); } else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP) { struct wined3d_timestamp_query *tq = wined3d_timestamp_query_from_query(query); if (tq->context) context_free_timestamp_query(tq); HeapFree(GetProcessHeap(), 0, tq); } else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT || query->type == WINED3D_QUERY_TYPE_TIMESTAMP_FREQ) { HeapFree(GetProcessHeap(), 0, query); } else if (query->type == WINED3D_QUERY_TYPE_SO_STATISTICS) { HeapFree(GetProcessHeap(), 0, query); } else if (query->type == WINED3D_QUERY_TYPE_SO_OVERFLOW) { HeapFree(GetProcessHeap(), 0, query); } else { ERR("Query %p has invalid type %#x.\n", query, query->type); } }