Closed Bug 651469 Opened 13 years ago Closed 13 years ago

Scrolling up renders page unreadable (X11 with GL layers)

Categories

(Core :: Graphics, defect)

x86_64
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: bjacob, Assigned: mattwoodrow)

References

()

Details

Attachments

(2 files, 1 obsolete file)

Here on linux x86-64, proprietary NVIDIA driver, with layers.acceleration.force-enabled=true, scrolling is completely broken on this page:

http://zrusin.blogspot.com/
To be more precise, the problem seems to be only/mostly with scrolling up, as opposed to scrolling down.
Summary: Scrolling renders page unreadable (X11 with GL layers) → Scrolling up renders page unreadable (X11 with GL layers)
The timing makes it plausible that this might be a regression from bug 640082, but I haven't verified this.
Blocks: 640082
Interestingly this happens when scrolling up the page (moving pixels down on the backing surface). With Image surfaces copying up is the problem, so I guess this means our internal data is Y-inverted.

If this ends up being a bottleneck we could try detect the flip (is it always the case for X surface?) and only allocate a temporary if we need one.

XCopyArea can handle self copies without manual intervention, but it is apparently rather slow. See http://lists.freedesktop.org/archives/cairo/2009-June/017290.html
Attachment #529895 - Flags: review?(roc)
I actually think that gfxASurface::MovePixels should use the safe, copying version by default, and a "fast" self-copy should be used in each backend where we know it works. I think gfxWindowsSurface and gfxQuartzSurface can use the fast implementation; gfxImageSurface already has its own implementation.
Oh, I guess D2D can use the fast version too.

A protected helper method in gfxASurface could implement the direct self-copy so each subclass only needs a few lines of code to use it.
Sure, works for me.
Attachment #529895 - Attachment is obsolete: true
Attachment #529895 - Flags: review?(roc)
Attachment #529911 - Flags: review?(roc)
Comment on attachment 529911 [details] [diff] [review]
Add FastMovePixels to gfxASurface and use it where appropriate

Review of attachment 529911 [details] [diff] [review]:
Attachment #529911 - Flags: review?(roc) → review+
Do you have a testcase for this that could be turned into a reftest?
Fails without the patch, passes with.
Attachment #529922 - Flags: review?(roc)
Comment on attachment 529922 [details] [diff] [review]
Add new scrolling reftest that scrolls backwards

Review of attachment 529922 [details] [diff] [review]:

lovely!
Attachment #529922 - Flags: review?(roc) → review+
http://hg.mozilla.org/mozilla-central/rev/a0fd33b098f6
http://hg.mozilla.org/mozilla-central/rev/e861aabf1631
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Assignee: nobody → matt.woodrow+bugzilla
(In reply to Matt Woodrow (:mattwoodrow) from comment #3)
> XCopyArea can handle self copies without manual intervention, but it is
> apparently rather slow. See
> http://lists.freedesktop.org/archives/cairo/2009-June/017290.html

Quoting that post:
> When an overlapped XCopyArea is issued - as is typical for a short
> scroll in any direction - XCopyArea breaks up the request into
> individual scanline fetches and puts.  This produces correct results,
> but because each scanline is done via two full Pixman call chains, it is
> hideously slow.  By that I mean that it can be about a third of the
> speed of a full copy-out followed by copy-back.

FWIW it looks like this is describing the fb implementation, the one used when the ddx graphics driver doesn't provide it's own implementation.
Blocks: 715668
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: