On Jun 29, 2010, at 12:27 AM, Jesse Barnes wrote:

In GL code, we have two subsystems using IgnoreClient these days: GLX
and DRI2.

GLX uses it to suspend clients while the server is VT switched away
(not sure why, maybe some drivers can't handle it?).

DRI2 uses it to implement swap throttling and various GLX extensions
and DRI2 protocol requests.


Jesse,

do we really need IgnoreClient() for throttling in DRI2?

If i remember correctly, the DRI2 requests i've seen are all like this:

1. Some request (DRI2GetBuffersWithFormat() / DRI2SwapBuffers() / glXWaitForMscOML() / glXWaitForSBCOML(). 2. Request needs to wait for some event, either a scheduled vblank event to be delivered from the kernel, or a swap to complete. 3. Server responds to the client which was waiting for a xreply in response to completion of the request.

The client's calling thread always has to wait for a reply from the server before it can continue doing anything, so that thread would block anyway in xlib, waiting for a xreply from the server at step 3.

Because we only have one "wait slot" per drawable, we block the whole xdisplay connection via IgnoreClient() to prevent other threads in the same client from issuing such "blocking" requests to the same drawable - it would overflow our single wait slot.

This implementation isn't safe if multiple display connections address a single drawable, e.g., 1 connection per client thread. It also doesn't allow to handle multipe or parallel outstanding requests, something that would be useful with some of the new DRI2 protocol requests.

If we could replace that single "wait slot" with one wait list per drawable and protocol request (1 list for glXWaitForMscOML, 1 list for glXWaitForSbcOML and maybe 1 list for swap related throttling), then we probably wouldn't need to block the connection via IgnoreClient at all and could have multiple outstanding / parallel requests.

What i assume but didn't check is that xlib doesn't have a problem with getting replies out of sequence, e.g., getting a reply to a request with seq nr 15 before another reply with nr 12 on the same connection? Just neccessary for the sequence number in the reply matching the corresponding sequence number from the request? xlib doesn't time out if a request doesn't quickly get a reply?

If we could implement such wait lists then we could ignore IgnoreClient and solve the multi-threading / multiple drawable issues i believe exist.

-mario

*********************************************************************
Mario Kleiner
Max Planck Institute for Biological Cybernetics
Spemannstr. 38
72076 Tuebingen
Germany

e-mail: mario.klei...@tuebingen.mpg.de
office: +49 (0)7071/601-1623
fax:    +49 (0)7071/601-616
www:    http://www.kyb.tuebingen.mpg.de/~kleinerm
*********************************************************************
"For a successful technology, reality must take precedence
over public relations, for Nature cannot be fooled."
(Richard Feynman)

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to