EXA performance problem

Christoph Bartoschek bartoschek at or.uni-bonn.de
Mon Nov 28 07:49:55 PST 2011

Am 28.11.2011 10:35, schrieb Christoph Bartoschek:

> Now one has to look at
> (*pGC->ops->PolyRectangle)(pDrawable, pGC, nRects, pRects);

Here is what I see so far:

- damagePolyRectangle is called for 2044 rectangles.

- the damage region is computed it consists of about 1000 rectangles 
each time.

- miPolyRectangle is called.

- the function iterates over all rectangles and calls exaPolylines for 
each of them because most have only a width and height of 0

- exaPolylines calls ExaCheckPolylines.

We see that for each rectanlge ExaCheckPolylines is called. I have added 
timers to this function to see what costs time:

ExaCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
                   int mode, int npt, DDXPointPtr ppt)
   EXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
                 pDrawable, exaDrawableLocation(pDrawable),
                 pGC->lineWidth, mode, npt));

   exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);       // Step1: 55 s
   exaPrepareAccessGC (pGC);                             // Step2: 2.4 s
   pGC->ops->Polylines (pDrawable, pGC, mode, npt, ppt); // Step3: 2.4 s
   exaFinishAccessGC (pGC);                              // Step4: 2.2 s
   exaFinishAccess (pDrawable, EXA_PREPARE_DEST);        // Step5: 2.2 s

We see that exaPrepareAccess needs most of the time. Is that expected?

Inside we see that there are some region operations on the damage region 
in exaCopyDirty. As said before the damage region contains about 1000 
rectangles. So we have 2000 times several operations on 1000 rectangeles.

I think this explains the runtime.

Isn't it somehow possible to batch the rectangle drawing such that the 
region operations are not neccessary for each rectangle?

Isn't is possible to expand the damage region such that it contains less 

Is this still the correct list, or should I ask the EXA questions elsewhere?


More information about the xorg mailing list