Bug 218305 - WebGL context remains in memory after calling loseContext()
Summary: WebGL context remains in memory after calling loseContext()
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: WebGL (show other bugs)
Version: Safari 14
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2020-10-28 13:12 PDT by Philip
Modified: 2020-11-03 10:25 PST (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Philip 2020-10-28 13:12:46 PDT
To reproduce: 
Create over 16 WebGL contexts and call loseContext on each.
On the 17th call two errors will be thrown: 
> ‘There are too many active WebGL contexts on this page, the oldest context will be lost.’
> ‘WebGL: INVALID_OPERATION: loseContext: context already lost’
It's expected that these contexts would not remain in memory.

Code snippet:
for (let i = 0; i < 17; i++) {
  const canvas = document.createElement('canvas');
  const gl = canvas.getContext('webgl');  
  const extension = gl.getExtension('WEBGL_lose_context')
  extension.loseContext();
}

Example CodePen of dynamically losing & restoring contexts.
https://codepen.io/philipbell/pen/RwRQGmo
Comment 1 Smoley 2020-10-29 18:04:48 PDT
Thanks for filing! Apple Internal see rdar://35920437.
Comment 2 Radar WebKit Bug Importer 2020-10-29 18:35:13 PDT
<rdar://problem/70838378>
Comment 3 Philip 2020-11-03 10:25:41 PST
Some additional context:
loseContext is used in popular WebGL libraries including Three.js and PixiJS. 
Without this method their context management code fails.

Three.js manages context directly in the renderer code:
https://github.com/mrdoob/three.js/blob/3989bb4a00a9f38b1df5dc02bcbc1e5a1b80df53/src/renderers/WebGLRenderer.js#L345-L357

PixiJS has a component dedicated to context management:
https://github.com/pixijs/pixi.js/blob/9ff49a23670bdb0ed864d4e53fb91d524eab59f2/packages/core/src/context/ContextSystem.ts#L248-L262