summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fShaderApiTests.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fShaderApiTests.js650
1 files changed, 650 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fShaderApiTests.js b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fShaderApiTests.js
new file mode 100644
index 0000000000..2768f0325b
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fShaderApiTests.js
@@ -0,0 +1,650 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program OpenGL ES Utilities
+ * ------------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+'use strict';
+goog.provide('functional.gles3.es3fShaderApiTests');
+goog.require('framework.common.tcuTestCase');
+goog.require('framework.delibs.debase.deRandom');
+goog.require('framework.delibs.debase.deString');
+goog.require('framework.opengl.gluShaderProgram');
+goog.require('functional.gles3.es3fApiCase');
+
+goog.scope(function() {
+var es3fShaderApiTests = functional.gles3.es3fShaderApiTests;
+var tcuTestCase = framework.common.tcuTestCase;
+var es3fApiCase = functional.gles3.es3fApiCase;
+var gluShaderProgram = framework.opengl.gluShaderProgram;
+var deRandom = framework.delibs.debase.deRandom;
+var deString = framework.delibs.debase.deString;
+
+/** @type {WebGL2RenderingContext} */ var gl;
+
+var setParentClass = function(child, parent) {
+ child.prototype = Object.create(parent.prototype);
+ child.prototype.constructor = child;
+};
+
+var getSimpleShaderSource = function(shaderType) {
+ var simpleVertexShaderSource =
+ '#version 300 es\n' +
+ 'void main (void)\n' +
+ '{\n' +
+ ' gl_Position = vec4(0.0);\n' +
+ '}\n';
+
+ var simpleFragmentShaderSource =
+ '#version 300 es\n' +
+ 'layout(location = 0) out mediump vec4 o_fragColor;\n' +
+ 'void main (void)\n' +
+ '{\n' +
+ ' o_fragColor = vec4(0.0);\n' +
+ '}\n';
+
+ switch (shaderType) {
+ case gluShaderProgram.shaderType.VERTEX:
+ return simpleVertexShaderSource;
+ case gluShaderProgram.shaderType.FRAGMENT:
+ return simpleFragmentShaderSource;
+ default:
+ throw new Error('Invalid shader type');
+ }
+};
+
+/**
+ * @constructor
+ * @extends {es3fApiCase.ApiCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.CreateShaderCase = function(name, description, shaderType) {
+ es3fApiCase.ApiCase.call(this, name, description, gl);
+ this.m_shaderType = shaderType;
+};
+
+setParentClass(es3fShaderApiTests.CreateShaderCase, es3fApiCase.ApiCase);
+
+es3fShaderApiTests.CreateShaderCase.prototype.test = function() {
+ var shaderObject = gl.createShader(gluShaderProgram.getGLShaderType(gl, this.m_shaderType));
+ this.check(shaderObject != null);
+ gl.deleteShader(shaderObject);
+};
+
+/**
+ * @constructor
+ * @extends {es3fApiCase.ApiCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.CompileShaderCase = function(name, description, shaderType) {
+ es3fApiCase.ApiCase.call(this, name, description, gl);
+ this.m_shaderType = shaderType;
+};
+
+setParentClass(es3fShaderApiTests.CompileShaderCase, es3fApiCase.ApiCase);
+
+es3fShaderApiTests.CompileShaderCase.prototype.checkCompileStatus = function(shader) {
+ var status = /** @type {boolean} */ (gl.getShaderParameter(shader, gl.COMPILE_STATUS));
+ return status;
+};
+
+es3fShaderApiTests.CompileShaderCase.prototype.test = function() {
+ var shaderObject = gl.createShader(gluShaderProgram.getGLShaderType(gl, this.m_shaderType));
+ var shaderSource = getSimpleShaderSource(this.m_shaderType);
+
+ this.check(shaderObject != null);
+
+ gl.shaderSource(shaderObject, shaderSource);
+ gl.compileShader(shaderObject);
+
+ this.check(this.checkCompileStatus(shaderObject));
+
+ gl.deleteShader(shaderObject);
+};
+
+/**
+ * @constructor
+ * @extends {es3fApiCase.ApiCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ShaderSourceReplaceCase = function(name, description, shaderType) {
+ es3fApiCase.ApiCase.call(this, name, description, gl);
+ this.m_shaderType = shaderType;
+};
+
+setParentClass(es3fShaderApiTests.ShaderSourceReplaceCase, es3fApiCase.ApiCase);
+
+es3fShaderApiTests.ShaderSourceReplaceCase.prototype.generateFirstSource = function() {
+ return getSimpleShaderSource(this.m_shaderType);
+};
+
+es3fShaderApiTests.ShaderSourceReplaceCase.prototype.generateSecondSource = function() {
+ var source = '#version 300 es\n' +
+ 'precision mediump float;\n';
+
+ if (this.m_shaderType == gluShaderProgram.shaderType.FRAGMENT)
+ source += 'layout(location = 0) out mediump vec4 o_fragColor;\n';
+
+ source += 'void main()\n'+
+ '{\n'+
+ ' float variable = 1.0f;\n';
+
+ if (this.m_shaderType == gluShaderProgram.shaderType.VERTEX) source += ' gl_Position = vec4(variable);\n';
+ else if (this.m_shaderType == gluShaderProgram.shaderType.FRAGMENT) source += ' o_fragColor = vec4(variable);\n';
+
+ source += '}\n';
+
+ return source;
+};
+
+es3fShaderApiTests.ShaderSourceReplaceCase.prototype.test = function() {
+ var shaderObject = gl.createShader(gluShaderProgram.getGLShaderType(gl, this.m_shaderType));
+ var firstSource = this.generateFirstSource();
+ var secondSource = this.generateSecondSource();
+
+ this.check(shaderObject != null);
+
+ gl.shaderSource(shaderObject, firstSource);
+ this.check(firstSource == gl.getShaderSource(shaderObject));
+
+ gl.shaderSource(shaderObject, secondSource);
+ this.check(secondSource == gl.getShaderSource(shaderObject));
+
+ gl.deleteShader(shaderObject);
+};
+
+/**
+ * @constructor
+ */
+es3fShaderApiTests.SourceGenerator = function() {};
+
+/**
+ * @param {gluShaderProgram.shaderType} shaderType
+ * @return {string}
+ */
+es3fShaderApiTests.SourceGenerator.prototype.next = function(shaderType) {
+ throw new Error('Virtual function. Please override');
+};
+
+/**
+ * @param {gluShaderProgram.shaderType} shaderType
+ * @return {boolean}
+ */
+es3fShaderApiTests.SourceGenerator.prototype.finished = function(shaderType) {
+ throw new Error('Virtual function. Please override');
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.SourceGenerator}
+ */
+es3fShaderApiTests.ConstantShaderGenerator = function(rnd) {
+ es3fShaderApiTests.SourceGenerator.call(this);
+ this.m_rnd = rnd;
+};
+
+setParentClass(es3fShaderApiTests.ConstantShaderGenerator, es3fShaderApiTests.SourceGenerator);
+
+es3fShaderApiTests.SourceGenerator.prototype.next = function(shaderType) {
+ var value = this.m_rnd.getFloat(0.0, 1.0);
+ var outputName = (shaderType == gluShaderProgram.shaderType.VERTEX) ? 'gl_Position' : 'o_fragColor';
+
+ var out = '#version 300 es\n';
+
+ if (shaderType == gluShaderProgram.shaderType.FRAGMENT)
+ out += 'layout(location = 0) out mediump vec4 o_fragColor;\n';
+
+ out += 'void main (void)\n';
+ out += '{\n';
+ out += ' ' + outputName + ' = vec4(' + value + ');\n';
+ out += '}\n';
+
+ return out;
+};
+
+es3fShaderApiTests.SourceGenerator.prototype.finished = function(shaderType) {
+ return false;
+};
+
+// Shader allocation utility
+
+/**
+ * @constructor
+ * @param {es3fShaderApiTests.SourceGenerator} generator
+ */
+es3fShaderApiTests.ShaderAllocator = function(generator) {
+ this.m_srcGen = generator;
+ this.m_shaders = {};
+};
+
+/**
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ShaderAllocator.prototype.createShader = function(shaderType) {
+ var shader = new gluShaderProgram.Shader(gl, shaderType);
+ this.m_shaders[shaderType] = shader;
+ this.setSource(shaderType);
+ return shader;
+};
+
+/**
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ShaderAllocator.prototype.deleteShader = function(shaderType) {
+ this.m_shaders[shaderType].destroy();
+ this.m_shaders[shaderType] = null;
+};
+
+/**
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ShaderAllocator.prototype.setSource = function(shaderType) {
+ var source = this.m_srcGen.next(shaderType);
+ this.m_shaders[shaderType].setSources(source);
+};
+
+/**
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ShaderAllocator.prototype.get = function(shaderType) {
+ return this.m_shaders[shaderType];
+};
+
+// Base class for simple program API tests
+
+/**
+ * @constructor
+ * @extends {es3fApiCase.ApiCase}
+ * @param {string} name
+ * @param {string} description
+ */
+es3fShaderApiTests.SimpleProgramCase = function(name, description) {
+ es3fApiCase.ApiCase.call(this, name, description, gl);
+ this.m_vertShader = null;
+ this.m_fragShader = null;
+ this.m_program = null;
+};
+
+setParentClass(es3fShaderApiTests.SimpleProgramCase, es3fApiCase.ApiCase);
+
+es3fShaderApiTests.SimpleProgramCase.prototype.compileShaders = function() {
+ var vertSource = getSimpleShaderSource(gluShaderProgram.shaderType.VERTEX);
+ var fragSource = getSimpleShaderSource(gluShaderProgram.shaderType.FRAGMENT);
+
+ var vertShader = gl.createShader(gl.VERTEX_SHADER);
+ var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
+
+ this.check(vertShader != null);
+ this.check(fragShader != null);
+
+ gl.shaderSource(vertShader, vertSource);
+ gl.compileShader(vertShader);
+
+ gl.shaderSource(fragShader, fragSource);
+ gl.compileShader(fragShader);
+
+ this.m_vertShader = vertShader;
+ this.m_fragShader = fragShader;
+};
+
+es3fShaderApiTests.SimpleProgramCase.prototype.linkProgram = function() {
+ var program = gl.createProgram();
+
+ this.check(program != null);
+
+ gl.attachShader(program, this.m_vertShader);
+ gl.attachShader(program, this.m_fragShader);
+
+ gl.linkProgram(program);
+
+ this.m_program = program;
+};
+
+es3fShaderApiTests.SimpleProgramCase.prototype.cleanup = function() {
+ gl.deleteShader(this.m_vertShader);
+ gl.deleteShader(this.m_fragShader);
+ gl.deleteProgram(this.m_program);
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.SimpleProgramCase}
+ * @param {string} name
+ * @param {string} description
+ */
+es3fShaderApiTests.DeleteShaderCase = function(name, description) {
+ es3fShaderApiTests.SimpleProgramCase.call(this, name, description);
+};
+
+setParentClass(es3fShaderApiTests.DeleteShaderCase, es3fShaderApiTests.SimpleProgramCase);
+
+es3fShaderApiTests.DeleteShaderCase.prototype.checkDeleteStatus = function(shader) {
+ var status = /** @type {boolean} */ (gl.getShaderParameter(shader, gl.DELETE_STATUS));
+ return status;
+};
+
+es3fShaderApiTests.DeleteShaderCase.prototype.deleteShaders = function() {
+ gl.deleteShader(this.m_vertShader);
+ gl.deleteShader(this.m_fragShader);
+};
+
+es3fShaderApiTests.DeleteShaderCase.prototype.test = function() {
+ this.compileShaders();
+ this.linkProgram();
+
+ this.deleteShaders();
+
+ this.check(this.checkDeleteStatus(this.m_vertShader) && this.checkDeleteStatus(this.m_fragShader));
+
+ gl.deleteProgram(this.m_program);
+
+ this.check(!(gl.isShader(this.m_vertShader) || gl.isShader(this.m_fragShader)));
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.SimpleProgramCase}
+ * @param {string} name
+ * @param {string} description
+ */
+es3fShaderApiTests.LinkVertexFragmentCase = function(name, description) {
+ es3fShaderApiTests.SimpleProgramCase.call(this, name, description);
+};
+
+setParentClass(es3fShaderApiTests.LinkVertexFragmentCase, es3fShaderApiTests.SimpleProgramCase);
+
+es3fShaderApiTests.LinkVertexFragmentCase.prototype.checkLinkStatus = function(program) {
+ var status = /** @type {boolean} */ (gl.getProgramParameter(program, gl.LINK_STATUS));
+ return status;
+};
+
+es3fShaderApiTests.LinkVertexFragmentCase.prototype.test = function() {
+ this.compileShaders();
+ this.linkProgram();
+
+ this.check(this.checkLinkStatus(this.m_program), 'Fail, expected LINK_STATUS to be TRUE.');
+
+ this.cleanup();
+};
+
+// Base class for program state persistence cases
+
+/**
+ * @constructor
+ * @extends {es3fApiCase.ApiCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateCase = function(name, description, shaderType) {
+ es3fApiCase.ApiCase.call(this, name, description, gl);
+ this.m_shaderType = shaderType;
+ this.m_rnd = new deRandom.Random(deString.deStringHash(name) ^ 0x713de0ca);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateCase, es3fApiCase.ApiCase);
+
+/**
+ * @param {gluShaderProgram.Program} program
+ * @param {es3fShaderApiTests.ShaderAllocator} shaders
+ */
+es3fShaderApiTests.ProgramStateCase.prototype.buildProgram = function(program, shaders) {
+ var vertShader = shaders.createShader(gluShaderProgram.shaderType.VERTEX);
+ var fragShader = shaders.createShader(gluShaderProgram.shaderType.FRAGMENT);
+
+ vertShader.compile();
+ fragShader.compile();
+
+ program.attachShader(vertShader.getShader());
+ program.attachShader(fragShader.getShader());
+ program.link();
+};
+
+/**
+ * @param {gluShaderProgram.Program} program
+ * @param {gluShaderProgram.ProgramInfo} reference
+ */
+es3fShaderApiTests.ProgramStateCase.prototype.verify = function(program, reference) {
+ var programInfo = program.getInfo();
+ this.check(programInfo.linkOk, 'Fail, link status may only change as a result of linking');
+
+ this.check(programInfo.linkTimeUs == reference.linkTimeUs, 'Fail, reported link time changed.');
+
+ this.check(programInfo.infoLog == reference.infoLog, 'Fail, program infolog changed.');
+};
+
+es3fShaderApiTests.ProgramStateCase.prototype.test = function() {
+ var sourceGen = new es3fShaderApiTests.ConstantShaderGenerator(this.m_rnd);
+
+ var shaders = new es3fShaderApiTests.ShaderAllocator(sourceGen);
+ var program = new gluShaderProgram.Program(gl);
+
+ this.buildProgram(program, shaders);
+
+ if (program.getLinkStatus()) {
+ var programInfo = program.getInfo();
+
+ this.executeForProgram(program, shaders);
+
+ this.verify(program, programInfo);
+
+ } else{
+ this.check(false, "Fail, couldn't link program.");
+ }
+
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.ProgramStateCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateDetachShaderCase = function(name, description, shaderType) {
+ es3fShaderApiTests.ProgramStateCase.call(this, name, description, shaderType);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateDetachShaderCase, es3fShaderApiTests.ProgramStateCase);
+
+es3fShaderApiTests.ProgramStateDetachShaderCase.prototype.executeForProgram = function(program, shaders) {
+ var caseShader = shaders.get(this.m_shaderType);
+ program.detachShader(caseShader.getShader());
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.ProgramStateCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateReattachShaderCase = function(name, description, shaderType) {
+ es3fShaderApiTests.ProgramStateCase.call(this, name, description, shaderType);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateReattachShaderCase, es3fShaderApiTests.ProgramStateCase);
+
+es3fShaderApiTests.ProgramStateReattachShaderCase.prototype.executeForProgram = function(program, shaders) {
+ var caseShader = shaders.get(this.m_shaderType);
+ program.detachShader(caseShader.getShader());
+ program.attachShader(caseShader.getShader());
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.ProgramStateCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateDeleteShaderCase = function(name, description, shaderType) {
+ es3fShaderApiTests.ProgramStateCase.call(this, name, description, shaderType);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateDeleteShaderCase, es3fShaderApiTests.ProgramStateCase);
+
+es3fShaderApiTests.ProgramStateDeleteShaderCase.prototype.executeForProgram = function(program, shaders) {
+ var caseShader = shaders.get(this.m_shaderType);
+ program.detachShader(caseShader.getShader());
+ shaders.deleteShader(this.m_shaderType);
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.ProgramStateCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateReplaceShaderCase = function(name, description, shaderType) {
+ es3fShaderApiTests.ProgramStateCase.call(this, name, description, shaderType);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateReplaceShaderCase, es3fShaderApiTests.ProgramStateCase);
+
+es3fShaderApiTests.ProgramStateReplaceShaderCase.prototype.executeForProgram = function(program, shaders) {
+ var caseShader = shaders.get(this.m_shaderType);
+ program.detachShader(caseShader.getShader());
+ shaders.deleteShader(this.m_shaderType);
+ program.attachShader(shaders.createShader(this.m_shaderType).getShader());
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.ProgramStateCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateRecompileShaderCase = function(name, description, shaderType) {
+ es3fShaderApiTests.ProgramStateCase.call(this, name, description, shaderType);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateRecompileShaderCase, es3fShaderApiTests.ProgramStateCase);
+
+es3fShaderApiTests.ProgramStateRecompileShaderCase.prototype.executeForProgram = function(program, shaders) {
+ var caseShader = shaders.get(this.m_shaderType);
+ caseShader.compile();
+};
+
+/**
+ * @constructor
+ * @extends {es3fShaderApiTests.ProgramStateCase}
+ * @param {string} name
+ * @param {string} description
+ * @param {gluShaderProgram.shaderType} shaderType
+ */
+es3fShaderApiTests.ProgramStateReplaceSourceCase = function(name, description, shaderType) {
+ es3fShaderApiTests.ProgramStateCase.call(this, name, description, shaderType);
+};
+
+setParentClass(es3fShaderApiTests.ProgramStateReplaceSourceCase, es3fShaderApiTests.ProgramStateCase);
+
+es3fShaderApiTests.ProgramStateReplaceSourceCase.prototype.executeForProgram = function(program, shaders) {
+ var caseShader = shaders.get(this.m_shaderType);
+ shaders.setSource(this.m_shaderType);
+ caseShader.compile();
+};
+
+/**
+* @constructor
+* @extends {tcuTestCase.DeqpTest}
+*/
+es3fShaderApiTests.ShaderApiTests = function() {
+ tcuTestCase.DeqpTest.call(this, 'shader_api', 'Shader API Cases');
+};
+
+es3fShaderApiTests.ShaderApiTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
+es3fShaderApiTests.ShaderApiTests.prototype.constructor = es3fShaderApiTests.ShaderApiTests;
+
+es3fShaderApiTests.ShaderApiTests.prototype.init = function() {
+ // create and delete shaders
+ var createDeleteGroup = new tcuTestCase.DeqpTest('create_delete', 'glCreateShader() tests');
+ this.addChild(createDeleteGroup);
+
+ createDeleteGroup.addChild(new es3fShaderApiTests.CreateShaderCase('create_vertex_shader', 'Create vertex shader object', gluShaderProgram.shaderType.VERTEX));
+ createDeleteGroup.addChild(new es3fShaderApiTests.CreateShaderCase('create_fragment_shader', 'Create fragment shader object', gluShaderProgram.shaderType.FRAGMENT));
+
+ createDeleteGroup.addChild(new es3fShaderApiTests.DeleteShaderCase('delete_vertex_fragment', 'Delete vertex shader and fragment shader'));
+
+ // compile and link
+ var compileLinkGroup = new tcuTestCase.DeqpTest('compile_link', 'Compile and link tests');
+ this.addChild(compileLinkGroup);
+
+ compileLinkGroup.addChild(new es3fShaderApiTests.CompileShaderCase('compile_vertex_shader', 'Compile vertex shader', gluShaderProgram.shaderType.VERTEX));
+ compileLinkGroup.addChild(new es3fShaderApiTests.CompileShaderCase('compile_fragment_shader', 'Compile fragment shader', gluShaderProgram.shaderType.FRAGMENT));
+
+ compileLinkGroup.addChild(new es3fShaderApiTests.LinkVertexFragmentCase('link_vertex_fragment', 'Link vertex and fragment shaders'));
+
+ // shader source
+ var shaderSourceGroup = new tcuTestCase.DeqpTest('shader_source', 'glShaderSource() tests');
+ this.addChild(shaderSourceGroup);
+ shaderSourceGroup.addChild(new es3fShaderApiTests.ShaderSourceReplaceCase('replace_source_vertex', 'Replace source code of vertex shader', gluShaderProgram.shaderType.VERTEX));
+ shaderSourceGroup.addChild(new es3fShaderApiTests.ShaderSourceReplaceCase('replace_source_fragment', 'Replace source code of fragment shader', gluShaderProgram.shaderType.FRAGMENT));
+
+ // link status and infolog
+ var linkStatusGroup = new tcuTestCase.DeqpTest('program_state', 'Program state persistence tests');
+ this.addChild(linkStatusGroup);
+
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateDetachShaderCase('detach_shader_vertex', 'detach vertex shader', gluShaderProgram.shaderType.VERTEX));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateReattachShaderCase('reattach_shader_vertex', 'reattach vertex shader', gluShaderProgram.shaderType.VERTEX));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateDeleteShaderCase('delete_shader_vertex', 'delete vertex shader', gluShaderProgram.shaderType.VERTEX));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateReplaceShaderCase('replace_shader_vertex', 'replace vertex shader object', gluShaderProgram.shaderType.VERTEX));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateRecompileShaderCase('recompile_shader_vertex', 'recompile vertex shader', gluShaderProgram.shaderType.VERTEX));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateReplaceSourceCase('replace_source_vertex', 'replace vertex shader source', gluShaderProgram.shaderType.VERTEX));
+
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateDetachShaderCase('detach_shader_fragment', 'detach fragment shader', gluShaderProgram.shaderType.FRAGMENT));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateReattachShaderCase('reattach_shader_fragment', 'reattach fragment shader', gluShaderProgram.shaderType.FRAGMENT));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateDeleteShaderCase('delete_shader_fragment', 'delete fragment shader', gluShaderProgram.shaderType.FRAGMENT));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateReplaceShaderCase('replace_shader_fragment', 'replace fragment shader object', gluShaderProgram.shaderType.FRAGMENT));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateRecompileShaderCase('recompile_shader_fragment', 'recompile fragment shader', gluShaderProgram.shaderType.FRAGMENT));
+ linkStatusGroup.addChild(new es3fShaderApiTests.ProgramStateReplaceSourceCase('replace_source_fragment', 'replace fragment shader source', gluShaderProgram.shaderType.FRAGMENT));
+
+};
+
+/**
+* Run test
+* @param {WebGL2RenderingContext} context
+*/
+es3fShaderApiTests.run = function(context) {
+ gl = context;
+ //Set up Test Root parameters
+ var state = tcuTestCase.runner;
+ state.setRoot(new es3fShaderApiTests.ShaderApiTests());
+
+ //Set up name and description of this test series.
+ setCurrentTestName(state.testCases.fullName());
+ description(state.testCases.getDescription());
+
+ try {
+ //Run test cases
+ tcuTestCase.runTestCases();
+ }
+ catch (err) {
+ testFailedOptions('Failed to es3fShaderApiTests.run tests', false);
+ tcuTestCase.runner.terminate();
+ }
+};
+
+});