content/canvas/test/webgl-mochitest/test_no_arr_points.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <!DOCTYPE HTML>
     2 <title>WebGL test: Drawing without attrib arrays</title>
     3 <script src="/tests/SimpleTest/SimpleTest.js"></script>
     4 <link rel="stylesheet" href="/tests/SimpleTest/test.css">
     5 <script src="driver-info.js"></script>
     6 <script src="webgl-util.js"></script>
     7 <script id="vs-no-attrib" type="x-shader/x-vertex">
     9 void main(void) {
    10   gl_PointSize = 64.0;
    11   gl_Position = vec4(vec3(0.0), 1.0);
    12 }
    14 </script>
    15 <script id="vs-attrib" type="x-shader/x-vertex">
    17 attribute vec3 aPosition;
    19 void main(void) {
    20   gl_PointSize = 64.0;
    21   gl_Position = vec4(aPosition, 1.0);
    22 }
    24 </script>
    25 <script id="fs" type="x-shader/x-fragment">
    27 precision mediump float;
    29 void main(void) {
    30   gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
    31 }
    33 </script>
    34 <body>
    35 <canvas id="c" width="64" height="64"></canvas>
    36 <script>
    38 // Give ourselves a scope to return early from:
    39 (function() {
    40   var gl = WebGLUtil.getWebGL('c');
    41   if (!gl) {
    42     todo(false, 'WebGL is unavailable.');
    43     return;
    44   }
    46   function errorFunc(str) {
    47     ok(false, 'Error: ' + str);
    48   }
    49   WebGLUtil.setErrorFunc(errorFunc);
    50   WebGLUtil.setWarningFunc(errorFunc);
    52   var attribProg   = WebGLUtil.createProgramByIds(gl, 'vs-attrib',    'fs');
    53   var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs');
    54   if (!attribProg || !noAttribProg) {
    55     ok(false, 'Program linking should succeed.');
    56     return;
    57   }
    59   attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition");
    60   ok(attribProg.aPosition >= 0, '`aPosition` should be valid.');
    62   function isScreenBlack() {
    63     var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight;
    64     var data = new Uint8Array(4 * pixels);
    65     gl.readPixels(0, 0,
    66                   gl.drawingBufferWidth, gl.drawingBufferHeight,
    67                   gl.RGBA, gl.UNSIGNED_BYTE,
    68                   data);
    70     var accum = 0;
    71     for (var i = 0; i < pixels; i++) {
    72       accum += data[4*i + 0];
    73       accum += data[4*i + 1];
    74       accum += data[4*i + 2];
    75     }
    77     return accum == 0;
    78   }
    80   function checkGLError(func, info) {
    81     var error = gl.getError();
    82     func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.');
    83   }
    85   function testDrawing(info) {
    86     var cruelNumber = 1024*1024;
    87     // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls,
    88     // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array.
    89     // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t)
    90     var UINT16_MAX  = 0xffff;
    91     var INT32_MAX   = 0x7fffffff;
    92     var UINT32_MAX  = 0xffffffff;
    94     // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX
    95     var hugeFirst = Math.min(cruelNumber, INT32_MAX-1);
    96     var hugeIndex = Math.min(cruelNumber, UINT32_MAX);
    98     var indexType = gl.UNSIGNED_SHORT;
    99     var indexStride = 2;
   100     var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]);
   101     if (gl.getExtension('OES_element_index_uint')) {
   102       indexType = gl.UNSIGNED_INT;
   103       indexStride = 4;
   104       indexArr = new Uint32Array([0, 1, hugeIndex]);
   105     }
   107     gl.clear(gl.COLOR_BUFFER_BIT);
   108     gl.drawArrays(gl.POINTS, 0, 1);
   109     ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.');
   111     gl.clear(gl.COLOR_BUFFER_BIT);
   112     gl.drawArrays(gl.POINTS, hugeFirst, 1);
   113     ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.');
   115     checkGLError(ok, info);
   117     var elemTestFunc = todo; // We fail on most implementations.
   118     var checkGLTestFunc = todo;
   119     if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANGLE ||
   120         DriverInfo.getOS() == DriverInfo.OS.ANDROID)
   121     {
   122       // ANGLE and Android slaves seem to work fine.
   123       elemTestFunc = ok;
   124       checkGLTestFunc = ok;
   125     }
   126     if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR ||
   127         DriverInfo.getOS() == DriverInfo.OS.B2G)
   128     {
   129       // ...but the Android 4.2 x86 emulator environment is different
   130       elemTestFunc = todo;
   131       checkGLTestFunc = ok;
   132     }
   134     // Now for drawElements:
   135     gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer());
   136     gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW);
   138     gl.clear(gl.COLOR_BUFFER_BIT);
   139     gl.drawElements(gl.POINTS, 1, indexType, 0);
   140     elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.');
   142     gl.clear(gl.COLOR_BUFFER_BIT);
   143     gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride);
   144     elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.');
   146     gl.clear(gl.COLOR_BUFFER_BIT);
   147     gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride);
   148     elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.');
   150     checkGLError(checkGLTestFunc, info);
   151   }
   153   // Begin drawing
   154   gl.clearColor(0.0, 0.0, 0.0, 1.0);
   155   gl.disable(gl.DEPTH_TEST);
   157   // No-attrib prog:
   158   gl.useProgram(noAttribProg);
   159   testDrawing('no-attrib');
   161   // One-attrib, no-array prog:
   162   gl.useProgram(attribProg);
   163   gl.disableVertexAttribArray(attribProg.aPosition);
   164   gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]);
   165   testDrawing('one-attrib, no-array');
   166 })();
   168 </script>

mercurial