[Xr] Can the xrs argument be removed?

Bill Spitzak spitzak at d2.com
Thu May 22 18:34:44 PDT 2003

On Thursday 22 May 2003 02:45 pm, Owen Taylor wrote:

> You can write
>  void MyCoolXrDemo (XRenderState *xrs);
> 100% as easily.

My problem is not with this extra argument, but in getting the value of this 
extra argument from deep inside a number of nested calls in some existing 
software that was not written to pass this extra argument down.

>  - Possible performance if you can get the context fast enough...
>    pthread local storage is relatively slow, but the __thread variable
>    extension that has been showing up recently for GCC/GLibc is
>    likely faster than argument passing.

I would think the main possible performance improvement is if there is code 
that must be executed when a state changes. It removes the overhead of a "if 
(xrs != previous_xrs)" test in every call, and maybe more expensive tests if 
this is supposed to be thread-safe. I suppose also it removes one value being 
copied to a register or the stack for each call. Conversely it adds all the 
overhead of an entire call when the state is changed, and likely software 
will call XrSetState more often than necessary. So my guess is that 
performance is not really going to be any better or worse.

>  - Trouble mapping the API into object oriented languages.
>    And while Xr may be a C API, most people will probably
>    being using it from Python, Java, C#, etc in the long
>    term.

This may be true if you have objects that are ready to draw all the time. 
However in my experience a typical toolkit has a draw() method that the main 
toolkit code calls when drawing is needed. In this case it is easier for the 
toolkit to defer creation and management of the XrState until it is ready to 
call this method. Also there is probably the overhead of adding a this->xrs() 
call to every Xr call, C++ compilers currently are probably not smart enough 
to realize that this pointer does not change when other methods on this are 
called. If you eliminate that call by "wrapping" all the Xr calls then you 
have the problem that the user cannot call any new functions in Xr until the 
toolkit is updated.

Also an XrState may be judged too expensive to have a different one for each 
object, in which case this has no advantage for OO programming at all.

>    What does XrFill() look like if there is no XrState object?

Just like that: XrFill()

>  - Less obvious operation, especially if you want to mix
>    operations on multiple surfaces.

This I would admit is the biggest problem. People may write code that calls 
XrSetState many many times and completely destroy performance if Xr was 
written to assume it will be called rarely.

 spitzak at d2.com

More information about the cairo mailing list