[PATCH 07/12] wined3d/context: Add context framework for D3DQUERY_TIMESTAMP* queries.

Adam Martinson amartinson at codeweavers.com
Wed May 4 12:15:48 CDT 2011


---
 dlls/wined3d/context.c         |   80 ++++++++++++++++++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |   17 ++++++++
 2 files changed, 97 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 54fdafc..3c631ca 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -671,6 +671,66 @@ void context_free_event_query(struct wined3d_event_query *query)
     context->free_event_queries[context->free_event_query_count++] = query->object;
 }
 
+/* Context activation is done by the caller.
+ * Only called when GL_ARB_timer_query is supported. */
+void context_alloc_timestamp_query(struct wined3d_context *context, struct wined3d_timestamp_query *query)
+{
+    const struct wined3d_gl_info *gl_info = context->gl_info;
+    int i, n_new;
+
+    for (i = 0; i < query->n_ids && i < context->free_timestamp_query_count; ++i)
+        query->ids[i] = context->free_timestamp_queries[--context->free_timestamp_query_count];
+
+    if ((n_new = query->n_ids - i))
+    {
+
+        ENTER_GL();
+        GL_EXTCALL(glGenQueriesARB(n_new, &query->ids[i]));
+        checkGLcall("glGenQueriesARB");
+        LEAVE_GL();
+
+        if (TRACE_ON(d3d))
+        {
+            for (; i < query->n_ids; ++i)
+                TRACE("Allocated timestamp query %u in context %p.\n", query->ids[i], context);
+        }
+    }
+
+    query->context = context;
+    list_add_head(&context->timestamp_queries, &query->entry);
+}
+
+/* Context activation is done by the caller.
+ * Only called when GL_ARB_timer_query is supported. */
+void context_free_timestamp_query(struct wined3d_timestamp_query *query)
+{
+    struct wined3d_context *context = query->context;
+    int i;
+
+    list_remove(&query->entry);
+    query->context = NULL;
+
+    if (context->free_timestamp_query_count + query->n_ids >= context->free_timestamp_query_size)
+    {
+        UINT new_size = context->free_timestamp_query_size << 1;
+        GLuint *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_timestamp_queries,
+                new_size * sizeof(*context->free_timestamp_queries));
+
+        if (!new_data)
+        {
+            for (i = 0; i < query->n_ids; ++i)
+                ERR("Failed to grow free list, leaking query %u in context %p.\n", query->ids[i], context);
+            return;
+        }
+
+        context->free_timestamp_query_size = new_size;
+        context->free_timestamp_queries = new_data;
+    }
+
+    for (i = 0; i < query->n_ids; ++i)
+        context->free_timestamp_queries[context->free_timestamp_query_count++] = query->ids[i];
+}
+
 typedef void (context_fbo_entry_func_t)(struct wined3d_context *context, struct fbo_entry *entry);
 
 static void context_enum_surface_fbo_entries(IWineD3DDeviceImpl *device,
@@ -945,6 +1005,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
     const struct wined3d_gl_info *gl_info = context->gl_info;
     struct wined3d_occlusion_query *occlusion_query;
     struct wined3d_event_query *event_query;
+    struct wined3d_timestamp_query *timestamp_query;
     struct fbo_entry *entry, *entry2;
     HGLRC restore_ctx;
     HDC restore_dc;
@@ -981,6 +1042,13 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
         event_query->context = NULL;
     }
 
+    LIST_FOR_EACH_ENTRY(timestamp_query, &context->timestamp_queries, struct wined3d_timestamp_query, entry)
+    {
+        if (context->valid && gl_info->supported[ARB_TIMER_QUERY])
+            GL_EXTCALL(glDeleteQueriesARB(timestamp_query->n_ids, timestamp_query->ids));
+        timestamp_query->context = NULL;
+    }
+
     LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_destroy_list, struct fbo_entry, entry)
     {
         if (!context->valid) entry->id = 0;
@@ -1008,6 +1076,9 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
         if (gl_info->supported[ARB_OCCLUSION_QUERY])
             GL_EXTCALL(glDeleteQueriesARB(context->free_occlusion_query_count, context->free_occlusion_queries));
 
+        if (gl_info->supported[ARB_TIMER_QUERY])
+            GL_EXTCALL(glDeleteQueriesARB(context->free_timestamp_query_count, context->free_timestamp_queries));
+
         if (gl_info->supported[ARB_SYNC])
         {
             for (i = 0; i < context->free_event_query_count; ++i)
@@ -1037,6 +1108,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
 
     HeapFree(GetProcessHeap(), 0, context->free_occlusion_queries);
     HeapFree(GetProcessHeap(), 0, context->free_event_queries);
+    HeapFree(GetProcessHeap(), 0, context->free_timestamp_queries);
 
     if (restore_ctx)
     {
@@ -1531,6 +1603,13 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
 
     list_init(&ret->event_queries);
 
+    ret->free_timestamp_query_size = 4;
+    ret->free_timestamp_queries = HeapAlloc(GetProcessHeap(), 0,
+            ret->free_timestamp_query_size * sizeof(*ret->free_timestamp_queries));
+    if (!ret->free_timestamp_queries) goto out;
+
+    list_init(&ret->timestamp_queries);
+
     TRACE("Successfully created new context %p\n", ret);
 
     list_init(&ret->fbo_list);
@@ -1680,6 +1759,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
 out:
     HeapFree(GetProcessHeap(), 0, ret->free_event_queries);
     HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries);
+    HeapFree(GetProcessHeap(), 0, ret->free_timestamp_queries);
     HeapFree(GetProcessHeap(), 0, ret->draw_buffers);
     HeapFree(GetProcessHeap(), 0, ret->blit_targets);
     HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 5fb761d..78f070f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1017,6 +1017,15 @@ struct wined3d_event_query
     struct wined3d_context *context;
 };
 
+struct wined3d_timestamp_query
+{
+    struct list             entry;
+    struct wined3d_context *context;
+    int                     n_ids;
+    GLuint                  ids[3];
+};
+
+
 enum wined3d_event_query_result
 {
     WINED3D_EVENT_QUERY_OK,
@@ -1108,6 +1117,11 @@ struct wined3d_context
     UINT free_event_query_count;
     struct list event_queries;
 
+    GLuint *free_timestamp_queries;
+    UINT free_timestamp_query_size;
+    UINT free_timestamp_query_count;
+    struct list timestamp_queries;
+
     /* Extension emulation */
     GLint                   gl_fog_source;
     GLfloat                 fog_coord_value;
@@ -1205,6 +1219,8 @@ void context_alloc_event_query(struct wined3d_context *context,
         struct wined3d_event_query *query) DECLSPEC_HIDDEN;
 void context_alloc_occlusion_query(struct wined3d_context *context,
         struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
+void context_alloc_timestamp_query(struct wined3d_context *context,
+        struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN;
 void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
 BOOL context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device,
         UINT rt_count, struct wined3d_surface **rts, struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN;
@@ -1220,6 +1236,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, stru
 void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN;
 void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN;
 void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
+void context_free_timestamp_query(struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN;
 struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN;
 DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN;
 void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
-- 
1.7.1


--------------020407030507000107030307
Content-Type: text/x-patch;
 name="0008-wined3d-query-Add-support-for-D3DQUERY_TIMESTAMP-que.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
 filename*0="0008-wined3d-query-Add-support-for-D3DQUERY_TIMESTAMP-que.pa";
 filename*1="tch"



More information about the wine-devel mailing list