summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/js/tests/iterable-test.js
blob: 45e509f50a3117dfd5892c9b7f2f7429a51868be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*
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.
*/
IterableTest = (function() {

  var wtu = WebGLTestUtils;

  function run(test, iterations) {
    var target = iterations || 10;
    var count = 0;

    function doNextTest() {
      ++count;
      debug("Test " + count + " of " + target);
      var success = test();
      if (count < target && success !== false) {
        wtu.dispatchPromise(doNextTest);
      } else {
        finishTest();
      }
    }

    doNextTest();
  }

  // Creates a canvas and a texture then exits. There are
  // no references to either so both should be garbage collected.
  function createContextCreationAndDestructionTest() {
    var textureSize = null;

    return function() {
      var canvas = document.createElement("canvas");
      // This is safe for any device. See drawingBufferWidth in spec.
      canvas.width = 2048;
      canvas.height = 2048;
      var gl = wtu.create3DContext(canvas);
      if (textureSize === null) {
        var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
        textureSize = Math.min(1024, maxTextureSize);
      }
      var tex = gl.createTexture();
      gl.bindTexture(gl.TEXTURE_2D, tex);
      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureSize, textureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE,
                    null);
      gl.clear(gl.COLOR_BUFFER_BIT);
      wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");

      return true;
    };
  }

  // Creates many small canvases and attaches them to the DOM.
  // This tests an edge case discovered in Chrome where the creation of multiple
  // WebGL contexts would eventually lead to context creation failure.
  // (crbug.com/319265) The test does not require that old contexts remain
  // valid, only that new ones can be created.
  function createContextCreationTest() {
    return function() {
      var canvas = document.createElement("canvas");
      canvas.width = 1;
      canvas.height = 1;

      document.body.appendChild(canvas);

      var gl = wtu.create3DContext(canvas);
      if (!gl) {
        return false;
      }

      gl.clear(gl.COLOR_BUFFER_BIT);
      wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");

      return true;
    };
  }

  // Draws rectangle on a passed canvas with preserveDrawingBuffer
  // and antialiasing ON, tests rect color on every iteration.
  function createMultisampleCorruptionTest(gl) {
    var lastContext = null;
    // Allocate a read back buffer in advance and reuse it for all iterations
    // to avoid memory issues because of late garbage collection.
    var readBackBuf = new Uint8Array(gl.canvas.width * gl.canvas.height * 4);

    var program = wtu.loadStandardProgram(gl);
    var uniforms = wtu.getUniformMap(gl, program);
    gl.useProgram(program);

    gl.clearColor(1.0, 0.0, 0.0, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);

    var vertexObject = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,2.5,0, 1.5,1.5,0, 2.5,1.5,0 ]), gl.STATIC_DRAW);
    gl.enableVertexAttribArray(0);
    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
    gl.vertexAttrib3f(1, 0.0, 0.0, 1.0);

    var identityMat = new Float32Array([
      1, 0, 0, 0,
      0, 1, 0, 0,
      0, 0, 1, 0,
      0, 0, 0, 1
    ]);

    gl.uniformMatrix4fv(uniforms.u_modelViewProjMatrix.location, false, identityMat);

    function test() {
      var gl2 = wtu.create3DContext(null, {antialias: true});

      gl2.canvas.width = gl2.canvas.height = 1024;
      gl2.canvas.style.width = gl2.canvas.style.height = "1px";
      document.body.appendChild(gl2.canvas);

      gl2.clearColor(1.0, 0.0, 0.0, 1.0);
      gl2.clear(gl2.COLOR_BUFFER_BIT);

      if(lastContext) {
          gl.drawArrays(gl.TRIANGLES, 0, 3);
          var msg = "Canvas should be red";
          wtu.checkCanvasRectColor(gl,
              0, 0, gl.canvas.width, gl.canvas.height,
              [255, 0, 0, 255], null,
              function() {
                  testPassed(msg);
              },
              function() {
                  testFailed(msg);
                  return false;
              },
          debug, readBackBuf);
          document.body.removeChild(lastContext.canvas);
      }

      lastContext = gl2;
      return true;
    };

    // First pass does initialization
    test();

    return test;
  }

  // Draws repeatedly to a large canvas with preserveDrawingBuffer enabled to
  // try and provoke a context loss.
  function createPreserveDrawingBufferLeakTest(gl) {
    var contextActive = true;
    gl.canvas.addEventListener("webglcontextlost", () => {
      testFailed("Context was lost");
      contextActive = false;
    });

    function test() {
      var x = Math.random() * gl.drawingBufferWidth;
      var y = Math.random() * gl.drawingBufferHeight;
      var width = Math.random() * (gl.drawingBufferWidth - x);
      var height = Math.random() * (gl.drawingBufferHeight - y);

      gl.enable(gl.SCISSOR_TEST);
      gl.scissor(x, y, width, height);
      gl.clearColor(Math.random(), Math.random(), Math.random(), 1.0);
      gl.clear(gl.COLOR_BUFFER_BIT);
      wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");

      return contextActive;
    };

    return test;
  }

  return {
    run: run,

    createContextCreationAndDestructionTest: createContextCreationAndDestructionTest,
    createContextCreationTest: createContextCreationTest,
    createMultisampleCorruptionTest: createMultisampleCorruptionTest,
    createPreserveDrawingBufferLeakTest: createPreserveDrawingBufferLeakTest
  };

})();