The closer we get to shipping WebRender, the harder it is for me to take the time to go through commit logs and write the newsletter. But this time is special.

Yesterday we enabled WebRender by default on Firefox Nightly (🎉🎉🎉) for a subset of the users: Desktop Nvidia GPUs on Windows 10. This represents 17% of the nightly population. We chose to first target this very specific configuration in order to avoid getting flooded with driver bugs, and we’ll gradually add more as things stabilize.

Needless to say, this is a pretty exciting moment for the graphics team and everyone who contributed to WebRender, since we have been working on this project for quite a while. There are still a number of blocker bugs to fix before we can hit the beta population, and then some more to meet release quality. Nonetheless, shipping in nightly is huge step. Monitoring bug reports for the next few days will be interesting.

Notable WebRender changes

Glenn avoided allocating clip masks for clip rects in the same coordinate system.

Glenn avoided allocating clip masks for scale and offset transforms.

Gankro fixed backface-visibility in the presence of preserve-3d.

Nical added a mechanism to notify the embedded (Gecko) at different stages of the rendering pipeline.

Nical added some infrastructure for tracking the validity of the current frame and hit tester to avoid redundant work.

Emilio made dashed border look more like Gecko’s.

Glenn refactored the display list flattener for mix blend mode optimizations.

Kvark improved the recording infrastructure to generate test cases.

Nical moved the scene data structure to the scene builder thread in preparation for low priority command execution.

Nical implemented a system for processing low priority work without blocking high priority commands. This improves the scheduling of work from background tabs as well as better integration with Gecko’s tab-switching mechanism.

Glenn implemented rasterization with arbitrary coordinate roots. This fixed a bunch of correctness issue and will make it possible to do more caching of rendered content.

Emilio removed some useless allocations.

Emilio improved the rendering of very small dots.

Kvark refactored the border shader to avoid driver warnings.

Glenn fixed a bug with relative transforms.

Kvark added better checks for dual source blending support.

Dan added a simple border shader for solid borders, improving shader compile times for the common cases.

Emilio made the color modulation for groove and ridge borders more consistent with what is done in Gecko.

Kvark avoided signed integer divisions in the shaders.

Lee allowed blob images to query font instance data.

Glenn fixed the order of compositing operations withing a stacking context.

Glenn improved the accuracy of the clipper code.

Glenn fixed backface visibility in nested stacking contexts.

Glenn improved the 3d transform support.

Kvark used the hardware for perspective division.

Kvark fixed perspective interpolation in the brush blend shader.

Glenn fixed a bug causing redundant clips to be drawn.

Dan added support for shadows for border and image brushes.

Glenn added some fixes and optimizations for clips in different coordinate systems.

Lee moved font addition/deletion off the render backend thread.

Glenn refactored clip chains to allow rasterizing pictures in local space.

Glenn simplified how local rects are accumulated in 3d contexts.

Glenn simplified determining if batches can be merged.

Glenn fixed a bug happening when a brush’s mask kind changes during scrolling.

Lee added color masking support for images.

Glenn optimized lolcal rects calculation during culling.

Patrick added a debugging feature to visualize overdraw.

Nical fixed a crash caused by huge border widths.

Kvark fixed near plane splitting.

Kvark reduced the amount of data transferred to the GPU in some cases.

Nical reduced the memory consumption of outdated images in the texture cache.

Nical fixed a crash caused by huge border radii.

Kvark avoided unnecessary transform copies.

Kvark removed some unnecessary allocations.

Kvark avoided rendering primitive runs of invisible clip nodes.

Notable Gecko changes

Jeff reduced the size of the blob command list by skipping out of bound items.

Jeff sped up filters in blob images by only filtering the portion we need instead of the entire surface.

Emilio added an environment variable to force pre-caching shaders.

Patrick added a preference to show overdraw.

Emilio avoided some useless allocations when building the display list.

Lee avoided spending time populating cairo scaled fonts when we don’t target cairo.

Andrew fixed a bug with disappearing background images.

Jeff fixed a blob image invalidation bug insde masks and filters.

Andrew fixed a crash.

Jeff also fixed a crash.

Lee improved and fixed the way we deal with missing glyphs.

Sotaro fixed some issues with the clear color.

Nical cleared memory resources when the driver reports a memory purge.

Sotaro fixed a crash

Sotaro fixed another crash.

Jeff fixed yet another crash.

Lee also fixed a crash.

Oh and another one.

Jeff further reduced the size of blob image command lists.

Nical added the dirty rect optimization for async blobs.

Sotaro forwarded logs to the right place on android.

Jeff improved the handling of foreign objects in blob invalidation (24% performance improvement on the tscrollx test).

Jeff hooked up invalidation testing.

Markus made CSS filters in SVG elements not use the fallback.

Kats fixed duplicated window controls on Mac.

Andrew fixed the tracking of the dirty rects of an image used by several tabs.

Matt fixed some of the recording infrastructure used by our performance benchmarks with webrender.

Sotaro fixed other pieces of performance recording infrastructure.

Andrew fixed an invalidation bug with animated images.

Kats fixed a leak.

Sotaro reduced the latency of video frames.

Lee reused scaled fonts across blob image recordings.

Jeff made blob images more robust against corrupted data.

Henrik added support for the -moz-crips-edges property for canvas.

Henrik added support for the -moz-crips-edges property for images.

Henrik added support for the -moz-crips-edges property for video.

Lee fixed a text clipping bug.

Jeff fixed an issue with image sampling.

Enabling WebRender in Firefox Nightly

In about:config set “gfx.webrender.all” to true,

restart Firefox.

Reporting bugs

The best place to report bugs related to WebRender in Gecko is the Graphics :: WebRender component in bugzilla.

Note that it is possible to log in with a github account.