Index: conformance/uniforms/gl-uniform-arrays.html |
=================================================================== |
--- conformance/uniforms/gl-uniform-arrays.html (revision 0) |
+++ conformance/uniforms/gl-uniform-arrays.html (revision 0) |
@@ -0,0 +1,302 @@ |
+<!-- |
+Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+Use of this source code is governed by a BSD-style license that can be |
+found in the LICENSE file. |
+ --> |
+<!DOCTYPE html> |
+<html> |
+<head> |
+<meta charset="utf-8"> |
+<title>WebGL uniform array Conformance Tests</title> |
+<link rel="stylesheet" href="../../resources/js-test-style.css"/> |
+<script src="../../resources/js-test-pre.js"></script> |
+<script src="../resources/webgl-test.js"></script> |
+</head> |
+<body> |
+<div id="description"></div> |
+<div id="console"></div> |
+<canvas id="example" width="2" height="2"> </canvas> |
+<script id="vshader" type="x-shader/x-vertex"> |
+ attribute vec4 vPosition; |
+ void main() |
+ { |
+ gl_Position = vPosition; |
+ } |
+</script> |
+ |
+<script id="fshader" type="x-shader/x-fragment"> |
+ precision mediump float; |
+ uniform $type color[3]; |
+ void main() |
+ { |
+ gl_FragColor = vec4(color[0]$elem, color[1]$elem, color[2]$elem, 1); |
+ } |
+</script> |
+<script> |
+function loadShader(ctx, shaderType, shaderSource) { |
+ // Create the shader object |
+ var shader = ctx.createShader(shaderType); |
+ if (shader == null) { |
+ debug("*** Error: unable to create shader '"+shader+"'"); |
+ return null; |
+ } |
+ |
+ // Load the shader source |
+ ctx.shaderSource(shader, shaderSource); |
+ |
+ // Compile the shader |
+ ctx.compileShader(shader); |
+ |
+ // Check the compile status |
+ var compiled = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS); |
+ if (!compiled) { |
+ // Something went wrong during compilation; get the error |
+ var error = ctx.getShaderInfoLog(shader); |
+ debug("*** Error compiling shader '"+shader+"':"+error); |
+ ctx.deleteShader(shader); |
+ return null; |
+ } |
+ |
+ return shader; |
+} |
+ |
+function loadProgram(ctx, vertexShaderSrc, fragmentShaderSrc) { |
+ var program = ctx.createProgram(); |
+ var vShader = loadShader(ctx, ctx.VERTEX_SHADER, vertexShaderSrc) |
+ var fShader = loadShader(ctx, ctx.FRAGMENT_SHADER, fragmentShaderSrc); |
+ ctx.attachShader(program, vShader); |
+ ctx.attachShader(program, fShader); |
+ ctx.linkProgram(program); |
+ var linked = ctx.getProgramParameter(program, ctx.LINK_STATUS); |
+ if (!linked) { |
+ // something went wrong with the link |
+ var error = ctx.getProgramInfoLog (ctx.program); |
+ debug("Error in program linking:" + error); |
+ ctx.deleteProgram(ctx.program); |
+ program = null; |
+ } |
+// ctx.deleteShader(fShader); |
+// ctx.deleteShader(vShader); |
+ return program; |
+} |
+ |
+description("This test ensures WebGL implementations handle uniform arrays correctly."); |
+ |
+debug(""); |
+ |
+var gl = create3DContext(document.getElementById("example")); |
+ |
+var vSrc = document.getElementById("vshader").text; |
+var fTemplate = document.getElementById("fshader").text; |
+ |
+var typeInfos = [ |
+ { type: 'float', |
+ jsTypeOf: 'number', |
+ setter: 'uniform1fv', |
+ elem: '', |
+ numSrcValues: 3, |
+ invalidSet: function(loc) { |
+ gl.uniform2fv(loc, [1, 2]); |
+ }, |
+ srcValueAsString: function(index, srcValues) { |
+ return srcValues[index].toString(); |
+ }, |
+ returnValueAsString: function(value) { |
+ return value === null ? 'null' : value.toString(); |
+ }, |
+ checkType: function(value) { |
+ return typeof value === 'number'; |
+ }, |
+ checkValue: function(typeInfo, index, value) { |
+ return typeInfo.srcValues[index] == value; |
+ }, |
+ srcValues: [16, 15, 14], |
+ srcValuesLess: [], |
+ srcValuesNonMultiple: null, |
+ }, |
+ { type: 'vec2', |
+ jsTypeOf: 'Float32Array', |
+ setter: 'uniform2fv', |
+ elem: '[1]', |
+ numSrcValues: 3, |
+ invalidSet: function(loc) { |
+ gl.uniform1fv(loc, [2]); |
+ }, |
+ illegalSet: function(loc) { |
+ gl.uniform1fv(loc, 2); |
+ }, |
+ srcValueAsString: function(index, srcValues) { |
+ return "[" + srcValues[index * 2 + 0].toString() + ", " + |
+ srcValues[index * 2 + 1].toString() + "]"; |
+ }, |
+ returnValueAsString: function(value) { |
+ return value === null ? 'null' : ("[" + value[0] + ", " + value[1] + "]"); |
+ }, |
+ checkType: function(value) { |
+ return value && |
+ typeof value.length === 'number' && |
+ value.length == 2; |
+ }, |
+ checkValue: function(typeInfo, index, value) { |
+ return value !== null && |
+ typeInfo.srcValues[index * 2 + 0] == value[0] && |
+ typeInfo.srcValues[index * 2 + 1] == value[1]; |
+ }, |
+ srcValues: [16, 15, 14, 13, 12, 11], |
+ srcValuesLess: [16], |
+ srcValuesNonMultiple: [16, 15, 14, 13, 12, 11, 10], |
+ }, |
+ { type: 'vec3', |
+ jsTypeOf: 'Float32Array', |
+ setter: 'uniform3fv', |
+ elem: '[2]', |
+ numSrcValues: 3, |
+ invalidSet: function(loc) { |
+ gl.uniform1fv(loc, [2]); |
+ }, |
+ illegalSet: function(loc) { |
+ gl.uniform1fv(loc, 2); |
+ }, |
+ srcValueAsString: function(index, srcValues) { |
+ return "[" + srcValues[index * 3 + 0].toString() + ", " + |
+ srcValues[index * 3 + 1].toString() + ", " + |
+ srcValues[index * 3 + 2].toString() + "]"; |
+ }, |
+ returnValueAsString: function(value) { |
+ return value === null ? 'null' : |
+ ("[" + value[0] + ", " + value[1] + ", " + value[2] + "]"); |
+ }, |
+ checkType: function(value) { |
+ return value && |
+ typeof value.length === 'number' && |
+ value.length == 3; |
+ }, |
+ checkValue: function(typeInfo, index, value) { |
+ return value !== null && |
+ typeInfo.srcValues[index * 3 + 0] == value[0] && |
+ typeInfo.srcValues[index * 3 + 1] == value[1] && |
+ typeInfo.srcValues[index * 3 + 2] == value[2]; |
+ }, |
+ srcValues: [16, 15, 14, 13, 12, 11, 10, 9, 8], |
+ srcValuesLess: [16, 15], |
+ srcValuesNonMultiple: [16, 15, 14, 13, 12, 11, 10, 9, 8, 7], |
+ }, |
+ { type: 'vec4', |
+ jsTypeOf: 'Float32Array', |
+ setter: 'uniform4fv', |
+ elem: '[3]', |
+ numSrcValues: 3, |
+ invalidSet: function(loc) { |
+ gl.uniform1fv(loc, [2]); |
+ }, |
+ illegalSet: function(loc) { |
+ gl.uniform1fv(loc, 2); |
+ }, |
+ srcValueAsString: function(index, srcValues) { |
+ return "[" + srcValues[index * 4 + 0].toString() + ", " + |
+ srcValues[index * 4 + 1].toString() + ", " + |
+ srcValues[index * 4 + 2].toString() + ", " + |
+ srcValues[index * 4 + 3].toString() + "]"; |
+ }, |
+ returnValueAsString: function(value) { |
+ return value === null ? 'null' : |
+ ("[" + value[0] + ", " + value[1] + |
+ ", " + value[2] + ", " + value[3] + "]"); |
+ }, |
+ checkType: function(value) { |
+ return value && |
+ typeof value.length === 'number' && |
+ value.length == 4; |
+ }, |
+ checkValue: function(typeInfo, index, value) { |
+ return value !== null && |
+ typeInfo.srcValues[index * 4 + 0] == value[0] && |
+ typeInfo.srcValues[index * 4 + 1] == value[1] && |
+ typeInfo.srcValues[index * 4 + 2] == value[2] && |
+ typeInfo.srcValues[index * 4 + 3] == value[3]; |
+ }, |
+ srcValues: [16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5], |
+ srcValuesLess: [16, 15, 14], |
+ srcValuesNonMultiple: [16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4], |
+ } |
+]; |
+ |
+for (var tt = 0; tt < typeInfos.length; ++tt) { |
+ var typeInfo = typeInfos[tt]; |
+ debug(""); |
+ debug("check " + typeInfo.type); |
+ var fSrc = fTemplate.replace(/\$type/g, typeInfo.type). |
+ replace(/\$elem/g, typeInfo.elem); |
+ //debug("fSrc: " + fSrc); |
+ var program = loadProgram(gl, vSrc, fSrc); |
+ |
+ var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); |
+ assertMsg(numUniforms == 1, "1 uniform found"); |
+ var info = gl.getActiveUniform(program, 0); |
+ assertMsg(info.name == "color[0]", |
+ "uniform name is 'color[0]' not 'color' as per OpenGL ES 2.0.24 section 2.10"); |
+ var loc = gl.getUniformLocation(program, "color[0]"); |
+ var srcValues = typeInfo.srcValues; |
+ var srcValuesLess = typeInfo.srcValuesLess; |
+ var srcValuesNonMultiple = typeInfo.srcValuesNonMultiple; |
+ |
+ // Try setting the value before using the program |
+ gl[typeInfo.setter](loc, srcValues); |
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, |
+ "should fail if there is no current program"); |
+ |
+ gl.useProgram(program); |
+ gl[typeInfo.setter](loc, srcValuesLess); |
+ glErrorShouldBe(gl, gl.INVALID_VALUE, |
+ "should fail with insufficient array size with gl." + typeInfo.setter); |
+ if (srcValuesNonMultiple) { |
+ gl[typeInfo.setter](loc, srcValuesNonMultiple); |
+ glErrorShouldBe(gl, gl.INVALID_VALUE, |
+ "should fail with non-multiple array size with gl." + typeInfo.setter); |
+ } |
+ gl[typeInfo.setter](loc, srcValues); |
+ glErrorShouldBe(gl, gl.NO_ERROR, |
+ "can set an array of uniforms with gl." + typeInfo.setter); |
+ var values = gl.getUniform(program, loc); |
+ glErrorShouldBe(gl, gl.NO_ERROR, |
+ "can call gl.getUniform"); |
+ assertMsg(typeInfo.checkType(values), |
+ "gl.getUniform returns the correct type."); |
+ for (var ii = 0; ii < typeInfo.numSrcValues; ++ii) { |
+ var elemLoc = gl.getUniformLocation(program, "color[" + ii + "]"); |
+ glErrorShouldBe(gl, gl.NO_ERROR, |
+ "can get location of element " + ii + |
+ " of array from gl.getUniformLocation"); |
+ var value = gl.getUniform(program, elemLoc); |
+ glErrorShouldBe(gl, gl.NO_ERROR, |
+ "can get value of element " + ii + " of array from gl.getUniform"); |
+ assertMsg(typeInfo.checkValue(typeInfo, ii, value), |
+ "value put in (" + typeInfo.srcValueAsString(ii, srcValues) + |
+ ") matches value pulled out (" + |
+ typeInfo.returnValueAsString(value) + ")"); |
+ } |
+ typeInfo.invalidSet(loc); |
+ glErrorShouldBe(gl, gl.INVALID_OPERATION, |
+ "using the wrong size of gl.Uniform fails"); |
+ var exceptionCaught = false; |
+ if (typeInfo.illegalSet) { |
+ try { |
+ typeInfo.illegalSet(loc); |
+ } catch (e) { |
+ exceptionCaught = true; |
+ } |
+ assertMsg(exceptionCaught, "passing non-array to glUniform*fv should throw TypeError"); |
+ } |
+ |
+ gl.useProgram(null); |
+ glErrorShouldBe(gl, gl.NO_ERROR, |
+ "can call gl.useProgram(null)"); |
+} |
+debug(""); |
+successfullyParsed = true; |
+ |
+</script> |
+<script src="../../resources/js-test-post.js"></script> |
+ |
+</body> |
+</html> |
Property changes on: conformance/uniforms/gl-uniform-arrays.html |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |