-
Notifications
You must be signed in to change notification settings - Fork 3.5k
/
ShaderCacheSpec.js
130 lines (100 loc) · 3.71 KB
/
ShaderCacheSpec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*global defineSuite*/
defineSuite([
'Renderer/ShaderCache',
'Specs/createContext',
'Specs/destroyContext'
], function(
ShaderCache,
createContext,
destroyContext) {
"use strict";
/*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,runs,waits,waitsFor*/
var context;
beforeAll(function() {
context = createContext();
});
afterAll(function() {
destroyContext(context);
});
it('adds and removes', function() {
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
var cache = new ShaderCache(context);
var sp = cache.getShaderProgram(vs, fs, {
position : 0
});
expect(sp._cachedShader.count).toEqual(1);
cache.releaseShaderProgram(sp);
expect(sp.isDestroyed()).toEqual(false);
cache.destroyReleasedShaderPrograms();
expect(sp.isDestroyed()).toEqual(true);
cache.destroy();
});
it('adds and removes 2', function() {
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
var cache = new ShaderCache(context);
var sp = cache.getShaderProgram(vs, fs, {
position : 0
});
expect(sp._cachedShader.count).toEqual(1);
sp.release();
expect(sp.isDestroyed()).toEqual(false);
cache.destroyReleasedShaderPrograms();
expect(sp.isDestroyed()).toEqual(true);
cache.destroy();
});
it('has a cache hit', function() {
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
var cache = new ShaderCache(context);
var sp = cache.getShaderProgram(vs, fs, {
position : 0
});
var sp2 = cache.getShaderProgram(vs, fs, {
position : 0
});
expect(sp).toBe(sp2);
expect(sp._cachedShader.count).toEqual(2);
sp.release();
sp2.release();
cache.destroyReleasedShaderPrograms();
expect(sp.isDestroyed()).toEqual(true);
cache.destroy();
});
it('avoids thrashing', function() {
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
var cache = new ShaderCache(context);
var sp = cache.getShaderProgram(vs, fs, {
position : 0
});
sp.release();
var sp2 = cache.getShaderProgram(vs, fs, {
position : 0
}); // still cache hit
cache.destroyReleasedShaderPrograms(); // does not destroy
expect(sp.isDestroyed()).toEqual(false);
expect(sp2.isDestroyed()).toEqual(false);
sp2.release();
cache.destroyReleasedShaderPrograms(); // destroys
expect(sp.isDestroyed()).toEqual(true);
expect(sp2.isDestroyed()).toEqual(true);
cache.destroy();
});
it('is destroyed', function() {
var vs = 'attribute vec4 position; void main() { gl_Position = position; }';
var fs = 'void main() { gl_FragColor = vec4(1.0); }';
var cache = new ShaderCache(context);
var sp = cache.getShaderProgram(vs, fs, {
position : 0
});
cache.destroy();
expect(sp.isDestroyed()).toEqual(true);
expect(cache.isDestroyed()).toEqual(true);
});
it('is not destroyed', function() {
var cache = new ShaderCache(context);
expect(cache.isDestroyed()).toEqual(false);
});
});