| <!-- |
| 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#L1507 |
| 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"); |
| |
| // Resize the buffer - triggers a re-allocation in the D3D11 back-end. |
| debug("draw upper triangle - should be green"); |
| var bigData = new Float32Array(128 * 4); |
| bigData.set([ 0, 1, 0, 1 ]); |
| gl.bufferData(gl.UNIFORM_BUFFER, bigData, gl.STATIC_DRAW); |
| 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> |