Hi! This is the 30th issue of WebRender’s most famous newsletter. At the top of each newsletter I try to dedicate a few paragraphs to some historical/technical details of the project. Today I’ll write about blob images.
WebRender currently doesn’t support the full set of graphics primitives required to render all web pages. The focus so far has been on doing a good job of rendering the most common elements and providing a fall-back for the rest. We call this fall-back mechanism “blob images”.
The general idea is that when we encounter unsupported primitives during displaylist building we create an image object and instead of backing it with pixel data or a texture handle, we assign it a serialized list of drawing commands (the blob). For WebRender, blobs are just opaque buffers of bytes and a handler object is provided by the embedder (Gecko in our case) to turn this opaque buffer into actual pixels that can be used as regular images by the rest of the rendering pipeline.
This opaque blob representation and an external handler lets us implement these missing features using Skia without adding large and messy dependencies to WebRender itself. While a big part of this mechanism operates as a black box, WebRender remains responsible for scheduling the blob rasterization work at the appropriate time and synchronizing it with other updates. Our long term goal is to incrementally implement missing primitives directly in WebRender.
Notable WebRender and Gecko changes
- Bobby keeps improving the texture cache heuristics to reduce peak GPU memory usage.
- Bobby improved the texture cache’s debug display.
- Jeff fixed a pair of blob image related crashes.
- Jeff investigated content frame time telemetry data.
- Dan improved our score on the dl_mutate talos benchmark by 20%.
- Kats landed the async zooming changes for WebRender on Android.
- Kats fixed a crash.
- Kvark simplified some of the displaylist building code.
- Matt Fixed a crash with tiled blob images.
- Lee fixed a bug causing fonts to use the wrong DirectWrite render mode on Windows.
- Emilio fixed a box-shadow regression.
- Emilio switched the CI to an osmesa version that works with clang 7.
- Glenn landed the picture caching work for text shadows.
- Glenn refactored some of the plane splitting code to move it into the picture traversal pass.
- Glenn removed some dead code.
- Glenn separated brush segment descriptors form clip mask instance.
- Glenn refactored the none-patch segment generation code.
- Glenn removed the local_rect from PictureState.
- Sotaro improved the frame synchronization yielding a nice performance improvement on the glterrain talos benchmark.
- Sotaro recycled the D3D11 Query object, which improved the glterrain, tart and tscrollx talos scores on Windows.
- Sotaro simplified some of the image sharing code.
- The gfx team has a new manager, welcome Jessie!
- Matt and Dan are investigating performance.
- Doug is investigating the effects of document splitting on talos scores.
- Lee is fixing font rendering issues.
- Kvark is making progress on the clip/scroll API refactoring.
- Kats keeps investigating WebRender on Android.
- Glenn is incrementally working towards picture caching for scrolled surfaces.
Enabling WebRender in Firefox Nightly
- set “gfx.webrender.all” to true,
- restart Firefox.