From a86f0704f3e7bc30bc817824e8510c46ffa6f0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Kr=C3=B6g?= Date: Sun, 6 Feb 2022 21:50:41 +0100 Subject: [PATCH] Fix error when disposing ol/renderer/webgl/TileLayer - helper may not exist - tileTextureCache not cleared when canvasCacheKey changes --- src/ol/renderer/webgl/Layer.js | 13 ++++++------ src/ol/renderer/webgl/TileLayer.js | 32 ++++++++++++++++++------------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/ol/renderer/webgl/Layer.js b/src/ol/renderer/webgl/Layer.js index 00f4082db6..a6d9b1c1b4 100644 --- a/src/ol/renderer/webgl/Layer.js +++ b/src/ol/renderer/webgl/Layer.js @@ -95,7 +95,7 @@ class WebGLLayerRenderer extends LayerRenderer { */ this.helper; - layer.addChangeListener(LayerProperty.MAP, this.removeHelper_.bind(this)); + layer.addChangeListener(LayerProperty.MAP, this.removeHelper.bind(this)); this.dispatchPreComposeEvent = this.dispatchPreComposeEvent.bind(this); this.dispatchPostComposeEvent = this.dispatchPostComposeEvent.bind(this); @@ -148,7 +148,10 @@ class WebGLLayerRenderer extends LayerRenderer { } } - removeHelper_() { + /** + * @protected + */ + removeHelper() { if (this.helper) { this.helper.dispose(); delete this.helper; @@ -187,9 +190,7 @@ class WebGLLayerRenderer extends LayerRenderer { 'map/' + frameState.mapId + '/group/' + groupNumber; if (!this.helper || !this.helper.canvasCacheKeyMatches(canvasCacheKey)) { - if (this.helper) { - this.helper.dispose(); - } + this.removeHelper(); this.helper = new WebGLHelper({ postProcesses: this.postProcesses_, @@ -227,7 +228,7 @@ class WebGLLayerRenderer extends LayerRenderer { * Clean up. */ disposeInternal() { - this.removeHelper_(); + this.removeHelper(); super.disposeInternal(); } diff --git a/src/ol/renderer/webgl/TileLayer.js b/src/ol/renderer/webgl/TileLayer.js index 959f25e276..658b8fc206 100644 --- a/src/ol/renderer/webgl/TileLayer.js +++ b/src/ol/renderer/webgl/TileLayer.js @@ -683,27 +683,33 @@ class WebGLTileLayerRenderer extends WebGLLayerRenderer { return covered; } + removeHelper() { + if (this.helper) { + const tileTextureCache = this.tileTextureCache_; + tileTextureCache.forEach((tileTexture) => tileTexture.dispose()); + tileTextureCache.clear(); + } + + super.removeHelper(); + } + /** * Clean up. */ disposeInternal() { const helper = this.helper; - const gl = helper.getGL(); + if (helper) { + const gl = helper.getGL(); + gl.deleteProgram(this.program_); + delete this.program_; - helper.deleteBuffer(this.indices_); - delete this.indices_; - - gl.deleteProgram(this.program_); - delete this.program_; - - const tileTextureCache = this.tileTextureCache_; - tileTextureCache.forEach(function (tileTexture) { - tileTexture.dispose(); - }); - tileTextureCache.clear(); - delete this.tileTextureCache_; + helper.deleteBuffer(this.indices_); + } super.disposeInternal(); + + delete this.indices_; + delete this.tileTextureCache_; } }