Skip to content

Commit 71838d2

Browse files
authored
Merge pull request #7449 from AnalyticalGraphicsInc/replace-derived-program
Add replaceDerivedShaderProgram
2 parents 8d410ff + 0712a77 commit 71838d2

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

Source/Renderer/ShaderCache.js

+15
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,21 @@ define([
138138
return cachedShader.shaderProgram;
139139
};
140140

141+
ShaderCache.prototype.replaceDerivedShaderProgram = function(shaderProgram, keyword, options) {
142+
var cachedShader = shaderProgram._cachedShader;
143+
var derivedKeyword = keyword + cachedShader.keyword;
144+
var cachedDerivedShader = this._shaders[derivedKeyword];
145+
if (defined(cachedDerivedShader)) {
146+
destroyShader(this, cachedDerivedShader);
147+
var index = cachedShader.derivedKeywords.indexOf(keyword);
148+
if (index > -1) {
149+
cachedShader.derivedKeywords.splice(index, 1);
150+
}
151+
}
152+
153+
return this.createDerivedShaderProgram(shaderProgram, keyword, options);
154+
};
155+
141156
ShaderCache.prototype.getDerivedShaderProgram = function(shaderProgram, keyword) {
142157
var cachedShader = shaderProgram._cachedShader;
143158
var derivedKeyword = keyword + cachedShader.keyword;

Specs/Renderer/ShaderCacheSpec.js

+43
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,49 @@ defineSuite([
193193
cache.destroy();
194194
});
195195

196+
it('replaces derived shader program', function() {
197+
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
198+
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
199+
200+
var cache = new ShaderCache(context);
201+
var sp = cache.getShaderProgram({
202+
vertexShaderSource : vs,
203+
fragmentShaderSource : fs,
204+
attributeLocations : {
205+
position : 0
206+
}
207+
});
208+
var derivedKeywords = sp._cachedShader.derivedKeywords;
209+
210+
var keyword = 'derived';
211+
var fsDerived = 'void main() { gl_FragColor = vec4(vec3(1.0), 0.5); }';
212+
var spDerived = cache.replaceDerivedShaderProgram(sp, keyword, {
213+
vertexShaderSource : vs,
214+
fragmentShaderSource : fsDerived,
215+
attributeLocations : {
216+
position : 0
217+
}
218+
});
219+
220+
expect(spDerived).toBeDefined();
221+
expect(derivedKeywords.length).toBe(1);
222+
223+
var fsDerived2 = 'void main() { gl_FragColor = vec4(vec3(0.5), 0.5); }';
224+
var spDerived2 = cache.replaceDerivedShaderProgram(sp, keyword, {
225+
vertexShaderSource : vs,
226+
fragmentShaderSource : fsDerived2,
227+
attributeLocations : {
228+
position : 0
229+
}
230+
});
231+
232+
expect(spDerived.isDestroyed()).toBe(true);
233+
expect(spDerived2.isDestroyed()).toBe(false);
234+
expect(derivedKeywords.length).toBe(1);
235+
236+
cache.destroy();
237+
});
238+
196239
it('destroying a shader program destroys its derived shaders', function() {
197240
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
198241
var fs = 'void main() { gl_FragColor = vec4(1.0); }';

0 commit comments

Comments
 (0)