|
@@ -891,87 +891,94 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
|
|
|
gl.linkProgram( program );
|
|
|
|
|
|
- // check for link errors
|
|
|
- if ( renderer.debug.checkShaderErrors ) {
|
|
|
+ function onFirstUse( self ) {
|
|
|
|
|
|
- const programLog = gl.getProgramInfoLog( program ).trim();
|
|
|
- const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
|
|
|
- const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
|
|
|
+ // check for link errors
|
|
|
+ if ( renderer.debug.checkShaderErrors ) {
|
|
|
|
|
|
- let runnable = true;
|
|
|
- let haveDiagnostics = true;
|
|
|
+ const programLog = gl.getProgramInfoLog( program ).trim();
|
|
|
+ const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
|
|
|
+ const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
|
|
|
|
|
|
- if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
|
|
|
+ let runnable = true;
|
|
|
+ let haveDiagnostics = true;
|
|
|
|
|
|
- runnable = false;
|
|
|
+ if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
|
|
|
|
|
|
- if ( typeof renderer.debug.onShaderError === 'function' ) {
|
|
|
+ runnable = false;
|
|
|
|
|
|
- renderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );
|
|
|
+ if ( typeof renderer.debug.onShaderError === 'function' ) {
|
|
|
|
|
|
- } else {
|
|
|
+ renderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );
|
|
|
|
|
|
- // default error reporting
|
|
|
+ } else {
|
|
|
|
|
|
- const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );
|
|
|
- const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );
|
|
|
+ // default error reporting
|
|
|
|
|
|
- console.error(
|
|
|
- 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
|
|
|
- 'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' +
|
|
|
- 'Program Info Log: ' + programLog + '\n' +
|
|
|
- vertexErrors + '\n' +
|
|
|
- fragmentErrors
|
|
|
- );
|
|
|
+ const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );
|
|
|
+ const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );
|
|
|
|
|
|
- }
|
|
|
+ console.error(
|
|
|
+ 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
|
|
|
+ 'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' +
|
|
|
+ 'Program Info Log: ' + programLog + '\n' +
|
|
|
+ vertexErrors + '\n' +
|
|
|
+ fragmentErrors
|
|
|
+ );
|
|
|
|
|
|
- } else if ( programLog !== '' ) {
|
|
|
+ }
|
|
|
|
|
|
- console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
|
|
|
+ } else if ( programLog !== '' ) {
|
|
|
|
|
|
- } else if ( vertexLog === '' || fragmentLog === '' ) {
|
|
|
+ console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
|
|
|
|
|
|
- haveDiagnostics = false;
|
|
|
+ } else if ( vertexLog === '' || fragmentLog === '' ) {
|
|
|
|
|
|
- }
|
|
|
+ haveDiagnostics = false;
|
|
|
|
|
|
- if ( haveDiagnostics ) {
|
|
|
+ }
|
|
|
|
|
|
- this.diagnostics = {
|
|
|
+ if ( haveDiagnostics ) {
|
|
|
|
|
|
- runnable: runnable,
|
|
|
+ self.diagnostics = {
|
|
|
|
|
|
- programLog: programLog,
|
|
|
+ runnable: runnable,
|
|
|
|
|
|
- vertexShader: {
|
|
|
+ programLog: programLog,
|
|
|
|
|
|
- log: vertexLog,
|
|
|
- prefix: prefixVertex
|
|
|
+ vertexShader: {
|
|
|
|
|
|
- },
|
|
|
+ log: vertexLog,
|
|
|
+ prefix: prefixVertex
|
|
|
|
|
|
- fragmentShader: {
|
|
|
+ },
|
|
|
|
|
|
- log: fragmentLog,
|
|
|
- prefix: prefixFragment
|
|
|
+ fragmentShader: {
|
|
|
|
|
|
- }
|
|
|
+ log: fragmentLog,
|
|
|
+ prefix: prefixFragment
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- };
|
|
|
+ };
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ // Clean up
|
|
|
|
|
|
- // Clean up
|
|
|
+ // Crashes in iOS9 and iOS10. #18402
|
|
|
+ // gl.detachShader( program, glVertexShader );
|
|
|
+ // gl.detachShader( program, glFragmentShader );
|
|
|
|
|
|
- // Crashes in iOS9 and iOS10. #18402
|
|
|
- // gl.detachShader( program, glVertexShader );
|
|
|
- // gl.detachShader( program, glFragmentShader );
|
|
|
+ gl.deleteShader( glVertexShader );
|
|
|
+ gl.deleteShader( glFragmentShader );
|
|
|
|
|
|
- gl.deleteShader( glVertexShader );
|
|
|
- gl.deleteShader( glFragmentShader );
|
|
|
+ cachedUniforms = new WebGLUniforms( gl, program );
|
|
|
+ cachedAttributes = fetchAttributeLocations( gl, program );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
// set up caching for uniform locations
|
|
|
|
|
@@ -981,7 +988,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
|
|
|
if ( cachedUniforms === undefined ) {
|
|
|
|
|
|
- cachedUniforms = new WebGLUniforms( gl, program );
|
|
|
+ // Populates cachedUniforms and cachedAttributes
|
|
|
+ onFirstUse( this );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -997,7 +1005,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
|
|
|
if ( cachedAttributes === undefined ) {
|
|
|
|
|
|
- cachedAttributes = fetchAttributeLocations( gl, program );
|
|
|
+ // Populates cachedAttributes and cachedUniforms
|
|
|
+ onFirstUse( this );
|
|
|
|
|
|
}
|
|
|
|