diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 073f503a4598b4..af4650388526ca 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -13,6 +13,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities const _customShaders = new WebGLShaderCache(); const _activeChannels = new Set(); const programs = []; + const programsMap = new Map(); const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer; @@ -589,29 +590,19 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities function acquireProgram( parameters, cacheKey ) { - let program; + let program = programsMap.get( cacheKey ); - // Check if code has been already compiled - for ( let p = 0, pl = programs.length; p < pl; p ++ ) { + if ( program !== undefined ) { - const preexistingProgram = programs[ p ]; + ++ program.usedTimes; - if ( preexistingProgram.cacheKey === cacheKey ) { - - program = preexistingProgram; - ++ program.usedTimes; - - break; - - } - - } - - if ( program === undefined ) { + } else { program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates ); programs.push( program ); + programsMap.set( cacheKey, program ); + } return program; @@ -627,6 +618,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities programs[ i ] = programs[ programs.length - 1 ]; programs.pop(); + // Remove from map + programsMap.delete( program.cacheKey ); + // Free WebGL resources program.destroy();