We are making steady progress on WebRender and its Gecko integration. This newsletter doesn’t show much of the higher level work happening in the background, so I’ll drop a few notes about them here:

I have been working for a while on getting the architecture in place to respect frame consistency which is a rule that in a nutshell says “Two changes happening in the page within the same turn of the JS event loop (say, move a DOM element and paint into a canvas), should be visible in the same frame”. The infrastructure for this is now mostly in place and there is some work remaining to make sure that changes that belong to a given transaction are effectively added to the transaction rather than sent to the renderer with a asynchronous channels.

There is also an ongoing investigation about how to reduce the overhead of serializing and deserializing very large display lists. In the process this investigation bugs were filed in WebRender, Gecko, Serde, rustc, all the way to llvm itself. Lots of fun.

On WebRender’s side we are looking into asynchronously building scenes so that the smoothness of scrolling and animations are never impacted by it, and investigating new optimizations to move more primitives to the opaque pass and more aggressively take advantage of z-culling.

Notable WebRender changes

Jeff improved the performance of display lists serialization and deserialization in #1799 and #1830 (hasn’t landed in Gecko yet).

Markus worked around yet another driver bug on Mac.

Nical improved the quality of the border corner antialiasing.

Notable Gecko changes

WebRender display list creation speedups: WebRender UserData property lookup optimized. We preallocate the buffer used for display list building. Avoid a completely unnecessary copy of the display list. Gankro Removed text layers and the client side glyph cache (hasn’t landed in Gecko yet). Jeff removed largely unneeded call to nsDisplayBackgroundColor::GetLayerState. The old layer-full code is gone.

We support doing empty transactions properly.

Gankro prevented zero-width space characters to cause the fallback rendering path.