Fix error when disposing ol/renderer/webgl/TileLayer

- helper may not exist
- tileTextureCache not cleared when canvasCacheKey changes
This commit is contained in:
Maximilian Krög
2022-02-06 21:50:41 +01:00
parent a10872baa4
commit a86f0704f3
2 changed files with 26 additions and 19 deletions

View File

@@ -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();
}

View File

@@ -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_;
}
}