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

Jan Sikorski jsikorski at codeweavers.com
Wed Nov 24 08:36:44 CST 2021



> On 24 Nov 2021, at 15:27, Henri Verbeet <hverbeet at gmail.com> wrote:
> 
> On Tue, 23 Nov 2021 at 15:28, Jan Sikorski <jsikorski at codeweavers.com> wrote:
>>>> -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?
>> 
> I guess what it comes down to is whether there's any reason for the
> wined3d_cs_run_priority_callback() scheme to exist. In the case of
> Vulkan queries, those would be polled from application threads after
> this series of patches, so the CS poll list would just be empty, and
> as far as I'm aware it doesn't add much overhead in that case. As far
> as I can tell, the wined3d_cs_run_priority_callback() scheme is not a
> requirement for polling Vulkan queries from application threads. Then,
> for the GL backend, when we have ARB_query_buffer_object, the OpenGL
> occlusion query scheme could be extended to other query types if
> needed. So that mostly leaves OpenGL without ARB_query_buffer_object
> where the CS poll list would need to be used. If the
> wined3d_cs_run_priority_callback() scheme is more efficient in those
> cases, or perhaps equally efficient but less complicated, etc., that's
> would of course be worth it. On the face of it though, that doesn't
> appear to be the case? (And the background here is that the CS poll
> list was introduced as an optimisation over a scheme not entirely
> unlike the one in this patch, although before the introduction of
> WINED3D_CS_QUEUE_MAP and ARB_query_buffer_object.)

Yes, that’s what I figured today too. Whatever ends up happening with the GL queries, it should work for this series.

Thanks,
- Jan


More information about the wine-devel mailing list