diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index f2d1c12..e63d2b0 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -127,6 +127,19 @@ */ this.currentRenderer = this.emptyRenderer; + /** + * Manages textures + * @member {PIXI.TextureManager} + */ + this.textureManager = null; + + /** + * Manages the filters. + * + * @member {PIXI.FilterManager} + */ + this.filterManager = null; + this.initPlugins(); /** @@ -178,12 +191,6 @@ this._initContext(); - /** - * Manages the filters. - * - * @member {PIXI.FilterManager} - */ - this.filterManager = new FilterManager(this); // map some webGL blend and drawmodes.. this.drawModes = mapWebGLDrawModesToPixi(this.gl); @@ -236,6 +243,7 @@ // create a texture manager... this.textureManager = new TextureManager(this); + this.filterManager = new FilterManager(this); this.textureGC = new TextureGarbageCollector(this); this.state.resetToDefault(); @@ -683,6 +691,7 @@ handleContextRestored() { this.textureManager.removeAll(); + this.filterManager.destroy(true); this._initContext(); } diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index f2d1c12..e63d2b0 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -127,6 +127,19 @@ */ this.currentRenderer = this.emptyRenderer; + /** + * Manages textures + * @member {PIXI.TextureManager} + */ + this.textureManager = null; + + /** + * Manages the filters. + * + * @member {PIXI.FilterManager} + */ + this.filterManager = null; + this.initPlugins(); /** @@ -178,12 +191,6 @@ this._initContext(); - /** - * Manages the filters. - * - * @member {PIXI.FilterManager} - */ - this.filterManager = new FilterManager(this); // map some webGL blend and drawmodes.. this.drawModes = mapWebGLDrawModesToPixi(this.gl); @@ -236,6 +243,7 @@ // create a texture manager... this.textureManager = new TextureManager(this); + this.filterManager = new FilterManager(this); this.textureGC = new TextureGarbageCollector(this); this.state.resetToDefault(); @@ -683,6 +691,7 @@ handleContextRestored() { this.textureManager.removeAll(); + this.filterManager.destroy(true); this._initContext(); } diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index d3455a1..4792f47 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -49,6 +49,8 @@ this.pool = {}; this.filterData = null; + + this.managedFilters = []; } /** @@ -232,6 +234,8 @@ shader = filter.glShaders[renderer.CONTEXT_UID] = new Shader(this.gl, filter.vertexSrc, filter.fragmentSrc); } + this.managedFilters.push(filter); + // TODO - this only needs to be done once? renderer.bindVao(null); @@ -488,11 +492,32 @@ /** * Destroys this Filter Manager. * + * @param {boolean} [contextLost=false] context was lost, do not free shaders + * */ - destroy() + destroy(contextLost = false) { + const renderer = this.renderer; + const filters = this.managedFilters; + + for (let i = 0; i < filters.length; i++) + { + if (!contextLost) + { + filters[i].glShaders[renderer.CONTEXT_UID].destroy(); + } + delete filters[i].glShaders[renderer.CONTEXT_UID]; + } + this.shaderCache = {}; - this.emptyPool(); + if (!contextLost) + { + this.emptyPool(); + } + else + { + this.pool = {}; + } } /**