diff --git a/src/core/renderers/webgl/filters/Filter.js b/src/core/renderers/webgl/filters/Filter.js index 7dd8745..251b8f3 100644 --- a/src/core/renderers/webgl/filters/Filter.js +++ b/src/core/renderers/webgl/filters/Filter.js @@ -27,6 +27,9 @@ * @member {string} */ this.fragmentSrc = fragmentSrc || Filter.defaultFragmentSrc; + + var key = this.fragmentSrc + this.vertexSrc; + // pull out the vertex and shader uniforms if they are not specified.. // currently this does not extract structs only default types @@ -44,6 +47,9 @@ // TODO we could cache this! this.glShaders = []; + // used for cacheing.. + this.glShaderKey = null; + this.resolution = 1; } diff --git a/src/core/renderers/webgl/filters/Filter.js b/src/core/renderers/webgl/filters/Filter.js index 7dd8745..251b8f3 100644 --- a/src/core/renderers/webgl/filters/Filter.js +++ b/src/core/renderers/webgl/filters/Filter.js @@ -27,6 +27,9 @@ * @member {string} */ this.fragmentSrc = fragmentSrc || Filter.defaultFragmentSrc; + + var key = this.fragmentSrc + this.vertexSrc; + // pull out the vertex and shader uniforms if they are not specified.. // currently this does not extract structs only default types @@ -44,6 +47,9 @@ // TODO we could cache this! this.glShaders = []; + // used for cacheing.. + this.glShaderKey = null; + this.resolution = 1; } diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 0138096..8b15bab 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -30,6 +30,8 @@ this.stack = [rootState]; this.stackIndex = 0; + + this.shaderCache = {}; // todo add default! } @@ -106,11 +108,24 @@ { var renderer = this.renderer; var lastState = this.stack[this.stackIndex-1]; - var shader = filter.glShaders[gl.id]; + + // cacheing.. if(!shader) { - shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + if(filter.glShaderKey) + { + shader = this.shaderCache[filter.glShaderKey]; + + if(!shader) + { + shader = filter.glShaders[gl.id] = this.shaderCache[filter.glShaderKey] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + } + } + else + { + shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + } } renderer.bindRenderTarget(output, lastState.destinationFrame, lastState.sourceFrame); diff --git a/src/core/renderers/webgl/filters/Filter.js b/src/core/renderers/webgl/filters/Filter.js index 7dd8745..251b8f3 100644 --- a/src/core/renderers/webgl/filters/Filter.js +++ b/src/core/renderers/webgl/filters/Filter.js @@ -27,6 +27,9 @@ * @member {string} */ this.fragmentSrc = fragmentSrc || Filter.defaultFragmentSrc; + + var key = this.fragmentSrc + this.vertexSrc; + // pull out the vertex and shader uniforms if they are not specified.. // currently this does not extract structs only default types @@ -44,6 +47,9 @@ // TODO we could cache this! this.glShaders = []; + // used for cacheing.. + this.glShaderKey = null; + this.resolution = 1; } diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 0138096..8b15bab 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -30,6 +30,8 @@ this.stack = [rootState]; this.stackIndex = 0; + + this.shaderCache = {}; // todo add default! } @@ -106,11 +108,24 @@ { var renderer = this.renderer; var lastState = this.stack[this.stackIndex-1]; - var shader = filter.glShaders[gl.id]; + + // cacheing.. if(!shader) { - shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + if(filter.glShaderKey) + { + shader = this.shaderCache[filter.glShaderKey]; + + if(!shader) + { + shader = filter.glShaders[gl.id] = this.shaderCache[filter.glShaderKey] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + } + } + else + { + shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + } } renderer.bindRenderTarget(output, lastState.destinationFrame, lastState.sourceFrame); diff --git a/src/core/renderers/webgl/managers/MaskManager.js b/src/core/renderers/webgl/managers/MaskManager.js index ca6abd3..050a6fd 100644 --- a/src/core/renderers/webgl/managers/MaskManager.js +++ b/src/core/renderers/webgl/managers/MaskManager.js @@ -40,7 +40,6 @@ { this.pushStencilMask(target, maskData); } - }; /** @@ -69,7 +68,6 @@ */ MaskManager.prototype.pushSpriteMask = function (target, maskData) { - var alphaMaskFilter = this.alphaMaskPool[this.alphaMaskIndex]; if (!alphaMaskFilter) diff --git a/src/core/renderers/webgl/filters/Filter.js b/src/core/renderers/webgl/filters/Filter.js index 7dd8745..251b8f3 100644 --- a/src/core/renderers/webgl/filters/Filter.js +++ b/src/core/renderers/webgl/filters/Filter.js @@ -27,6 +27,9 @@ * @member {string} */ this.fragmentSrc = fragmentSrc || Filter.defaultFragmentSrc; + + var key = this.fragmentSrc + this.vertexSrc; + // pull out the vertex and shader uniforms if they are not specified.. // currently this does not extract structs only default types @@ -44,6 +47,9 @@ // TODO we could cache this! this.glShaders = []; + // used for cacheing.. + this.glShaderKey = null; + this.resolution = 1; } diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 0138096..8b15bab 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -30,6 +30,8 @@ this.stack = [rootState]; this.stackIndex = 0; + + this.shaderCache = {}; // todo add default! } @@ -106,11 +108,24 @@ { var renderer = this.renderer; var lastState = this.stack[this.stackIndex-1]; - var shader = filter.glShaders[gl.id]; + + // cacheing.. if(!shader) { - shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + if(filter.glShaderKey) + { + shader = this.shaderCache[filter.glShaderKey]; + + if(!shader) + { + shader = filter.glShaders[gl.id] = this.shaderCache[filter.glShaderKey] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + } + } + else + { + shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); + } } renderer.bindRenderTarget(output, lastState.destinationFrame, lastState.sourceFrame); diff --git a/src/core/renderers/webgl/managers/MaskManager.js b/src/core/renderers/webgl/managers/MaskManager.js index ca6abd3..050a6fd 100644 --- a/src/core/renderers/webgl/managers/MaskManager.js +++ b/src/core/renderers/webgl/managers/MaskManager.js @@ -40,7 +40,6 @@ { this.pushStencilMask(target, maskData); } - }; /** @@ -69,7 +68,6 @@ */ MaskManager.prototype.pushSpriteMask = function (target, maskData) { - var alphaMaskFilter = this.alphaMaskPool[this.alphaMaskIndex]; if (!alphaMaskFilter) diff --git a/src/filters/gray/GrayFilter.js b/src/filters/gray/GrayFilter.js index 5f0e462..a660a33 100644 --- a/src/filters/gray/GrayFilter.js +++ b/src/filters/gray/GrayFilter.js @@ -19,6 +19,8 @@ ); this.uniforms.gray = 1; + + this.glShaderKey = 'gray'; } GrayFilter.prototype = Object.create(core.Filter.prototype);