Hi there, WebRender’s newsletter is here, delayed again by some vacation time sprinkled with a fair amount of the traditional “I’m busy” excuse. It’s been a while so there is a lot below (without counting the items I probably missed in the overwhelming amount of stuff that went into WebRender and Gecko since the last newsletter.

One of the highlights this time is something I have been focusing on for a while, building on the async scene building infrastructure to move blob image rasterization off of the render backend thread. Instead of lazily rasterizing blob images in the critical path we now eager rasterize a subset of the blobs asynchronously during scene building. This makes sure expensive blob rasterization never prevent us from producing 60 frames per second during scrolling.

The other highlight is that we started gathering telemetry numbers on the nightly population that opted into WebRender, and these numbers are very positive, even in areas that we haven’t spent any time optimizing yet.

Notable WebRender changes

Kvark prevented segmentation of tiled images.

Glenn reduced the size of scroll nodes in memory and introduced transform palettes.

Lee added configurable angles for synthetic italics.

Martin added vertical scrolling in wrench.

Glenn refactored the clip scroll tree to reduce the amount of transforms sent to teh GPU.

Andrew fixed a panic in the texture cache.

Andrew fixed the tiling and dirty rect information for external images.

Martin implemented nine-patch support for border gradients.

Nical moved the rasterization of blob images off of the critical path.

Glenn reduced the size of the per-instance data in GPU memory.

Glenn cached the font instance in text runs primitives to avoid querying it during batching.

Zakor Gyula moved the device module into a folder in preparation for supporting more backends and fixed various issues with the portability of the shaders.

Kvark fixed an issue with forced texture uploads and dirty rects.

Nical fixed the scene building debug indicator to work with async scene building.

Lee snapped text run offsets and glyph offsets separately.

Glenn changed the data structure used to store clip sources.

Kvark improved the chasing infrastructure to debug batches.

Glenn avoided building frames when not necessary, improving CPU and power usage.

Jeff fixed a bug causing blob images to be transferred to the GPU every frame.

Nical avoided a crash if the debug shaders fail to build.

Kvark improved the way we handle non-inertible transforms in some cases.

s-panferov fixed the framebuffer size of the examples on hidpi screens.

Glenn decoupled batching from the clip-scroll-tree.

Glenn removed a redundant matrix transformation per primitive per frame.

Glenn decoupled some of the primitive code from spacial nodes.

Martin worked around a bug with out-of-sequence clip ids.

Lee added custom gamma and contrast for DWrite fonts.

Kvark reduced the glyph key size to 32 bits.

Sotaro fixed a bug in the FPS counter.

ekicyou made some tweaks to the direct composition exmaple.

Kvark fixed a bug with the clipping of iframes.

Kvark worked around an OSX Intel shader compiler bug (again).

Martin prevented segmenting clips with different positioning nodes.

Andrew improved the way we track dirty rects for images.

Notable Gecko changes

Sotaro fixed an issue with the display list generation in some cases.

Kats added some telemetry probes.

Sotaro fixed a crash in the memory management of textures during real device resets and during simulated ones.

Sotaro removed extraneous WebRender threads created when the GPU process is enabled on Windows.

Sotaro adjusted DXGI texture synchronization timeouts on Windows.

Lee added scaled font hooks on Android.

Sotaro added a check that an EGL extension is supported before using it.

Gankro fixed a crash in the displaylist building code.

Kats added telemetry probes to gather some number on the performance of webrender in the small population of nightly users currently using it.

Kats fixed a crash in the blob image recording code.

Kats made QR test jobs tier-1 by default.

Kats fixed a bug in the way rendering commands are flushed.

Lee cached DWrite rendering params (yielding a nice perf boost).

Lee fixed a font-related crash

Nical removed the possibility to disable async scene building.

Sotaro fixed a resource tracking issue when moving tabs between windows.

Sotaro fixed the redundant scheduling of frames that caused 30fps videos to refresh the window at 60fps.

Sotaro reused the external image ids across video frames.

Kats better handled invalid clip-path URIs.

Kats fixed a crash in the blob image layerization code.

Kats fixed a bug in the displaylist building code.

Nical implemented the new async blob rendering hooks on the gecko side.

Sotaro implemented a WebRender code path for when the pres shell has no frame avoiding a very costly fallback.

Gankro optimized away fully transparent blob images.

Andrew prevented slow things from happening when an image takes a long time to decode.

Sotaro avoided re-building the scene in more video playback cases.

Enabling WebRender in Firefox Nightly

In about:config:

– just 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.