[OpenJDK 2D-Dev] CR 7029934 : Xrender: Text is truncated with 64 bit Linux JRE

Jim Graham james.graham at oracle.com
Thu Mar 31 22:39:03 UTC 2011

Caveat - I don't have the source code for XRender handy to check, but...

Since the request does not return any data it wouldn't require a round 
trip anyway, at most it would require a flush.  (Note that X11 errors 
are asynchronous, if a request causes an error you find out some time in 
the future via a callback and they give you a request number for 
reference which you were supposed to have remembered if you cared to 
figure out what caused it.)

X11 typically uses a fixed sized buffer that gets autoflushed as needed. 
  Most requests in the core protocol are plural requests and so back to 
back equivalent Xlib calls simply append their work onto the previous 
request if there is still room in the buffer.  When there is no more 
room in the buffer, it is flushed whether or not the current request is 
done (i.e. if the Xlib call refers to multiple independent pieces of 
data, like XFillRectangles() then it will put as many in the buffer as 
fit, flush it, and keep going until it handles all of the copies you 
gave it).

Some versions of Xlib support flushing the buffer and writing the raw 
buffer you hand the request back to back so that long requests can be 
done in one 2-buffered chunk, though.  But, those tend to be the 
typically large requests like sending image data over.  I'm not sure 
they bother with that kind of technique for things like an 
"XFillRectangles" request where the size of the rectangle list can be 
easily split up and done incrementally.

So, not having seen the actual implementation I can't contradict what 
you say, but historically they've used a number of techniques that would 
not require it to be true.  Breaking up the XRenderLib requests into 
multiple calls may or may not have any effect on how many Xlib buffers 
get flushed...


On 3/31/2011 3:24 PM, Phil Race wrote:
> If there's any latency at all in the call to Xrender such as a server
> round trip then that would be much slower, so it seems safer to
> do it as it is now.
> -phil.
> On 3/31/2011 3:16 PM, Jim Graham wrote:
>> Is there a need to free all of the glyphs in a single call? Perhaps
>> you could just convert and free up to N at a time where N is the size
>> of your stack allocated array?
>> ...jim
>> On 3/31/2011 1:31 PM, Phil Race wrote:
>>> On 3/31/2011 12:07 PM, Phil Race wrote:
>>>> So .. I took the liberty of revising the fix :
>>>> http://cr.openjdk.java.net/~prr/7029934/
>>>> - In the 32 bit case we now avoid stack or malloc allocation -
>>>> basically
>>>> doing what the code was doing previously.
>>>> - In the 64 bit case we use the stack up to 256 glyphs (maybe this is
>>>> too much
>>>> as its going to be 256*8 = 1Kbytes?) and malloc above that. I could
>>> Duh! That's 2Kbytes .. I think I'll dial this back to maybe 64 glyphs =
>>> 512 bytes
>>> before I push.
>>> -phil.

More information about the 2d-dev mailing list