mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
235 lines
41 KiB
HTML
235 lines
41 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
|
<html><head>
|
||
|
<!--
|
||
|
Tests for the OpenGL ES 2.0 HTML Canvas context
|
||
|
|
||
|
Copyright (C) 2009 Ilmari Heikkinen <ilmari.heikkinen@gmail.com>
|
||
|
|
||
|
Permission is hereby granted, free of charge, to any person
|
||
|
obtaining a copy of this software and associated documentation
|
||
|
files (the "Software"), to deal in the Software without
|
||
|
restriction, including without limitation the rights to use,
|
||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
copies of the Software, and to permit persons to whom the
|
||
|
Software is furnished to do so, subject to the following
|
||
|
conditions:
|
||
|
|
||
|
The above copyright notice and this permission notice shall be
|
||
|
included in all copies or substantial portions of the Software.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||
|
|
||
|
-->
|
||
|
|
||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
|
<link rel="stylesheet" type="text/css" href="../unit.css" />
|
||
|
<script type="application/x-javascript" src="../unit.js"></script>
|
||
|
<script type="application/x-javascript" src="../util.js"></script>
|
||
|
<script type="application/x-javascript">
|
||
|
|
||
|
Tests.autorun = false;
|
||
|
Tests.message = "This might take a second or two. Take the upload numbers with a dose of salt, as there's no drawing code using the data.";
|
||
|
|
||
|
Tests.startUnit = function () {
|
||
|
var canvas = document.getElementById('gl');
|
||
|
var gl = canvas.getContext(GL_CONTEXT_ID);
|
||
|
return [gl];
|
||
|
}
|
||
|
|
||
|
Tests.testTexImage2D = function(gl) {
|
||
|
var tex = gl.createTexture();
|
||
|
var texArr = new Array(256*256*4);
|
||
|
var bufData = new Array(256*256*4);
|
||
|
for (var i=0; i<texArr.length; i++) texArr[i] = 0;
|
||
|
for (var i=0; i<bufData.length; i++) bufData[i] = 0.5;
|
||
|
gl.bindTexture(gl.TEXTURE_2D, tex);
|
||
|
time("texImage2D", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, texArr);
|
||
|
});
|
||
|
time("texImage2D", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, texArr);
|
||
|
});
|
||
|
time("texSubImage2D", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 256, gl.RGBA, gl.UNSIGNED_BYTE, texArr);
|
||
|
});
|
||
|
var img = document.getElementById('logo');
|
||
|
time("texImage2DHTML", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);
|
||
|
});
|
||
|
time("texSubImage2DHTML", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);
|
||
|
});
|
||
|
var bufs = [gl.createBuffer(), gl.createBuffer()];
|
||
|
var buf = bufs[0], buf2 = bufs[1];
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
|
||
|
var bufArr = new Float32Array(bufData);
|
||
|
time("bufferDataNoChange", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.bufferData(gl.ARRAY_BUFFER, bufArr, gl.STATIC_DRAW);
|
||
|
});
|
||
|
time("bufferSubDataNoChange", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.bufferSubData(gl.ARRAY_BUFFER, 0, bufArr);
|
||
|
});
|
||
|
time("bufferData", function() {
|
||
|
var bufArr = new Float32Array(bufData);
|
||
|
for (var i=0; i<25; i++)
|
||
|
gl.bufferData(gl.ARRAY_BUFFER, bufArr, gl.STATIC_DRAW);
|
||
|
});
|
||
|
time("bufferSubData", function() {
|
||
|
var bufArr = new Float32Array(bufData);
|
||
|
for (var i=0; i<25; i++)
|
||
|
gl.bufferSubData(gl.ARRAY_BUFFER, 0, bufArr);
|
||
|
});
|
||
|
var sh = new Shader(gl, 'vert-v', 'frag-v');
|
||
|
gl.disable(gl.DEPTH_TEST);
|
||
|
sh.use();
|
||
|
var v = sh.attrib('Vertex');
|
||
|
for (var i=0; i<16; i++)
|
||
|
gl.disableVertexAttribArray(i);
|
||
|
gl.enableVertexAttribArray(v);
|
||
|
gl.vertexAttribPointer(v, 4, gl.FLOAT, false, 0, 0);
|
||
|
time("verticeDraw", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.drawArrays(gl.TRIANGLES, 0, 256*256);
|
||
|
gl.readPixels(0,0,1,1,gl.RGBA, gl.UNSIGNED_BYTE);
|
||
|
});
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, buf2);
|
||
|
gl.bufferData(gl.ARRAY_BUFFER, bufArr, gl.STATIC_DRAW);
|
||
|
time("verticeDrawC", function() {
|
||
|
for (var i=0; i<100; i++) {
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, (i % 2 == 0) ? buf : buf2);
|
||
|
gl.drawArrays(gl.TRIANGLES, 0, 256*256);
|
||
|
}
|
||
|
gl.readPixels(0,0,1,1,gl.RGBA, gl.UNSIGNED_BYTE);
|
||
|
});
|
||
|
// Drawing arrays with vertexAttribPointer seems to have been removed from WebGL.
|
||
|
/* gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
||
|
gl.vertexAttribPointer(v, 4, gl.FLOAT, false, 0, bufArr);
|
||
|
time("verticeDrawVA", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.drawArrays(gl.TRIANGLES, 0, 256*256);
|
||
|
gl.readPixels(0,0,1,1,gl.RGBA, gl.UNSIGNED_BYTE);
|
||
|
});
|
||
|
time("verticeDrawVAC", function() {
|
||
|
for (var i=0; i<100; i++) {
|
||
|
gl.vertexAttribPointer(v, 4, gl.FLOAT, false, 0, bufArr);
|
||
|
gl.drawArrays(gl.TRIANGLES, 0, 256*256);
|
||
|
}
|
||
|
gl.readPixels(0,0,1,1,gl.RGBA, gl.UNSIGNED_BYTE);
|
||
|
});*/
|
||
|
sh.destroy();
|
||
|
sh = new Filter(gl, 'vert-t', 'frag-t');
|
||
|
sh.apply();
|
||
|
time("textureDraw", function() {
|
||
|
for (var i=0; i<1000; i++)
|
||
|
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
||
|
gl.readPixels(0,0,1,1,gl.RGBA, gl.UNSIGNED_BYTE);
|
||
|
});
|
||
|
sh.destroy();
|
||
|
time("readPixels", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.readPixels(0, 0, 256, 256, gl.RGBA, gl.UNSIGNED_BYTE);
|
||
|
});
|
||
|
time("getImageData", function() {
|
||
|
for (var i=0; i<100; i++)
|
||
|
gl.getImageData(0, 0, 256, 256);
|
||
|
});
|
||
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
||
|
bufs.forEach(function(buf){ gl.deleteBuffer(buf) });
|
||
|
gl.deleteTexture(tex);
|
||
|
}
|
||
|
|
||
|
|
||
|
Tests.endUnit = function(gl) {
|
||
|
}
|
||
|
|
||
|
</script>
|
||
|
<script id="vert-v" type="x-shader/x-vertex">
|
||
|
#version 120
|
||
|
attribute vec4 Vertex;
|
||
|
void main()
|
||
|
{
|
||
|
gl_Position = Vertex;
|
||
|
}
|
||
|
</script>
|
||
|
<script id="frag-v" type="x-shader/x-fragment">
|
||
|
#version 120
|
||
|
void main()
|
||
|
{
|
||
|
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
||
|
}
|
||
|
</script>
|
||
|
<script id="vert-t" type="x-shader/x-vertex">
|
||
|
#version 120
|
||
|
|
||
|
attribute vec3 Vertex;
|
||
|
attribute vec2 Tex;
|
||
|
varying vec2 texCoord0;
|
||
|
void main()
|
||
|
{
|
||
|
gl_Position = vec4(Vertex, 1.0);
|
||
|
texCoord0 = Tex;
|
||
|
}
|
||
|
</script>
|
||
|
<script id="frag-t" type="x-shader/x-fragment">
|
||
|
#version 120
|
||
|
uniform sampler2D Texture;
|
||
|
|
||
|
varying vec2 texCoord0;
|
||
|
void main()
|
||
|
{
|
||
|
gl_FragColor = texture2D(Texture, texCoord0);
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style>canvas{ position:absolute; }
|
||
|
img{ display:none; }</style>
|
||
|
</head><body>
|
||
|
<h3>100x 256x256x4 texture upload with texImage2D (26.2MB total)</h3>
|
||
|
<p id="texImage2D"></p>
|
||
|
<h3>100x 256x256x4 texture upload with texSubImage2D (26.2MB total)</h3>
|
||
|
<p id="texSubImage2D"></p>
|
||
|
<h3>100x 256x256x4 texture upload with texImage2DHTML (26.2MB total)</h3>
|
||
|
<p id="texImage2DHTML"></p>
|
||
|
<h3>100x 256x256x4 texture upload with texSubImage2DHTML (26.2MB total)</h3>
|
||
|
<p id="texSubImage2DHTML"></p>
|
||
|
<h3>100x 256x256x4 readPixels (26.2MB total)</h3>
|
||
|
<p id="readPixels"></p>
|
||
|
<h3>100x 256x256x4 getImageData (26.2MB total)</h3>
|
||
|
<p id="getImageData"></p>
|
||
|
<h3>25x 256x256x4 float bufferData (6.6MB total)</h3>
|
||
|
<p id="bufferData"></p>
|
||
|
<h3>25x 256x256x4 float bufferSubData (6.6MB total)</h3>
|
||
|
<p id="bufferSubData"></p>
|
||
|
<h3>100x 256x256x4 float bufferData, reuse Float32Array (26.2MB total)</h3>
|
||
|
<p id="bufferDataNoChange"></p>
|
||
|
<h3>100x 256x256x4 float bufferSubData, reuse Float32Array (26.2MB total)</h3>
|
||
|
<p id="bufferSubDataNoChange"></p>
|
||
|
<h3>100x 256x256 vert VBO draw</h3>
|
||
|
<p id="verticeDraw"></p>
|
||
|
<h3>100x 256x256 vert VBO draw, change VBO after each draw</h3>
|
||
|
<p id="verticeDrawC"></p>
|
||
|
<!--<h3>100x 256x256 vert vertex array draw</h3>
|
||
|
<p id="verticeDrawVA"></p>
|
||
|
<h3>100x 256x256 vert vertex array draw, change array after each draw</h3>
|
||
|
<p id="verticeDrawVAC"></p>-->
|
||
|
<h3>1000x 256x256 texture draw</h3>
|
||
|
<p id="textureDraw"></p>
|
||
|
<canvas id="gl" width="256" height="256"></canvas>
|
||
|
<img id="logo" src="data:image/png;base64,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
|
||
|
</body></html>
|