Skip to content

Commit

Permalink
Merge pull request #2237 from AnalyticalGraphicsInc/debug-shaders
Browse files Browse the repository at this point in the history
Support for WEBGL_debug_shaders
  • Loading branch information
bagnell committed Oct 31, 2014
2 parents a51837a + fc8bc86 commit 0886cec
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
8 changes: 8 additions & 0 deletions Source/Renderer/Context.js
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,8 @@ define([
this._maximumDrawBuffers = defined(this._drawBuffers) ? gl.getParameter(this._drawBuffers.MAX_DRAW_BUFFERS_WEBGL) : 1;
this._maximumColorAttachments = defined(this._drawBuffers) ? gl.getParameter(this._drawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL) : 1; // min when supported: 4

this._debugShaders = getExtension(gl, ['WEBGL_debug_shaders']);

var cc = gl.getParameter(gl.COLOR_CLEAR_VALUE);
this._clearColor = new Color(cc[0], cc[1], cc[2], cc[3]);
this._clearDepth = gl.getParameter(gl.DEPTH_CLEAR_VALUE);
Expand Down Expand Up @@ -825,6 +827,12 @@ define([
}
},

debugShaders : {
get : function() {
return this._debugShaders;
}
},

throwOnWebGLError : {
get : function() {
return this._throwOnWebGLError;
Expand Down
1 change: 1 addition & 0 deletions Source/Renderer/ShaderCache.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ define([
var shaderProgram = new ShaderProgram({
gl : context._gl,
logShaderCompilation : context.logShaderCompilation,
debugShaders : context.debugShaders,
vertexShaderSource : vertexShaderSource,
vertexShaderText : vertexShaderText,
fragmentShaderSource : fragmentShaderSource,
Expand Down
42 changes: 35 additions & 7 deletions Source/Renderer/ShaderProgram.js
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,7 @@ define([
var ShaderProgram = function(options) {
this._gl = options.gl;
this._logShaderCompilation = options.logShaderCompilation;
this._debugShaders = options.debugShaders;
this._attributeLocations = options.attributeLocations;

this._program = undefined;
Expand Down Expand Up @@ -419,6 +420,8 @@ define([
}
});

var consolePrefix = '[Cesium WebGL] ';

function createAndLinkProgram(gl, shader) {
var vsSource = shader._vertexShaderText;
var fsSource = shader._fragmentShaderText;
Expand Down Expand Up @@ -451,24 +454,49 @@ define([

var log;
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
var debugShaders = shader._debugShaders;

// For performance, only check compile errors if there is a linker error.
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
log = gl.getShaderInfoLog(fragmentShader);
console.error(consolePrefix + 'Fragment shader compile log: ' + log);
if (defined(debugShaders)) {
var fragmentSourceTranslation = debugShaders.getTranslatedShaderSource(fragmentShader);
if (fragmentSourceTranslation !== '') {
console.error(consolePrefix + 'Translated fragment shader source:\n' + fragmentSourceTranslation);
} else {
console.error(consolePrefix + 'Fragment shader translation failed.');
}
}

gl.deleteProgram(program);
console.error('[GL] Fragment shader compile log: ' + log);
throw new RuntimeError('Fragment shader failed to compile. Compile log: ' + log);
}

if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
log = gl.getShaderInfoLog(vertexShader);
console.error(consolePrefix + 'Vertex shader compile log: ' + log);
if (defined(debugShaders)) {
var vertexSourceTranslation = debugShaders.getTranslatedShaderSource(vertexShader);
if (vertexSourceTranslation !== '') {
console.error(consolePrefix + 'Translated vertex shader source:\n' + vertexSourceTranslation);
} else {
console.error(consolePrefix + 'Vertex shader translation failed.');
}
}

gl.deleteProgram(program);
console.error('[GL] Vertex shader compile log: ' + log);
throw new RuntimeError('Vertex shader failed to compile. Compile log: ' + log);
}

log = gl.getProgramInfoLog(program);
console.error(consolePrefix + 'Shader program link log: ' + log);
if (defined(debugShaders)) {
console.error(consolePrefix + 'Translated vertex shader source:\n' + debugShaders.getTranslatedShaderSource(vertexShader));
console.error(consolePrefix + 'Translated fragment shader source:\n' + debugShaders.getTranslatedShaderSource(fragmentShader));
}

gl.deleteProgram(program);
console.error('[GL] Shader program link log: ' + log);
throw new RuntimeError('Program failed to link. Link log: ' + log);
}

Expand All @@ -477,21 +505,21 @@ define([
if (logShaderCompilation) {
log = gl.getShaderInfoLog(vertexShader);
if (defined(log) && (log.length > 0)) {
console.log('[GL] Vertex shader compile log: ' + log);
console.log(consolePrefix + 'Vertex shader compile log: ' + log);
}
}

if (logShaderCompilation) {
log = gl.getShaderInfoLog(fragmentShader);
if (defined(log) && (log.length > 0)) {
console.log('[GL] Fragment shader compile log: ' + log);
console.log(consolePrefix + 'Fragment shader compile log: ' + log);
}
}

if (logShaderCompilation) {
log = gl.getProgramInfoLog(program);
if (defined(log) && (log.length > 0)) {
console.log('[GL] Shader program link log: ' + log);
console.log(consolePrefix + 'Shader program link log: ' + log);
}
}

Expand Down Expand Up @@ -644,7 +672,7 @@ define([
}

var gl = shader._gl;
var program = createAndLinkProgram(gl, shader);
var program = createAndLinkProgram(gl, shader, shader._debugShaders);
var numberOfVertexAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
var uniforms = findUniforms(gl, program);
var partitionedUniforms = partitionUniforms(uniforms.uniformsByName);
Expand Down

0 comments on commit 0886cec

Please sign in to comment.