Greetings! 16th newsletter inbound, with some exciting fixes. Oh yeah, fixes again and again, and spoiler alert: this will remain the main topic for a little while.

So what’s exciting about it this time around? For one, Heftig, Martin Stránský and Snorp figured out what was causing rendering to be so broken with nvidia GPUs on Linux (and fixed it). The problem was that when creating a GLX visual, Gdk by default tries to select one that does not have a depth buffer. However, WebRender relies on the depth buffer for rendering opaque primitives.

The other fix that I am particularly excited about is brought to you by Kvark, who finally ended the content flickering saga on Windows after a series of fixes and workarounds in our own code and upstream in ANGLE.

Notable WebRender changes

Simon added support for rendering with ANGLE in wrench on Windows. This will let us run tests in a configuration that better matches what users run.

Kvark fixed a division by zero in the brush_blend shader.

Glenn fixed some box-shadow artifacts.

Lee fixed the way we clear font data when shutting down.

Glenn avoided attempting to render a scene if the requested window dimension are unreasonably large.

Nical avoided re-buiding the scene when updating dynamic properties (it had already been done by Glenn, but accidentally backed out).

Glenn refactored the way pictures and brushes are stored to allow more flexibility.

Kats and Nical updated the tidy CI script, and fixed an avalanche of followup issues (2), (3), (4).

Martin simplified the clipping API.

Glenn fixed text-shadow primitives during batch merging.

Glenn ported intermediate blits to the brush_image shader.

Nical decoupled the tiled image decomposition from the scene building code (in preparation for moving it to the frame building phase).

Kvark refactored the shader management code.

Glenn ported blurs to use brush_image instead of the composite shader.

Simon implemented an example that uses DirectComposition.

Martin fixed a clipping issue in blurred and shadowed text.

Kvark worked around an ANGLE bug after backing out another attempt at working around the same dreaded ANGLE flickering bug.

Jeff avoided performing divisons and modulos on unsigned integers in the shaders.

Glenn optimized the brush_image shader.

Glenn changed box-shadow to be a clip source instead of a picture, providing some simplications and better batching.

Glenn reduced the number of clip store allocations.

Martin removed inversed matrix computations from the shaders.

Kvark fixed a bug with zero-sized render tasks.

Notable Gecko changes

Snorp, Heftig and Martin Stránský fixed broken rendering with nvidia graphics cards on Linux. WebRender is now usable with nvidia GPUs on Linux.

Kvark fixed flickering issues with ANGLE on Windows.

Sotaro fixed a crash, and another one.

Andrew made background SVGs use blob images instead of the basic layer manager fallback, yielding nice perf imporvements.

Nical made gradients rely on WebRender’s pixel snapping instead of snapping incorrectly during dsiplay list building.

Sotaro fixed a bug when moving a tab containing a canvas to a different window.

Sotaro fixed a jiggling issue on WIndows when resizing the browser window.

Nical fixed a race condition in the frame throttling logic causing windows to not paint intermittently.

Andrew avoided using the fallback logic for images during decoding.

Sotaro fixed an ffi bug causing images to not render on 32bit Windows.

Jeff simplified the memory management of WebRenderUserData.

Enabling WebRender in Firefox Nightly

In about:config, just set “gfx.webrender.all” to true and restart the browser. No need to toggle any other prefs.

Note that WebRender can only be enabled in Firefox Nightly. We will make it possible to enable it on other release channels as soon as we consider it stable enough to reach a broader audience.