<!--

/*
** 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.
*/

-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- This is a visual test that programs must have both a vertex and
     fragment shader attached; the fixed function pipeline on the
     desktop must remain disabled. -->
<script type="text/javascript">
    function log() {
	var s = "";
	for (var i = 0; i < arguments.length; ++i) {
            s += arguments[i] + " ";
	}

	document.getElementById("log").innerHTML += s + "<br>";
    }

    function go() {
	var gl = document.getElementById("c").getContext("experimental-webgl");

	gl.clearColor(0.0, 0.0, 0.0, 0.0);
	gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

	var vs = gl.createShader(gl.VERTEX_SHADER);
	gl.shaderSource(vs, "attribute vec4 aVertex; attribute vec4 aColor; varying vec4 vColor; void main() { vColor = aColor; gl_Position = aVertex; }");
	gl.compileShader(vs);

	var fs = gl.createShader(gl.FRAGMENT_SHADER);
	gl.shaderSource(fs, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }");
	gl.compileShader(fs);

	var prog = gl.createProgram();
	gl.attachShader(prog, vs);
	// don't attach a fragment shader -- may use fixed pipeline on desktop if the implementation doesn't check!
	//gl.attachShader(prog, fs);

	gl.bindAttribLocation(prog, 0, "aVertex");
	gl.bindAttribLocation(prog, 1, "aColor");

	gl.linkProgram(prog);

	var vbuf = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, vbuf);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
                  -1.0, -1.0, 0.0, 1.0,
							    -1.0, 1.0, 0.0, 1.0,
							    1.0, -1.0, 0.0, 1.0,
							    1.0, 1.0, 0.0, 1.0]), gl.STATIC_DRAW);
	gl.vertexAttribPointer(0, 4, gl.FLOAT, false, 0, 0);

	var cbuf = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, cbuf);
	gl.bufferData(gl.ARRAY_BUFFER, new Uint8Array([255, 0, 0,
								   0, 255, 0,
								   0, 0, 255,
								   255, 255, 0]), gl.STATIC_DRAW);
	gl.vertexAttribPointer(1, 3, gl.UNSIGNED_BYTE, false, 0, 0);

	gl.enableVertexAttribArray(0);
	gl.enableVertexAttribArray(1);

	gl.useProgram(prog);

	gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);

	log("glError", "0x" + gl.getError().toString(16));
    }
</script>
</head>

<body onload="go()">
<p>Should be green in the rectangle below:</p>
<canvas style="background: green;" id="c"></canvas>
<div id="log"></div>
</body>
</html>
