mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 10:53:59 +00:00
fix(navara): invalidate cached glyphs after context loss
Clear the display-resource signature used by static sprite reuse when the WebGL context is lost or restored. Cover both events and verify that caching resumes after the redraw.
This commit is contained in:
1 parent
f59d134928
commit
9ba5a3aba9
2 files changed
+20
-2
No files matched your search
@@ -48,12 +48,14 @@ void main(){vec4 bg=texture2D(image,vUv);vec4 glyph=texture2D(glyphs,vUv);if(gly
|
||||
});
|
||||
const quad = new FullScreenQuad(composite);
|
||||
const canvas = renderer.domElement;
|
||||
const display = { target, composite, quad, canvas, signature: null };
|
||||
const invalidate = () => {
|
||||
target.signature = null;
|
||||
display.signature = null;
|
||||
};
|
||||
canvas?.addEventListener('webglcontextlost', invalidate);
|
||||
canvas?.addEventListener('webglcontextrestored', invalidate);
|
||||
return { target, composite, quad, canvas, invalidate };
|
||||
display.invalidate = invalidate;
|
||||
return display;
|
||||
}
|
||||
|
||||
function staticSpriteSignature(scene, camera, renderer, width, height) {
|
||||
|
||||
@@ -30,6 +30,7 @@ function harness() {
|
||||
pass = new GevOverlayPass(scene, new PerspectiveCamera(), overlay),
|
||||
draws = [];
|
||||
const renderer = {
|
||||
domElement: new EventTarget(),
|
||||
autoClear: true,
|
||||
outputColorSpace: SRGBColorSpace,
|
||||
getPixelRatio: () => 1,
|
||||
@@ -190,6 +191,21 @@ test('static sprite glyphs reuse their target until instance data changes', () =
|
||||
h.pass.camera.updateMatrixWorld();
|
||||
h.pass.render(h.renderer, input, output);
|
||||
assert.equal(h.draws.filter((draw) => draw.object === h.scene).length, 3);
|
||||
for (const type of ['webglcontextlost', 'webglcontextrestored']) {
|
||||
h.renderer.domElement.dispatchEvent(new Event(type));
|
||||
const before = h.draws.filter((draw) => draw.object === h.scene).length;
|
||||
h.pass.render(h.renderer, input, output);
|
||||
assert.equal(
|
||||
h.draws.filter((draw) => draw.object === h.scene).length,
|
||||
before + 1,
|
||||
`${type} invalidates the cached GPU pixels`,
|
||||
);
|
||||
h.pass.render(h.renderer, input, output);
|
||||
assert.equal(
|
||||
h.draws.filter((draw) => draw.object === h.scene).length,
|
||||
before + 1,
|
||||
);
|
||||
}
|
||||
h.pass.dispose();
|
||||
texture.dispose();
|
||||
mesh.geometry.dispose();
|
||||
|
||||
Reference in new issue
Block a user