ShadowFB + Composite + RandR + ?

Thomas Winischhofer thomas at winischhofer.net
Tue Sep 27 08:09:51 PDT 2005


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Keith Packard wrote:
> On Tue, 2005-09-27 at 10:51 +0200, Thomas Winischhofer wrote:
>>However, if a composite manager is running, xf86SetRootClip(false)
>>*does* cause a few calls to pScreen->PaintWindow[Border|Background](),
>>which - due to shadowfb - end up in the driver's refresh routine.
> 
> 
> That's wrong...


Good to see that you agree :)


>>Not only should this IMHO not happen at all (after all,
>>setRootClip(false) is supposed to "disable rendering to the screen"),
>>the regions (boxes) that are handed to the driver's refresh function
>>have illegal coordinates like (-1000, -976), (-1000, -986) and the like.
>>Apart from negative values, they sometimes also exceed the valid range
>>in both x and y directions.
> 
> 
> I have no idea why it would do this; I would assume that there's
> something broken in the composite wrappers.
> 
> A stack trace from within the offending functions might be illuminating.


I will try to find out more soon. The whole upper level stuff isn't
really my area of expertise...

In the meantime, I have analyzed the coordinates: It seems that, if the
composite manager is running, there is absolutely no clipping done to
the boxes handed to the refresh handler. If I move a window partly
outside, the coordinates of the boxes are not limited to the framebuffer
dimensions.

As a consequence, the following happens here for example:

I run KDE with kicker in "auto-hide"-mode so that it "scrolls" itself
outside the visible screen whenever the mouse is not over it.

Right after EnableDisableFBAccess(FALSE) and *within* setRootClip(false)
- - so: BEFORE RandR has changed the pScreen structure to the new
dimensions!!! - I receive

1) via PaintWindow() the absolute coordinates of the kicker-window(s)
(it consists of a number of subwindows): My screen is 1280x800, and I
receive like eg.

  x1   x2    y1   y2
 128  1152   800 847

That's where kicker is in hidden state. (128 and 1152 because it doesn't
use the whole screen's width.)

2) later, after all the kicker windows are "redrawn", comes the
following, again via PaintWindow() (with 5 boxes at once):

  x1    x2    y1     y2
  3     4    435    461
  95    4    435    461
  3     4    461    461
  95    4    461    461
  3     4    462    461

Except the first one, all are illegal. They seem to relate to my conso?e
window, which is at the top left screen corner.

A few calls later, a 38-box PaintWindow():
 4    658     0      1
 3    658     1      1
 2    658     2      1
 1    658     3      1
 0    658     4      1

and all of the following have y coordinates whose y1 is bigger than y2.

3) The very last is

  0  1280     0    800

which seems to be the root window.

At this point xf86SetRootClip(FALSE) and EnableDisableFBAccess(FALSE)
return.

Now RandR sets its new screen dimensions. My example is a 90 degree
rotation.

At the end, RandR calls EnableDisableFBAccess(TRUE), which leads to a
xf86SetRootClip(TRUE). This leads to

1) PaintWindow (1 box):

  -1000 -979   -1000 - 986


2) PaintWindow (1 box):

  -1000 -978   -1000 - 978

3) kicker redraw. Kicker doesn't understand that the display is rotated,
so it still paints itself at 128x801 (which is now near the middle of
the rotated screen). But that's kicker's fault. Bad RandR signal handler.

4) Then the following PaintWindow() comes:

  3     4    435    461
  95    4    435    461
  3     4    461    461
  95    4    461    461
  3     4    462    461

Looks familiar, doesn't it...

5) Surprise: Now again that 38-box PaintWindow() arrives, with the exact
same coordinates as above.

Then xf86SetRootClip(TRUE) returns, and so does EnableDisableFBAccess(TRUE).

At this point EXA/XAA re-init their pixmap cache/offscreen memory managers.

Now the screen dimension is 800x1280.

After a few Composite() calls with legal coordinates, bummer....

ShadowPolyFillRect comes along with

  x1   x2    y1    y2
 599  1280   0    800

A few CopyAreas() later, I get a Composite() call with

  -1000 -979   -1000 -986

And again kicker (which I assume from the coords):

  128   1152    800  847

and lots more calls with such coordinates.

(Why is x2 1152, when the screen is only 800 in width? Shouldn't that be
clipped by anybody?)

After that, another Composite():

  1031  1053   813  835

seems to relate to kicker's window as well (which, as we know, still at
800-847 on the y axis)

Now I move my console window beyond the left edge of the screen:

I get a few PaintWindow() calls with coordinates like

   -308 332   400  415

I worked-around this now by checking my refresh box, but something is
really odd here.

Perhaps I should mention that everything looks entirel ok on the rotated
screen - no graphics distortions whatsoever; except, of course, kicker
which is located right in the middle.

Thomas

- --
Thomas Winischhofer
Vienna/Austria
thomas AT winischhofer DOT net	       *** http://www.winischhofer.net

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFDOWC/zydIRAktyUcRAhLrAJ44ggh6zbFBQM72oYzhzPjXzKZgfgCfapOp
mCbKhqAcpHCIvlOlSVpmdb4=
=d4kC
-----END PGP SIGNATURE-----



More information about the xorg mailing list