@@ -19706,8 +19706,6 @@ THREE.WebGLRenderer = function ( parameters ) {
19706
19706
19707
19707
var _this = this,
19708
19708
19709
- _programs = [],
19710
-
19711
19709
// internal state cache
19712
19710
19713
19711
_currentProgram = null,
@@ -19755,7 +19753,6 @@ THREE.WebGLRenderer = function ( parameters ) {
19755
19753
19756
19754
_infoMemory = {
19757
19755
19758
- programs: 0,
19759
19756
geometries: 0,
19760
19757
textures: 0
19761
19758
@@ -19774,10 +19771,11 @@ THREE.WebGLRenderer = function ( parameters ) {
19774
19771
19775
19772
render: _infoRender,
19776
19773
memory: _infoMemory,
19777
- programs: _programs
19774
+ programs: null
19778
19775
19779
19776
};
19780
19777
19778
+
19781
19779
// initialize
19782
19780
19783
19781
var _gl;
@@ -19839,6 +19837,8 @@ THREE.WebGLRenderer = function ( parameters ) {
19839
19837
var objects = new THREE.WebGLObjects( _gl, properties, this.info );
19840
19838
var programCache = new THREE.WebGLPrograms( this, capabilities );
19841
19839
19840
+ this.info.programs = programCache.programs;
19841
+
19842
19842
var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender );
19843
19843
var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
19844
19844
@@ -20213,41 +20213,13 @@ THREE.WebGLRenderer = function ( parameters ) {
20213
20213
20214
20214
function releaseMaterialProgramReference( material ) {
20215
20215
20216
- var program = properties.get( material ).program.program;
20217
-
20218
- if ( program === undefined ) return;
20216
+ var programInfo = properties.get( material ).program;
20219
20217
20220
20218
material.program = undefined;
20221
20219
20222
- for ( var i = 0, n = _programs.length; i !== n; ++ i ) {
20223
-
20224
- var programInfo = _programs[ i ];
20225
-
20226
- if ( programInfo.program === program ) {
20227
-
20228
- var newReferenceCount = -- programInfo.usedTimes;
20229
-
20230
- if ( newReferenceCount === 0 ) {
20231
-
20232
- // the last material that has been using the program let
20233
- // go of it, so remove it from the (unordered) _programs
20234
- // set and deallocate the GL resource
20235
-
20236
- var newLength = n - 1;
20237
-
20238
- _programs[ i ] = _programs[ newLength ];
20239
- _programs.pop();
20240
-
20241
- _gl.deleteProgram( program );
20242
-
20243
- _infoMemory.programs = newLength;
20244
-
20245
- }
20246
-
20247
- break;
20248
-
20249
- }
20220
+ if ( programInfo !== undefined ) {
20250
20221
20222
+ programCache.releaseProgram( programInfo );
20251
20223
}
20252
20224
20253
20225
}
@@ -21066,15 +21038,15 @@ THREE.WebGLRenderer = function ( parameters ) {
21066
21038
var parameters = programCache.getParameters( material, lights, fog, object );
21067
21039
var code = programCache.getProgramCode( material, parameters );
21068
21040
21069
-
21041
+ var program = materialProperties.program;
21070
21042
var programChange = true;
21071
21043
21072
- if ( ! materialProperties. program ) {
21044
+ if ( program === undefined ) {
21073
21045
21074
21046
// new material
21075
21047
material.addEventListener( 'dispose', onMaterialDispose );
21076
21048
21077
- } else if ( materialProperties. program.code !== code ) {
21049
+ } else if ( program.code !== code ) {
21078
21050
21079
21051
// changed glsl or parameters
21080
21052
releaseMaterialProgramReference( material );
@@ -21091,41 +21063,39 @@ THREE.WebGLRenderer = function ( parameters ) {
21091
21063
21092
21064
}
21093
21065
21094
- if ( parameters.shaderID ) {
21066
+ if ( programChange ) {
21095
21067
21096
- var shader = THREE.ShaderLib[ parameters.shaderID ];
21068
+ if ( parameters.shaderID ) {
21097
21069
21098
- materialProperties.__webglShader = {
21099
- name: material.type,
21100
- uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
21101
- vertexShader: shader.vertexShader,
21102
- fragmentShader: shader.fragmentShader
21103
- };
21070
+ var shader = THREE.ShaderLib[ parameters.shaderID ];
21104
21071
21105
- } else {
21072
+ materialProperties.__webglShader = {
21073
+ name: material.type,
21074
+ uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
21075
+ vertexShader: shader.vertexShader,
21076
+ fragmentShader: shader.fragmentShader
21077
+ };
21106
21078
21107
- materialProperties.__webglShader = {
21108
- name: material.type,
21109
- uniforms: material.uniforms,
21110
- vertexShader: material.vertexShader,
21111
- fragmentShader: material.fragmentShader
21112
- };
21079
+ } else {
21113
21080
21114
- }
21081
+ materialProperties.__webglShader = {
21082
+ name: material.type,
21083
+ uniforms: material.uniforms,
21084
+ vertexShader: material.vertexShader,
21085
+ fragmentShader: material.fragmentShader
21086
+ };
21115
21087
21116
- material.__webglShader = materialProperties.__webglShader;
21088
+ }
21117
21089
21118
- var program = programCache.getProgram( material, parameters, code ) ;
21090
+ material.__webglShader = materialProperties.__webglShader ;
21119
21091
21120
- if ( programChange ) {
21092
+ program = programCache.acquireProgram( material, parameters, code );
21121
21093
21122
- program.usedTimes ++;
21094
+ materialProperties.program = program;
21095
+ material.program = program;
21123
21096
21124
21097
}
21125
21098
21126
- materialProperties.program = program;
21127
- material.program = program;
21128
-
21129
21099
var attributes = program.getAttributes();
21130
21100
21131
21101
if ( material.morphTargets ) {
@@ -24338,6 +24308,15 @@ THREE.WebGLProgram = ( function () {
24338
24308
24339
24309
};
24340
24310
24311
+ // free resource
24312
+
24313
+ this.destroy = function() {
24314
+
24315
+ gl.deleteProgram( program );
24316
+ this.program = undefined;
24317
+
24318
+ };
24319
+
24341
24320
// DEPRECATED
24342
24321
24343
24322
Object.defineProperties( this, {
@@ -24612,7 +24591,7 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
24612
24591
24613
24592
};
24614
24593
24615
- this.getProgram = function ( material, parameters, code ) {
24594
+ this.acquireProgram = function ( material, parameters, code ) {
24616
24595
24617
24596
var program;
24618
24597
@@ -24624,6 +24603,7 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
24624
24603
if ( programInfo.code === code ) {
24625
24604
24626
24605
program = programInfo;
24606
+ ++ program.usedTimes;
24627
24607
24628
24608
break;
24629
24609
@@ -24638,9 +24618,28 @@ THREE.WebGLPrograms = function ( renderer, capabilities ) {
24638
24618
24639
24619
}
24640
24620
24641
- return program ;
24621
+ return program;
24642
24622
24643
- }
24623
+ };
24624
+
24625
+ this.releaseProgram = function( program ) {
24626
+
24627
+ if ( -- program.usedTimes === 0 ) {
24628
+
24629
+ // Remove from unordered set
24630
+ var i = programs.indexOf( program );
24631
+ programs[ i ] = programs[ programs.length - 1 ];
24632
+ programs.pop();
24633
+
24634
+ // Free WebGL resources
24635
+ program.destroy();
24636
+
24637
+ }
24638
+
24639
+ };
24640
+
24641
+ // Exposed for resource monitoring & error feedback via renderer.info:
24642
+ this.programs = programs;
24644
24643
24645
24644
};
24646
24645
0 commit comments