ANGLE and WebGL 2.0 in WebKit

by @dino (Apple), @James Darpinian (Google), @Kimmo Kinnunen (Apple) Slide Deck

WebKit has integrated the ANGLE project as its primary WebGL backend, significantly improving compatibility with other browsers, and enabling a conformant WebGL 2.0 in WebKit. This talk describes how ANGLE works from WebKit’s perspective, status of the project, and offers advice to other ports on switching to ANGLE.

kbr: Talks about background. Mentions that WebGL2 shipped in 2017 in Firefox and Chrome, but not on iOS. WebGL1 only gained traction with iOS implementation, so iOS support for WebGL2 is important

kbr: Some desire for WebGPU to be baseline, but requires more capable hardware (WebGL1 is the current baseline)

kbr: Implementation is not as simple as just exposing raw API, due to requirement for it to work the same across all platforms - requires lots of validation checks and such

kbr: ANGLE does this for us

kbr: ANGLE is an OpenGL ES implementation on top of other APIs: D3D, GL, GLES, Vulkan and Metal (last is very recent)

kbr: ANGLE exposes GLES 3.0, 3.1, 3.2 API and has built-in support for WebGL 1 and 2

kbr: Easiest path to WebGL2 in WebKit - implement WebGL via ANGLE, finish WebGL2 JS bindings - project started in June 2019

kbr: WebKit uses internal ANGLE API to avoid API collisions with system-level GL libraries

kbr: ANGLE has internal optimisation of GL state changes, giving big potential performance improvements

kbr: ANGLE updating in WebKit is largely automated, except for Xcode project file update

kbr: ANGLE has been improved due to work on its integration in WebKit

kbr: per-platform code is necessary to integrate with the browser compositor, video stack, etc. - we will discuss Mac and iOS

kbr: Explaining class hierarchy (see slides)

smfr: Some of this code is being heavily refactored due to the GPU process work

kbr: these code links may/will be obsoleted pretty soon - hopefully this presentation isn't negatively useful, but we'll try to keep it up-to-date

kbr: Video-to-webgl-texture performance is important - handled by GraphicsContextGLCVANGLE

kbr: With EGL, the context must be current only in one thread at a time - this restriction isn't there on iOS

kbr: Multi-threading problems exist in the WK1 execution model and care must be taken, these problems don't exist with the WK2 execution model

kbr: WebGL2 required updating lots of code that can interact with texture uploads, such as ImageBitmap creation, creating textures from DOM elements, etc. - this is done and tested

kbr: WebKit's WebGL2 implementation is passing over 98% of the conformance suite

kbr: WebGL1 under ANGLE also improved, but no numbers to hand

kbr: goal is 100% conformance on MacOS and iOS - remaining failures are mostly GPU-specific driver bugs that need workarounds

kbr: Lots of sites and demos are working well - we've been collaborating with partners, like Unity, to ensure this

kbr: We'd like all WebKit ports to adopt the ANGLE backend - especially Linux/embedded Linux and Windows

kbr: full ANGLE adoption would allow removal of USE(OPENGL) and USE(OPENGL_ES) #ifdefs, which would be a huge simplification

kbr: OffscreenCanvas support could use ANGLE via GPU process, or otherwise ANGLE would need more multi-threading support

Questions & Comments

clord: Why was the internal API exposure necessary for WebKit, but not for Chrome?

kbr: Chrome dynamically looks up ANGLE symbols so there's zero possibility of collision. To simplify the work and interaction with the WebKit build system, a static linking approach was used.

deanjackson: ANGLE will be dynamically linked into WebCore soon. Everything continues to work as it is, changes aren't required. We could use the Chromium model now, but it isn't urgent.

smfr: OffscreenCanvas, GPUProcess dependencies - do you think you'd disable support until GPUProcess could be used, or would you do the work to make ANGLE usable across multiple threads?

kbr: We'd do the work. Talks about the synchronisation, sounds like a tractable problem.

smfr: If it depended on GPUProcess, it may impose requirements for newer OS versions as GPUProcess may not be supported on older OS versions

kbr: Further reassurance about commitment to getting it to work with OffscreenCanvas on as many platform/OS combinations as possible

Last modified 8 weeks ago Last modified on Jan 5, 2021 2:45:11 PM