Module: wine Branch: master Commit: 9204569061bf7ea814fa3014ecaac03d21007050 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9204569061bf7ea814fa3014e...
Author: Jan Sikorski jsikorski@codeweavers.com Date: Fri Mar 4 18:12:56 2022 +0100
wined3d: Add poll_in_cs field to wined3d_query().
Its eventual purpose is to allow for skipping the poll list mechanism by calling query_poll() in the application thread. In this patch it is only used for when we don't have a separate CS thread.
Signed-off-by: Jan Sikorski jsikorski@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/cs.c | 6 +++++- dlls/wined3d/query.c | 21 ++++++++++----------- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index b150f1ae097..ce297d724f2 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2312,8 +2312,12 @@ static void wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data)
poll = query->query_ops->query_issue(query, op->flags);
- if (!cs->thread) + if (!query->poll_in_cs) + { + if (op->flags & WINED3DISSUE_END) + InterlockedIncrement(&query->counter_retrieved); return; + }
if (poll && list_empty(&query->poll_list_entry)) { diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c index 7b6c2325523..093b412bf18 100644 --- a/dlls/wined3d/query.c +++ b/dlls/wined3d/query.c @@ -143,6 +143,7 @@ static void wined3d_query_init(struct wined3d_query *query, struct wined3d_devic query->data = data; query->data_size = data_size; query->query_ops = query_ops; + query->poll_in_cs = !!device->cs->thread; list_init(&query->poll_list_entry); }
@@ -469,23 +470,21 @@ HRESULT CDECL wined3d_query_get_data(struct wined3d_query *query, return WINED3DERR_INVALIDCALL; }
- if (query->device->cs->thread) + if (query->counter_main != query->counter_retrieved + || (query->buffer_object && !wined3d_query_buffer_is_valid(query))) { - if (query->counter_main != query->counter_retrieved - || (query->buffer_object && !wined3d_query_buffer_is_valid(query))) - { - if (flags & WINED3DGETDATA_FLUSH && !query->device->cs->queries_flushed) - query->device->cs->c.ops->flush(&query->device->cs->c); - return S_FALSE; - } - if (query->buffer_object) - query->data = query->map_ptr; + if (flags & WINED3DGETDATA_FLUSH && !query->device->cs->queries_flushed) + query->device->cs->c.ops->flush(&query->device->cs->c); + return S_FALSE; } - else if (!query->query_ops->query_poll(query, flags)) + else if (!query->poll_in_cs && !query->query_ops->query_poll(query, flags)) { return S_FALSE; }
+ if (query->buffer_object) + query->data = query->map_ptr; + if (data) memcpy(data, query->data, min(data_size, query->data_size));
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e21c4e6507b..b6f2cf060d4 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1955,6 +1955,7 @@ struct wined3d_query
GLuint buffer_object; UINT64 *map_ptr; + bool poll_in_cs; };
HRESULT wined3d_query_gl_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent,