[PATCH 3/5] wined3d: Store FLUSH flag in the query object.
Henri Verbeet
hverbeet at gmail.com
Wed Sep 6 05:26:32 CDT 2017
On 6 September 2017 at 01:39, Matteo Bruni <mbruni at codeweavers.com> wrote:
> So it can be used in the CS thread's query polling. Passing the
> appropriate flag to glClientWaitSync() is potentially lighter on
> performance than a separate, explicit glFlush().
Maybe. It would be debatable once there are multiple queries in-flight.
> @@ -389,8 +389,8 @@ HRESULT CDECL wined3d_query_get_data(struct wined3d_query *query,
> }
> else if (query->counter_main != query->counter_retrieved)
> {
> - if (flags & WINED3DGETDATA_FLUSH)
> - wined3d_cs_emit_flush(query->device->cs);
> + if (flags & WINED3DGETDATA_FLUSH && !(query->flags & WINED3DGETDATA_FLUSH))
> + InterlockedExchange((LONG *)&query->flags, flags);
Shouldn't the flag be cleared again when the query is restarted?
How about the following:
- wined3d_query_get_data() emits a flush when the counters don't
match, "flags" contains WINED3DGETDATA_FLUSH, and query->flushed is
FALSE.
- wined3d_cs_exec_flush() sets query->flushed for all queries on
cs->query_poll_list.
- query->flushed is cleared when a query is removed from cs->query_poll_list.
Would that work? It would leave a small window between
wined3d_cs_emit_flush() and wined3d_cs_exec_flush() that could
probably be avoided by checking in wined3d_query_get_data() if any
queries were issued since the last flush. Not sure whether that's
worth it.
Alternatively, we could only do the latter. I.e., set
cs->queries_flushed in wined3d_cs_emit_flush(), and clear it in
wined3d_cs_emit_query_issue(). That wouldn't prevent all redundant
flushes, but it would help for applications calling
wined3d_query_get_data() in a tight loop.
More information about the wine-devel
mailing list