Skip to content

Commit 0886cec

Browse files
committed
Merge pull request #2237 from AnalyticalGraphicsInc/debug-shaders
Support for WEBGL_debug_shaders
2 parents a51837a + fc8bc86 commit 0886cec

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

Source/Renderer/Context.js

+8
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,8 @@ define([
274274
this._maximumDrawBuffers = defined(this._drawBuffers) ? gl.getParameter(this._drawBuffers.MAX_DRAW_BUFFERS_WEBGL) : 1;
275275
this._maximumColorAttachments = defined(this._drawBuffers) ? gl.getParameter(this._drawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL) : 1; // min when supported: 4
276276

277+
this._debugShaders = getExtension(gl, ['WEBGL_debug_shaders']);
278+
277279
var cc = gl.getParameter(gl.COLOR_CLEAR_VALUE);
278280
this._clearColor = new Color(cc[0], cc[1], cc[2], cc[3]);
279281
this._clearDepth = gl.getParameter(gl.DEPTH_CLEAR_VALUE);
@@ -825,6 +827,12 @@ define([
825827
}
826828
},
827829

830+
debugShaders : {
831+
get : function() {
832+
return this._debugShaders;
833+
}
834+
},
835+
828836
throwOnWebGLError : {
829837
get : function() {
830838
return this._throwOnWebGLError;

Source/Renderer/ShaderCache.js

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ define([
8989
var shaderProgram = new ShaderProgram({
9090
gl : context._gl,
9191
logShaderCompilation : context.logShaderCompilation,
92+
debugShaders : context.debugShaders,
9293
vertexShaderSource : vertexShaderSource,
9394
vertexShaderText : vertexShaderText,
9495
fragmentShaderSource : fragmentShaderSource,

Source/Renderer/ShaderProgram.js

+35-7
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ define([
341341
var ShaderProgram = function(options) {
342342
this._gl = options.gl;
343343
this._logShaderCompilation = options.logShaderCompilation;
344+
this._debugShaders = options.debugShaders;
344345
this._attributeLocations = options.attributeLocations;
345346

346347
this._program = undefined;
@@ -419,6 +420,8 @@ define([
419420
}
420421
});
421422

423+
var consolePrefix = '[Cesium WebGL] ';
424+
422425
function createAndLinkProgram(gl, shader) {
423426
var vsSource = shader._vertexShaderText;
424427
var fsSource = shader._fragmentShaderText;
@@ -451,24 +454,49 @@ define([
451454

452455
var log;
453456
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
457+
var debugShaders = shader._debugShaders;
458+
454459
// For performance, only check compile errors if there is a linker error.
455460
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
456461
log = gl.getShaderInfoLog(fragmentShader);
462+
console.error(consolePrefix + 'Fragment shader compile log: ' + log);
463+
if (defined(debugShaders)) {
464+
var fragmentSourceTranslation = debugShaders.getTranslatedShaderSource(fragmentShader);
465+
if (fragmentSourceTranslation !== '') {
466+
console.error(consolePrefix + 'Translated fragment shader source:\n' + fragmentSourceTranslation);
467+
} else {
468+
console.error(consolePrefix + 'Fragment shader translation failed.');
469+
}
470+
}
471+
457472
gl.deleteProgram(program);
458-
console.error('[GL] Fragment shader compile log: ' + log);
459473
throw new RuntimeError('Fragment shader failed to compile. Compile log: ' + log);
460474
}
461475

462476
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
463477
log = gl.getShaderInfoLog(vertexShader);
478+
console.error(consolePrefix + 'Vertex shader compile log: ' + log);
479+
if (defined(debugShaders)) {
480+
var vertexSourceTranslation = debugShaders.getTranslatedShaderSource(vertexShader);
481+
if (vertexSourceTranslation !== '') {
482+
console.error(consolePrefix + 'Translated vertex shader source:\n' + vertexSourceTranslation);
483+
} else {
484+
console.error(consolePrefix + 'Vertex shader translation failed.');
485+
}
486+
}
487+
464488
gl.deleteProgram(program);
465-
console.error('[GL] Vertex shader compile log: ' + log);
466489
throw new RuntimeError('Vertex shader failed to compile. Compile log: ' + log);
467490
}
468491

469492
log = gl.getProgramInfoLog(program);
493+
console.error(consolePrefix + 'Shader program link log: ' + log);
494+
if (defined(debugShaders)) {
495+
console.error(consolePrefix + 'Translated vertex shader source:\n' + debugShaders.getTranslatedShaderSource(vertexShader));
496+
console.error(consolePrefix + 'Translated fragment shader source:\n' + debugShaders.getTranslatedShaderSource(fragmentShader));
497+
}
498+
470499
gl.deleteProgram(program);
471-
console.error('[GL] Shader program link log: ' + log);
472500
throw new RuntimeError('Program failed to link. Link log: ' + log);
473501
}
474502

@@ -477,21 +505,21 @@ define([
477505
if (logShaderCompilation) {
478506
log = gl.getShaderInfoLog(vertexShader);
479507
if (defined(log) && (log.length > 0)) {
480-
console.log('[GL] Vertex shader compile log: ' + log);
508+
console.log(consolePrefix + 'Vertex shader compile log: ' + log);
481509
}
482510
}
483511

484512
if (logShaderCompilation) {
485513
log = gl.getShaderInfoLog(fragmentShader);
486514
if (defined(log) && (log.length > 0)) {
487-
console.log('[GL] Fragment shader compile log: ' + log);
515+
console.log(consolePrefix + 'Fragment shader compile log: ' + log);
488516
}
489517
}
490518

491519
if (logShaderCompilation) {
492520
log = gl.getProgramInfoLog(program);
493521
if (defined(log) && (log.length > 0)) {
494-
console.log('[GL] Shader program link log: ' + log);
522+
console.log(consolePrefix + 'Shader program link log: ' + log);
495523
}
496524
}
497525

@@ -644,7 +672,7 @@ define([
644672
}
645673

646674
var gl = shader._gl;
647-
var program = createAndLinkProgram(gl, shader);
675+
var program = createAndLinkProgram(gl, shader, shader._debugShaders);
648676
var numberOfVertexAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
649677
var uniforms = findUniforms(gl, program);
650678
var partitionedUniforms = partitionUniforms(uniforms.uniformsByName);

0 commit comments

Comments
 (0)