summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/conformance2/uniforms/simple-buffer-change.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/conformance2/uniforms/simple-buffer-change.html')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance2/uniforms/simple-buffer-change.html122
1 files changed, 122 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance2/uniforms/simple-buffer-change.html b/dom/canvas/test/webgl-conf/checkout/conformance2/uniforms/simple-buffer-change.html
new file mode 100644
index 0000000000..c5646faae8
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance2/uniforms/simple-buffer-change.html
@@ -0,0 +1,122 @@
+<!--
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>WebGL draw with uniform blocks conformance tests</title>
+<link rel="stylesheet" href="../../resources/js-test-style.css"/>
+<script src="../../js/js-test-pre.js"></script>
+<script src="../../js/webgl-test-utils.js"></script>
+<script id="vshader" type="x-shader/x-vertex">#version 300 es
+in vec4 a_vertex;
+void main(void) {
+ gl_Position = a_vertex;
+}
+</script>
+<script id="fshader" type="x-shader/x-fragment">#version 300 es
+precision mediump float;
+layout (std140) uniform color_ubo {
+ vec4 color;
+};
+out vec4 fragColor;
+void main(void) {
+ fragColor = color;
+}
+</script>
+</head>
+<body>
+<canvas id="example" width="100", height="100"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+"use strict";
+debug("");
+
+// Ported from: https://github.com/google/angle/blob/master/src/tests/gl_tests/UniformBufferTest.cpp#L1463
+description("Regression test for https://bugs.chromium.org/p/chromium/issues/detail?id=792966");
+
+var wtu = WebGLTestUtils;
+var gl = wtu.create3DContext("example", undefined, 2);
+
+function runTest() {
+ var program = wtu.setupProgram(gl, ['vshader', 'fshader'], ['a_vertex']);
+ var uboIndex = gl.INVALID_INDEX;
+ if (program)
+ uboIndex = gl.getUniformBlockIndex(program, "color_ubo");
+ if (!program || uboIndex == gl.INVALID_INDEX) {
+ testFailed("Loading program failed");
+ return;
+ }
+ testPassed("Loading program succeeded");
+
+ var vertices = new Float32Array([
+ -1, -1, 0,
+ 1, -1, 0,
+ -1, 1, 0,
+ 1, 1, 0
+ ]);
+ var vertexBuf = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuf);
+ gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(0);
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+
+ var indexBuf = gl.createBuffer();
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuf);
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array([ 0, 1, 2, 2, 1, 3 ]), gl.STATIC_DRAW);
+
+ var uboDataSize = gl.getActiveUniformBlockParameter(
+ program, uboIndex, gl.UNIFORM_BLOCK_DATA_SIZE);
+ if (uboDataSize == 0) {
+ testFailed("uniform block data size invalid");
+ return;
+ }
+
+ wtu.glErrorShouldBe(gl, gl.NO_ERROR, "No errors from setup");
+
+ debug("draw lower triangle - should be red");
+ var uboBuf1 = gl.createBuffer();
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, uboBuf1);
+ gl.bufferData(gl.UNIFORM_BUFFER, uboDataSize, gl.STATIC_DRAW);
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 0, new Float32Array([ 1, 0, 0, 1 ]));
+ gl.uniformBlockBinding(program, uboIndex, 0);
+ gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0);
+ wtu.glErrorShouldBe(gl, gl.NO_ERROR, "No errors from draw");
+
+ // Bind a second buffer to the same binding point (0). This should set to draw green.
+ debug("draw upper triangle - should be green");
+ var uboBuf2 = gl.createBuffer();
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, uboBuf2);
+ gl.bufferData(gl.UNIFORM_BUFFER, uboDataSize, gl.STATIC_DRAW);
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 0, new Float32Array([ 0, 1, 0, 1 ]));
+ gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 6);
+ wtu.glErrorShouldBe(gl, gl.NO_ERROR, "No errors from draw");
+
+ var width = 100, height = 100;
+ wtu.checkCanvasRectColor(gl, 0, 0, width/2-5, height/2-5, [255, 0, 0, 255], 2,
+ function() { testPassed("lower left should be red"); },
+ function() { testFailed("lower left should be red"); });
+ wtu.checkCanvasRectColor(gl, width/2+5, height/2+5, width/2-5, height/2-5, [0, 255, 0, 255], 2,
+ function() { testPassed("top right should be green"); },
+ function() { testFailed("top right should be green"); });
+}
+
+if (!gl) {
+ testFailed("WebGL context creation failed");
+} else {
+ testPassed("WebGL context creation succeeded");
+ runTest();
+}
+
+debug("");
+var successfullyParsed = true;
+</script>
+<script src="../../js/js-test-post.js"></script>
+
+</body>
+</html>