<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--

/*
** Copyright (c) 2012 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

-->
<link rel="stylesheet" type="text/css" href="../unit.css" />
<script type="application/x-javascript" src="../unit.js"></script>
<script type="application/x-javascript" src="../util.js"></script>
<script type="application/x-javascript">

Tests.startUnit = function () {
  var canvas = document.getElementById('gl');
  var gl = wrapGLContext(getGLContext(canvas));
  return [gl];
}

Tests.testUniformArray = function(gl) {
    var sh = new Filter(gl, 'foobar-vert', 'foobar-frag');
    sh.apply(function(f){
        var uniV4 = f.uniform('uniV4');
        var uniFloat = f.uniform('uniFloat');
        assertOk("1fv on 1fv",
            function(){gl.uniform1fv(uniFloat, [2]);});
        assertOk("5 values on 1fv",
            function(){gl.uniform1fv(uniFloat, [2,3,4,5,6]);});
        assertOk("4fv on 4fv",
            function(){gl.uniform4fv(uniV4, [1, 2, 3, 4]);});
        assertOk("8 values on 4fv",
            function(){gl.uniform4fv(uniV4, [1, 2, 3, 4, 5, 6, 7, 8]);});

    var uniformsFound = 0;
    var numUniforms = gl.getProgramParameter(f.shader.program, gl.ACTIVE_UNIFORMS);
    for (var i = 0; i < numUniforms; ++i) {
        var uniformName = gl.getActiveUniform(f.shader.program, i).name;
        if (uniformName.indexOf('uniV4') == 0 || uniformName.indexOf('uniFloat') == 0) {
            assert("Uniform array of length 1 ends with [0]", uniformName.indexOf("[0]") != -1);
            ++uniformsFound;
        }
    }
    assert("Both uniforms found", uniformsFound == 2);

        uniV4 = f.uniform('uniV4[0]');
        uniFloat = f.uniform('uniFloat[0]');
        assertOk("1fv on 1fv",
            function(){gl.uniform1fv(uniFloat, [2]);});
        assertOk("5 values on 1fv",
            function(){gl.uniform1fv(uniFloat, [2,3,4,5,6]);});
        assertOk("4fv on 4fv",
            function(){gl.uniform4fv(uniV4, [1, 2, 3, 4]);});
        assertOk("8 values on 4fv",
            function(){gl.uniform4fv(uniV4, [1, 2, 3, 4, 5, 6, 7, 8]);});

    });
    var d = new Uint8Array(4);
    gl.readPixels(0,0,1,1,gl.RGBA, gl.UNSIGNED_BYTE, d);
    assertArrayEquals([1,2,3,8], d);
    sh.destroy();
    throwError(gl);
}

Tests.endUnit = function(gl) {
}

</script>
<script id="foobar-vert" type="x-shader/x-vertex">
attribute vec3 Vertex;
attribute vec2 Tex;

uniform float uniFloat[1];

varying vec4 texCoord0;
void main()
{
    texCoord0 = vec4(Tex.s, 1.0-Tex.t, uniFloat[0], 0.0);
    gl_Position = vec4(Vertex, 1.0);
}
</script>
<script id="foobar-frag" type="x-shader/x-fragment">
precision mediump float;

uniform vec4 uniV4[1];

varying vec4 texCoord0;
void main()
{
    gl_FragColor = vec4(
        uniV4[0].r/255.0,
        uniV4[0].g/255.0,
        uniV4[0].b/255.0,
        uniV4[0].a*texCoord0.z/255.0);
}
</script>
<style>canvas{ position:absolute; }</style>
</head><body>
<canvas id="gl" width="16" height="16"></canvas>
</body></html>
