[PATCH 1/3] wined3d: Remove poll list.

Jan Sikorski jsikorski at codeweavers.com
Tue Nov 23 08:28:09 CST 2021


Hi,

> On 23 Nov 2021, at 12:46, Henri Verbeet <hverbeet at gmail.com> wrote:
> 
> On Mon, 22 Nov 2021 at 13:46, Jan Sikorski <jsikorski at codeweavers.com> wrote:
>> 
>> Poll with callbacks from application threads instead.
>> 
>> Signed-off-by: Jan Sikorski <jsikorski at codeweavers.com>
>> ---
>> dlls/wined3d/cs.c              |  73 ++-------
>> dlls/wined3d/query.c           | 284 ++++++++++++++++++++++-----------
>> dlls/wined3d/wined3d_private.h |   6 +-
>> 3 files changed, 212 insertions(+), 151 deletions(-)
>> 
> I happen to know the background of this series of patches because of
> private conversations we've had, but for the benefit of both the
> commit message and the rest of the mailing list, please assume I
> don't. Why would we want to do this? What problem does this patch
> solve?

Right, I guess it could use some explanation.

> I also don't think it's ideal to lead with a patch removing the
> existing mechanism. The way we generally do these kinds of rewrites is
> to first introduce the new mechanism, then move users of the old
> mechanism over to the new mechanism, and only remove the old mechanism
> once it has become unused.

OK, I think this patch could be split into a couple more patches, so that removing the list goes after we can poll using the new way, with only a little intermediate mess.

>> -static void wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data)
>> +void wined3d_cs_run_priority_callback(struct wined3d_cs *cs, void (*callback)(void *object), void *object)
>> {
>> -    const struct wined3d_cs_query_issue *op = data;
>> -    struct wined3d_query *query = op->query;
>> -    BOOL poll;
>> +    struct wined3d_cs_callback *op;
>> 
>> -    poll = query->query_ops->query_issue(query, op->flags);
>> +    op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_MAP);
>> +    op->opcode = WINED3D_CS_OP_CALLBACK;
>> +    op->callback = callback;
>> +    op->object = object;
>> 
>> -    if (!cs->thread)
>> -        return;
>> +    wined3d_device_context_submit(&cs->c, WINED3D_CS_QUEUE_MAP);
>> +    wined3d_cs_finish(cs, WINED3D_CS_QUEUE_MAP);
>> +}
>> 
> The wined3d_cs_finish() call is effectively going to make polling
> queries synchronous, at least as far as WINED3D_CS_QUEUE_MAP is
> concerned. That doesn't seem desirable.

If we can’t call directly into OpenGL on the application thread reasonably, I’m not sure how much better can this get. Just removing the wined3d_cs_finish() and getting the result asynchronously may actually make it worse, if a game knows the queries should be done by the time it is called, it will probably just busy wait for it by calling GetData() repeatedly.
That said, I don’t think it is so bad, because for occlusion queries, which are the bulk I guess, we probably use the buffer method; and other users of WINED3D_CS_QUEUE_MAP are synchronous too, so it shouldn't clog unless there’s more threads involved. It ran well with the couple games I tested, so there’s that too, but supposedly we could hit a pessimistic case where it’s worse.. Do you have a better way in mind?

Thanks,
- Jan




More information about the wine-devel mailing list