From 8866bdab7cf8aea0386dc4ca5831ea02f999df8c Mon Sep 17 00:00:00 2001 From: Kenneth Russell Date: Fri, 4 Sep 2015 19:48:01 -0700 Subject: [PATCH] Fixed bugs affecting transform feedback test. - Don't resume transform feedback after every draw call. - Fixed vector type iteration in es3fTransformFeedbackTests.isProgramSupported. - Fixed bug in es3fTransformFeedbackTests.hasArraysInTFVaryings. - Fixed ShaderProgram.isOk() to properly report link errors. - Dump program info log if link fails. --- .../deqp/framework/opengl/gluShaderProgram.js | 9 +++- .../gles3/es3fTransformFeedbackTests.js | 42 ++++++++++++------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/sdk/tests/deqp/framework/opengl/gluShaderProgram.js b/sdk/tests/deqp/framework/opengl/gluShaderProgram.js index 40e1c0608b..0735966be0 100644 --- a/sdk/tests/deqp/framework/opengl/gluShaderProgram.js +++ b/sdk/tests/deqp/framework/opengl/gluShaderProgram.js @@ -214,6 +214,13 @@ gluShaderProgram.Program.prototype.link = function() { this.info.infoLog = this.gl.getProgramInfoLog(this.program); }; +/** + * return {boolean} + */ +gluShaderProgram.Program.prototype.getLinkStatus = function() { + return this.info.linkOk; +}; + /** * @param {Array} varyings * @param {number} bufferMode @@ -285,7 +292,7 @@ gluShaderProgram.ShaderProgram.prototype.getProgramInfo = function() { }; gluShaderProgram.ShaderProgram.prototype.isOk = function() { - return this.shadersOK; + return this.shadersOK && this.program.getLinkStatus(); }; gluShaderProgram.containerTypes = { diff --git a/sdk/tests/deqp/functional/gles3/es3fTransformFeedbackTests.js b/sdk/tests/deqp/functional/gles3/es3fTransformFeedbackTests.js index 71039f9a54..1938a17546 100644 --- a/sdk/tests/deqp/functional/gles3/es3fTransformFeedbackTests.js +++ b/sdk/tests/deqp/functional/gles3/es3fTransformFeedbackTests.js @@ -212,7 +212,7 @@ goog.scope(function() { ); for (var i = 0; i < spec.getVaryings().length; ++i) { - for (var v_iter = new gluVarTypeUtil.VectorTypeIterator(spec.getVaryings()[i]); !v_iter.end(); v_iter.next()) { + for (var v_iter = new gluVarTypeUtil.VectorTypeIterator(spec.getVaryings()[i].type); !v_iter.end(); v_iter.next()) { totalVertexAttribs += 1; } } @@ -868,6 +868,18 @@ goog.scope(function() { setParentClass(es3fTransformFeedbackTests.TransformFeedbackCase, tcuTestCase.DeqpTest); + es3fTransformFeedbackTests.TransformFeedbackCase.prototype.dumpShaderText = function() { + var dbgext = gl.getExtension('WEBGL_debug_shaders'); + for (var ii = 0; ii < this.m_program.shaders.length; ++ii) { + debug('Shader source ' + ii + ' before translation:') + debug(this.m_program.shaders[ii].info.source); + debug(''); + debug('Shader source ' + ii + ' after translation:'); + debug(dbgext.getTranslatedShaderSource(this.m_program.shaders[ii].shader)); + } + }; + + es3fTransformFeedbackTests.TransformFeedbackCase.prototype.init = function() { this.m_program = es3fTransformFeedbackTests.createVertexCaptureProgram( this.m_progSpec, @@ -876,6 +888,7 @@ goog.scope(function() { ); if (!this.m_program.isOk()) { + // this.dumpShaderText(); var linkFail = this.m_program.shadersOK && !this.m_program.getProgramInfo().linkOk; @@ -886,20 +899,15 @@ goog.scope(function() { } else if (es3fTransformFeedbackTests.hasArraysInTFVaryings(this.m_progSpec)) { throw new Error('Capturing arrays is not supported (undefined in specification)'); } else { - throw new Error('Link failed'); + throw new Error('Link failed: ' + this.m_program.getProgramInfo().infoLog); } } else { throw new Error('Compile failed'); } } else { - // var dbgext = gl.getExtension('WEBGL_debug_shaders'); - // for (var ii = 0; ii < this.m_program.shaders.length; ++ii) { - // debug('Shader source ' + ii + ' before translation:') - // debug(this.m_program.shaders[ii].info.source); - // debug(''); - // debug('Shader source ' + ii + ' after translation:'); - // debug(dbgext.getTranslatedShaderSource(this.m_program.shaders[ii].shader)); - // } + // debug('Program is ' + + // (gl.getProgramParameter(this.m_program.getProgram(), gl.LINK_STATUS) ? 'linked' : 'not linked')); + // this.dumpShaderText(); } // bufferedLogToConsole('Transform feedback varyings: ' + tcu.formatArray(this.m_progSpec.getTransformFeedbackVaryings())); @@ -994,6 +1002,8 @@ goog.scope(function() { // fail the test testFailedOptions('Result comparison failed', false); // this.m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, 'Result comparison failed'); + } else { + testPassedOptions('Result comparison succeeded', true); } this.m_iterNdx += 1; @@ -1121,12 +1131,12 @@ goog.scope(function() { gl.drawArrays(gluDrawUtil.getPrimitiveGLType(gl, this.m_primitiveType), offset, call.numElements); offset += call.numElements; - - // Resume feedback before finishing it. - if (!tfEnabled) - gl.resumeTransformFeedback(); } + // Resume feedback before finishing it. + if (!tfEnabled) + gl.resumeTransformFeedback(); + gl.endTransformFeedback(); gl.endQuery(gl.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); @@ -1318,7 +1328,9 @@ goog.scope(function() { var tfVar = spec.getTransformFeedbackVaryings()[i]; var varName = gluVarTypeUtil.parseVariableName(tfVar); - if (es3fTransformFeedbackTests.findAttributeNameEquals(spec.getVaryings(), varName)) return true; + var attr = es3fTransformFeedbackTests.findAttributeNameEquals(spec.getVaryings(), varName); + if (attr && attr.type.isArrayType()) + return true; } return false;