@@ -82,8 +82,6 @@ THREE.WebGLRenderer = function ( parameters ) {
82
82
83
83
var _this = this ,
84
84
85
- _programs = [ ] ,
86
-
87
85
// internal state cache
88
86
89
87
_currentProgram = null ,
@@ -131,9 +129,9 @@ THREE.WebGLRenderer = function ( parameters ) {
131
129
132
130
_infoMemory = {
133
131
134
- programs : 0 ,
135
132
geometries : 0 ,
136
- textures : 0
133
+ textures : 0 ,
134
+ programs : 0
137
135
138
136
} ,
139
137
@@ -150,10 +148,18 @@ THREE.WebGLRenderer = function ( parameters ) {
150
148
151
149
render : _infoRender ,
152
150
memory : _infoMemory ,
153
- programs : _programs
151
+ programs : null
154
152
155
153
} ;
156
154
155
+ Object . defineProperty ( _infoMemory , 'programs' , { get : function ( ) {
156
+
157
+ var programs = _this . info . programs ;
158
+ return programs !== null ? programs . length : 0 ;
159
+
160
+ } } ) ;
161
+
162
+
157
163
// initialize
158
164
159
165
var _gl ;
@@ -215,6 +221,8 @@ THREE.WebGLRenderer = function ( parameters ) {
215
221
var objects = new THREE . WebGLObjects ( _gl , properties , this . info ) ;
216
222
var programCache = new THREE . WebGLPrograms ( this , capabilities ) ;
217
223
224
+ this . info . programs = programCache . programs ;
225
+
218
226
var bufferRenderer = new THREE . WebGLBufferRenderer ( _gl , extensions , _infoRender ) ;
219
227
var indexedBufferRenderer = new THREE . WebGLIndexedBufferRenderer ( _gl , extensions , _infoRender ) ;
220
228
@@ -589,41 +597,13 @@ THREE.WebGLRenderer = function ( parameters ) {
589
597
590
598
function releaseMaterialProgramReference ( material ) {
591
599
592
- var program = properties . get ( material ) . program . program ;
593
-
594
- if ( program === undefined ) return ;
600
+ var programInfo = properties . get ( material ) . program ;
595
601
596
602
material . program = undefined ;
597
603
598
- for ( var i = 0 , n = _programs . length ; i !== n ; ++ i ) {
599
-
600
- var programInfo = _programs [ i ] ;
601
-
602
- if ( programInfo . program === program ) {
603
-
604
- var newReferenceCount = -- programInfo . usedTimes ;
605
-
606
- if ( newReferenceCount === 0 ) {
607
-
608
- // the last material that has been using the program let
609
- // go of it, so remove it from the (unordered) _programs
610
- // set and deallocate the GL resource
611
-
612
- var newLength = n - 1 ;
613
-
614
- _programs [ i ] = _programs [ newLength ] ;
615
- _programs . pop ( ) ;
616
-
617
- _gl . deleteProgram ( program ) ;
618
-
619
- _infoMemory . programs = newLength ;
620
-
621
- }
622
-
623
- break ;
624
-
625
- }
604
+ if ( programInfo !== undefined ) {
626
605
606
+ programCache . releaseProgram ( programInfo ) ;
627
607
}
628
608
629
609
}
@@ -1442,15 +1422,15 @@ THREE.WebGLRenderer = function ( parameters ) {
1442
1422
var parameters = programCache . getParameters ( material , lights , fog , object ) ;
1443
1423
var code = programCache . getProgramCode ( material , parameters ) ;
1444
1424
1445
-
1425
+ var program = materialProperties . program ;
1446
1426
var programChange = true ;
1447
1427
1448
- if ( ! materialProperties . program ) {
1428
+ if ( program === undefined ) {
1449
1429
1450
1430
// new material
1451
1431
material . addEventListener ( 'dispose' , onMaterialDispose ) ;
1452
1432
1453
- } else if ( materialProperties . program . code !== code ) {
1433
+ } else if ( program . code !== code ) {
1454
1434
1455
1435
// changed glsl or parameters
1456
1436
releaseMaterialProgramReference ( material ) ;
@@ -1467,41 +1447,39 @@ THREE.WebGLRenderer = function ( parameters ) {
1467
1447
1468
1448
}
1469
1449
1470
- if ( parameters . shaderID ) {
1450
+ if ( programChange ) {
1471
1451
1472
- var shader = THREE . ShaderLib [ parameters . shaderID ] ;
1452
+ if ( parameters . shaderID ) {
1473
1453
1474
- materialProperties . __webglShader = {
1475
- name : material . type ,
1476
- uniforms : THREE . UniformsUtils . clone ( shader . uniforms ) ,
1477
- vertexShader : shader . vertexShader ,
1478
- fragmentShader : shader . fragmentShader
1479
- } ;
1454
+ var shader = THREE . ShaderLib [ parameters . shaderID ] ;
1480
1455
1481
- } else {
1456
+ materialProperties . __webglShader = {
1457
+ name : material . type ,
1458
+ uniforms : THREE . UniformsUtils . clone ( shader . uniforms ) ,
1459
+ vertexShader : shader . vertexShader ,
1460
+ fragmentShader : shader . fragmentShader
1461
+ } ;
1482
1462
1483
- materialProperties . __webglShader = {
1484
- name : material . type ,
1485
- uniforms : material . uniforms ,
1486
- vertexShader : material . vertexShader ,
1487
- fragmentShader : material . fragmentShader
1488
- } ;
1463
+ } else {
1489
1464
1490
- }
1465
+ materialProperties . __webglShader = {
1466
+ name : material . type ,
1467
+ uniforms : material . uniforms ,
1468
+ vertexShader : material . vertexShader ,
1469
+ fragmentShader : material . fragmentShader
1470
+ } ;
1491
1471
1492
- material . __webglShader = materialProperties . __webglShader ;
1472
+ }
1493
1473
1494
- var program = programCache . getProgram ( material , parameters , code ) ;
1474
+ material . __webglShader = materialProperties . __webglShader ;
1495
1475
1496
- if ( programChange ) {
1476
+ program = programCache . acquireProgram ( material , parameters , code ) ;
1497
1477
1498
- program . usedTimes ++ ;
1478
+ materialProperties . program = program ;
1479
+ material . program = program ;
1499
1480
1500
1481
}
1501
1482
1502
- materialProperties . program = program ;
1503
- material . program = program ;
1504
-
1505
1483
var attributes = program . getAttributes ( ) ;
1506
1484
1507
1485
if ( material . morphTargets ) {
0 commit comments