Closed Bug 193849 Opened 22 years ago Closed 18 years ago

Move 'opacity' handling down into GFX

Categories

(Core :: DOM: Core & HTML, defect)

defect
Not set
normal

Tracking

()

RESOLVED INVALID

People

(Reporter: zbraniecki, Assigned: roc)

References

(Blocks 1 open bug, )

Details

(Keywords: perf, testcase)

Attachments

(1 file)

I checked my results on http://alladyn.art.pl/gandalf/MozillaTests/dynl-c31.html with new machine. Athlon 1.8, Windows XP, GeFroce4, 512 DDR. Quite fast machine. But at this test, Mozilla still render Opacity changes with full redraw, while IE6 even on Athlon 700 do it smoothy. Also we're much slower than IE in Opacity drawing and we take much more processor power. Actual result: Mozilla render opacity animation slow and chopped Best result: Mozilla render opacity animation smoothly, fast, and without bothering processor (too much)
Keywords: perf
Blocks: 21762
Keywords: testcase
Summary: -moz-opacity doesnt animate smoothy → -moz-opacity doesnt animate smoothly
mine
Assignee: jst → roc+moz
In case anyone cares, I profiled this testcase once. The largest chunk of time (something like 60-70%) was spent in nsBlender ("blend24" or whatever the function is called). I somehow suspect that our blending algorithm doesn't scale well to many objects (nonlinear in the number of objects), and the 200 divs here give it grief.
The algorithm is linear in the sum of the sizes of the translucent objects. So its scaling properties are about optimal. It is slow, though. We can fix that. In fact, I think I'll morph this bug into the changes required to fix it. Essentially what I want to do is to move all the cross-platform code that manipulates offscreen pixmaps down into GFX. The places where we currently use offscreen pixmaps will turn into explicit GFX APIs that can be reimplemented with platform-specific optimizations where possible: DOUBLE BUFFERING: Add explicit BeginRendering()/EndRendering() APIs to nsIRenderingContext. It will be up to GFX to decide when double buffering is needed and to implement double buffering whenever it is needed. GROUP OPACITY: Add BeginFilteredGroup(nsFilter,PRBool aGroupIsOpaque)/EndFilteredGroup(nsFilter) APIs to nsIRenderingContext. For now nsFilter will just contain one opacity value. GFX will have to maintain a stack of rendering buffers to contain the state of nested groups. WINDOW ALPHA CALCULATION: No new APIs required. nsIRenderingContext::EndRendering() will compute the alpha values and update the window if necessary. I think the best approach is first to sink the existing view manager code into some shared GFX code, which every toolkit will use at first. I'll do that here. Then we can get to work. For Windows we can specifically optimize the blending of opaque groups by calling AlphaBlend() instead of doing it by hand. (In the testcase here, the blended DIVs are opaque.) For all x86 platforms we could improve the nsBlender code for all cases (including blending non-opaque groups) by using MMX. (I have looked at the MMX instruction set and it seems to be doable.)
Summary: -moz-opacity doesnt animate smoothly → Move 'opacity' handling down into GFX
fwiw, I just retested with that testcase and varying the number of divs, and opacity times are indeed linear. So just ignore me. ;)
Please do not forge that not all of our supported gfx modules support alpha channel, offscreen surfaces etc. (for example gfx/src/ps/ does not support any of these features). IMHO there should be a (non-static!!) method in gfx/ to query an initalised nsIDeviceContext whether the requested object instance supports one of the following features: - Alpha blending - Alpha mask (e.g. 1bit alpha channel) - Offscreen surfaces
No, I haven't forgotten this :-). > - Alpha blending > - Alpha mask (e.g. 1bit alpha channel) > - Offscreen surfaces Eventually offscreen surfaces are not going to be exposed outside of GFX so that's not going to be an issue. If your GFX implementation can't do group filters (e.g., group alpha blending), then it will just have to do the best it can. For group alpha blending that could mean just ignoring the alpha blending and painting opaquely instead, or it could mean dithering the alpha value into a mask used for painting.
Will this also fix bug 195883 ?
*** Bug 195883 has been marked as a duplicate of this bug. ***
Robert O'Callahan wrote: > Eventually offscreen surfaces are not going to be exposed outside of GFX so > that's not going to be an issue. Having support for using offscreen surfaces outside gfx may be a nice-to-have thingie - it would would have lots of possible good uses... :)
> it would would have lots of possible good uses like what?
> > it would would have lots of possible good uses > like what? Creating 'snapshots' of the current page, for thumbnail generation? I know of several embedding customers who will want this in the long run.
*** Bug 179155 has been marked as a duplicate of this bug. ***
Blocks: 179155
fwiw, compiling with SSE flag seems to improve perf by 5% with both opacity tests (given the fact all the other tests performed a little worse). Tests with Firebird 20030901 on a PIII, details here: http://forums.mozillazine.org/viewtopic.php?t=22830 comment 2 was mentioning MMX could speed up things and, as far as I understand (not an asm specialist), MMX can be considered as a "subset" of SSE.
I think I see this perf problem with linux also. For exemple, on this testcase http://electroide.hostrocket.com/opacity.xhtml , where opacity is changed with an :hover.
+vote I recently designed a page that uses opacity heavily, and it is SLOW. This bug seems to have become stagnant, but I think that it would be a good idea to get it resolved, especially if one of the platforms that Mozilla (Firefox) rides on is that it renders things FAST. Mozilla's opacity rendering is certainly NOT FAST.
vote++; for me too. Again I figured I start making use of our CSS3 friend "opacity" since it became enabled as of Mozilla 1.7b. However, should a page start using many elements with opacity and in conjunction with PNGs (with alpha) things can very much slow to a crawl under FireFox 1.0PR (Mozilla/5.0 (Windows; U; Windows NT 5.2; rv:1.7.3) Gecko/20040913 Firefox/0.10). Under my nightly build of SVG enabled Mozilla 1.8a4 (Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8a4) Gecko/20040921), there is a good improvement from I guess the usage of GDI+ (as per Bug 207146 ... https://bugzilla.mozilla.org/show_bug.cgi?id=207146) but still a rather jittery experience.
Flags: blocking1.8a4?
Flags: blocking1.7.x?
Flags: blocking1.8a4?
Flags: blocking1.8a4-
Flags: blocking1.7.x?
Flags: blocking1.7.x-
OS: Windows XP → All
Hardware: PC → All
Attached file Original test-case attached (deleted) —
A "local" copy of the document retrieved via The Way Back Machine.
Opacity handling is now done within Cairo, and nsBlender is gone, so there doesn't seem to be much point to keeping this open.
Status: NEW → RESOLVED
Closed: 18 years ago
Resolution: --- → INVALID
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: