WebGL 2
WebGL 2 is here. The newest versions of the most used 3D library dropped WebGL 1, so a page built on them showed nothing at all. Floati now has the whole WebGL 2 interface with its own shading-language compiler, and it passes more of the official conformance pages than the reference browser. WebGL also reaches the screen with no copy through the processor, so a large 3D scene at retina size runs at 120 frames a second instead of 40, in less memory. Canvases are sharp on retina screens, and a heavy 3D scene shows its first frame in a third of a second instead of 23.
WebGL 2




This one started with a blank page. The newest versions of the most used 3D library no longer support WebGL 1, so a 3D page built on them showed nothing at all here. We wrote WebGL 2 in six slices: the interface, a compiler for the newer shading language with real integers, textures, buffers, draw targets and transform feedback. Our software renderer stays the oracle, so every slice is checked on the GPU against it. Windows found a bug Mac hid, a 3D texture lookup that would not compile, and Mac found one of its own: its graphics driver divides integers wrongly next to some loops, so we write division out ourselves.
Sharp canvases on retina screens




We found this in the first minute of running a real 3D page in the app: it looked soft. The page asked for the device pixel ratio and was always told 1, so it drew at half size and the window stretched it. Every canvas and chart that scales itself for retina was blurry. Pages now see the real scale.
WebGL straight to the screen
With the scene sharp, it was slow: every frame was read back from the GPU, flipped by the processor and sent back up as tiles. Now the page and the compositor share one buffer on the GPU, and the compositor draws the canvas and whatever covers it with the same arithmetic in the same order, so the pixels are the same bytes as before. Rotated canvases, filters and blend modes over a canvas still take the old path.
A first frame in a third of a second
Comparing against the reference browser, our first frame took 23 seconds. A scene starts in software and moves to the GPU once it has drawn enough, and drawing enough was counted in vertices. A scene that builds its lighting first does little geometry and a lot of shading, so it stayed in software. Shading counts now. Fixing that showed two more: a scene that moved mid-frame could fall back to software for good, and a test page that compares two drawings could get one from each path. Both are fixed, each with a law that fails without it.
Found on our own page
The release check loads 14 sites, and one of them is ours. It showed an error: a script read the observer from its MutationObserver callback and found nothing, because we never passed it. Looking closer, our callbacks also ran at the wrong moment among promise jobs, and disconnecting kept records it should drop. All three are fixed.