<html>
    <head>
      <base href="https://bugs.webkit.org/">
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - readPixels directly to ArrayBuffer has very high CPU usage"
   href="https://bugs.webkit.org/show_bug.cgi?id=235002#c4">Comment # 4</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - readPixels directly to ArrayBuffer has very high CPU usage"
   href="https://bugs.webkit.org/show_bug.cgi?id=235002">bug 235002</a>
              from <span class="vcard"><a class="email" href="mailto:kkinnunen@apple.com" title="Kimmo Kinnunen <kkinnunen@apple.com>"> <span class="fn">Kimmo Kinnunen</span></a>
</span></b>
        <pre>NOTE about the test case measurements:
The test case times are wrong, since the calls might not be completed when the caller side measurement is made.

Consider abstraction of the test case here:
        var s = MEASURE();
        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);
        var upload = MEASURE() - s;

        s = MEASURE();
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
        var draw = MEASURE() - s;

        s = MEASURE();
        gl.bindBuffer(gl.PIXEL_PACK_BUFFER, pixelBuffer);
        gl.readPixels(0, 0, 640, 360, gl.RGBA, gl.UNSIGNED_BYTE, 0);
        gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, pixels);
        var pack = MEASURE() - s;

        s = MEASURE();
        gl.readPixels(0, 0, 640, 360, gl.RGBA, gl.UNSIGNED_BYTE, pixelsDirect);
        var direct = MEASURE() - s;


The first blocking call is getBufferSubData, and as such the duration measurement "pack" might contain delay due to all the work submitted prior to that call.

The second blocking call duration readPixels will contain only the readPixels payload because it comes after a blocking call.

So a benchmark measuring individual gl sequeneces needs to call finish() before taking a measurement start timestamp and end in a blocking call, and needs to take the end timestamp after it.

        gl.finish();
        var s = MEASURE();
        gl.op();
        gl.op2();
        gl.readPixels();
        var dt = MEASURE() - s;</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>