blob: 700a47260ca4e6c73e5616300e51ff3d3638cf04 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
function SetupShaderProgram(gl) {
// Create Vertex Shader.
var vertex_shader = '' +
'attribute vec4 vPosition;\n' +
'attribute vec2 texCoord0;\n' +
'varying vec2 texCoord;\n' +
'void main() {\n' +
' gl_Position = vPosition;\n' +
' texCoord = texCoord0;\n' +
'}\n';
var vs = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vs, vertex_shader);
gl.compileShader(vs);
// Create Fragment Shader.
var fragment_shader = '' +
'#ifdef GL_ES\n' +
'precision mediump float;\n' +
'#endif\n' +
'uniform sampler2D tex;\n' +
'varying vec2 texCoord;\n' +
'void main() {\n' +
' gl_FragData[0] = texture2D(tex, texCoord);\n' +
'}\n';
var fs = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fs, fragment_shader);
gl.compileShader(fs);
// Link Program.
var program = gl.createProgram();
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.bindAttribLocation(program, 0, 'vPosition');
gl.bindAttribLocation(program, 1, 'texCoord0');
gl.linkProgram(program);
gl.deleteShader(fs);
gl.deleteShader(vs);
gl.useProgram(program);
};
function SetupQuad(gl) {
SetupShaderProgram(gl);
// Setup unit quad
var vertexObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
var vertexObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
1.0, 1.0,
0.0, 1.0,
0.0, 0.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(1);
gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
};
function DoTextureUploadBenchmark(gl, dimension) {
SetupShaderProgram(gl);
SetupQuad(gl);
var canvasTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, canvasTexture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
var frame = 0;
var delta = 10;
var pixels = new Uint8Array(dimension * dimension * 4);
function update_texture() {
requestAnimationFrame(update_texture);
if (((frame + delta) < 0) || (frame + delta) >= 256 * 3)
delta *= -1;
frame += delta;
for (var i = 0; i < dimension * dimension; ++i) {
pixels[i*4] = Math.min(frame, 255);
pixels[i*4+1] = Math.max(256, Math.min(511, frame)) - 256;
pixels[i*4+2] = Math.max(512, frame) - 512;
pixels[i*4+3] = 0xFF;
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, dimension, dimension, 0,
gl.RGBA, gl.UNSIGNED_BYTE, pixels);
gl.drawArrays(gl.TRIANGLES, 0, 6);
}
update_texture();
}