OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <html><head> |
| 3 <meta charset="utf-8"> |
| 4 <!-- |
| 5 Tests for the OpenGL ES 2.0 HTML Canvas context |
| 6 |
| 7 Copyright (C) 2011 Ilmari Heikkinen <ilmari.heikkinen@gmail.com> |
| 8 |
| 9 Permission is hereby granted, free of charge, to any person |
| 10 obtaining a copy of this software and associated documentation |
| 11 files (the "Software"), to deal in the Software without |
| 12 restriction, including without limitation the rights to use, |
| 13 copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 14 copies of the Software, and to permit persons to whom the |
| 15 Software is furnished to do so, subject to the following |
| 16 conditions: |
| 17 |
| 18 The above copyright notice and this permission notice shall be |
| 19 included in all copies or substantial portions of the Software. |
| 20 |
| 21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
| 23 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| 24 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
| 25 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| 26 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| 27 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| 28 OTHER DEALINGS IN THE SOFTWARE. |
| 29 |
| 30 --> |
| 31 |
| 32 <link rel="stylesheet" type="text/css" href="../unit.css" /> |
| 33 <script type="application/x-javascript" src="../unit.js"></script> |
| 34 <script type="application/x-javascript" src="../util.js"></script> |
| 35 <script type="application/x-javascript"> |
| 36 |
| 37 Tests.autorun = false; |
| 38 Tests.message = "This might take a few seconds to run" |
| 39 |
| 40 Tests.startUnit = function() { |
| 41 var gl = document.getElementById('gl').getContext(GL_CONTEXT_ID); |
| 42 var ctx = document.getElementById('2d').getContext('2d'); |
| 43 return [gl, ctx]; |
| 44 } |
| 45 |
| 46 var kernel = [0.006, 0.061, 0.242, 0.383, 0.242, 0.061, 0.006]; |
| 47 |
| 48 Tests.testGPU = function(gl, ctx) { |
| 49 Tests.gpuGaussianBlur(gl); |
| 50 } |
| 51 |
| 52 Tests.testCPU = function(gl, ctx) { |
| 53 Tests.cpuGaussianBlur(ctx); |
| 54 } |
| 55 |
| 56 function hblur(ctx,idata) { |
| 57 var d = idata.data; |
| 58 var res = ctx.createImageData(256,256); |
| 59 var rd = res.data; |
| 60 var sumR=0.0,sumG=0.0,sumB=0.0,sumA=0.0, kv=0.0; |
| 61 var col_offset = 0, row_offset = 0, k4 = 0; |
| 62 for (var y=0; y<idata.height; ++y) { |
| 63 col_offset = y * idata.width * 4; |
| 64 for (var x=3; x<idata.width-3; ++x) { |
| 65 row_offset = col_offset+x*4; |
| 66 sumR=sumG=sumB=sumA=0.0; |
| 67 for (var k=-3; k<4; ++k) { |
| 68 k4 = k * 4; |
| 69 kv = kernel[k+3]; |
| 70 sumR += d[row_offset+k4+0] * kv; |
| 71 sumG += d[row_offset+k4+1] * kv; |
| 72 sumB += d[row_offset+k4+2] * kv; |
| 73 sumA += d[row_offset+k4+3] * kv; |
| 74 } |
| 75 rd[row_offset+0] = Math.floor(sumR); |
| 76 rd[row_offset+1] = Math.floor(sumG); |
| 77 rd[row_offset+2] = Math.floor(sumB); |
| 78 rd[row_offset+3] = Math.floor(sumA); |
| 79 } |
| 80 } |
| 81 var xr = 3; |
| 82 for (var y=0; y<idata.height; ++y) { |
| 83 col_offset = y * idata.width * 4; |
| 84 for (var x=0; x<xr; ++x) { |
| 85 row_offset = col_offset+x*4; |
| 86 sumR=sumG=sumB=sumA=0.0; |
| 87 for (var k=-3; k<4; ++k) { |
| 88 if (k+x < 0) |
| 89 k4 = 0; |
| 90 else |
| 91 k4 = k * 4; |
| 92 kv = kernel[k+3]; |
| 93 sumR += d[row_offset+k4+0] * kv; |
| 94 sumG += d[row_offset+k4+1] * kv; |
| 95 sumB += d[row_offset+k4+2] * kv; |
| 96 sumA += d[row_offset+k4+3] * kv; |
| 97 } |
| 98 rd[row_offset+0] = Math.floor(sumR); |
| 99 rd[row_offset+1] = Math.floor(sumG); |
| 100 rd[row_offset+2] = Math.floor(sumB); |
| 101 rd[row_offset+3] = Math.floor(sumA); |
| 102 } |
| 103 } |
| 104 var xr = idata.width-3; |
| 105 for (var y=0; y<idata.height; ++y) { |
| 106 col_offset = y * idata.width * 4; |
| 107 for (var x=xr; x<idata.width; ++x) { |
| 108 row_offset = col_offset+x*4; |
| 109 sumR=sumG=sumB=sumA=0.0; |
| 110 for (var k=-3; k<4; ++k) { |
| 111 if (k+x >= idata.width) |
| 112 k4 = (idata.width-x-1)*4; |
| 113 else |
| 114 k4 = k * 4; |
| 115 kv = kernel[k+3]; |
| 116 sumR += d[row_offset+k4+0] * kv; |
| 117 sumG += d[row_offset+k4+1] * kv; |
| 118 sumB += d[row_offset+k4+2] * kv; |
| 119 sumA += d[row_offset+k4+3] * kv; |
| 120 } |
| 121 rd[row_offset+0] = Math.floor(sumR); |
| 122 rd[row_offset+1] = Math.floor(sumG); |
| 123 rd[row_offset+2] = Math.floor(sumB); |
| 124 rd[row_offset+3] = Math.floor(sumA); |
| 125 } |
| 126 } |
| 127 return res; |
| 128 } |
| 129 |
| 130 function vblur(ctx,idata) { |
| 131 var d = idata.data; |
| 132 var res = ctx.createImageData(256,256); |
| 133 var rd = res.data; |
| 134 var sumR=0.0,sumG=0.0,sumB=0.0,sumA=0.0, kv=0.0; |
| 135 var col_offset = 0, row_offset = 0, kfac = idata.width*4; |
| 136 for (var y=3; y<idata.height-3; ++y) { |
| 137 col_offset = y * idata.width * 4; |
| 138 for (var x=0; x<idata.width; ++x) { |
| 139 row_offset = col_offset+x*4; |
| 140 sumR=sumG=sumB=sumA=0.0; |
| 141 for (var k=-3; k<4; ++k) { |
| 142 k4 = k * kfac; |
| 143 kv = kernel[k+3]; |
| 144 sumR += d[row_offset+k4+0] * kv; |
| 145 sumG += d[row_offset+k4+1] * kv; |
| 146 sumB += d[row_offset+k4+2] * kv; |
| 147 sumA += d[row_offset+k4+3] * kv; |
| 148 } |
| 149 rd[row_offset+0] = Math.floor(sumR); |
| 150 rd[row_offset+1] = Math.floor(sumG); |
| 151 rd[row_offset+2] = Math.floor(sumB); |
| 152 rd[row_offset+3] = Math.floor(sumA); |
| 153 } |
| 154 } |
| 155 var yr = 3; |
| 156 for (var y=0; y<yr; ++y) { |
| 157 col_offset = y * idata.width * 4; |
| 158 for (var x=0; x<idata.width; ++x) { |
| 159 row_offset = col_offset+x*4; |
| 160 sumR=sumG=sumB=sumA=0.0; |
| 161 for (var k=-3; k<4; ++k) { |
| 162 if (k+y < 0) |
| 163 k4 = 0; |
| 164 else |
| 165 k4 = k * kfac; |
| 166 kv = kernel[k+3]; |
| 167 sumR += d[row_offset+k4+0] * kv; |
| 168 sumG += d[row_offset+k4+1] * kv; |
| 169 sumB += d[row_offset+k4+2] * kv; |
| 170 sumA += d[row_offset+k4+3] * kv; |
| 171 } |
| 172 rd[row_offset+0] = Math.floor(sumR); |
| 173 rd[row_offset+1] = Math.floor(sumG); |
| 174 rd[row_offset+2] = Math.floor(sumB); |
| 175 rd[row_offset+3] = Math.floor(sumA); |
| 176 } |
| 177 } |
| 178 var yr = idata.height-3; |
| 179 for (var y=yr; y<idata.height; ++y) { |
| 180 col_offset = y * idata.width * 4; |
| 181 for (var x=0; x<idata.width; ++x) { |
| 182 row_offset = col_offset+x*4; |
| 183 sumR=sumG=sumB=sumA=0.0; |
| 184 for (var k=-3; k<4; ++k) { |
| 185 if (k+y >= idata.height) |
| 186 k4 = (idata.height-y-1)*kfac; |
| 187 else |
| 188 k4 = k * kfac; |
| 189 kv = kernel[k+3]; |
| 190 sumR += d[row_offset+k4+0] * kv; |
| 191 sumG += d[row_offset+k4+1] * kv; |
| 192 sumB += d[row_offset+k4+2] * kv; |
| 193 sumA += d[row_offset+k4+3] * kv; |
| 194 } |
| 195 rd[row_offset+0] = Math.floor(sumR); |
| 196 rd[row_offset+1] = Math.floor(sumG); |
| 197 rd[row_offset+2] = Math.floor(sumB); |
| 198 rd[row_offset+3] = Math.floor(sumA); |
| 199 } |
| 200 } |
| 201 return res; |
| 202 } |
| 203 |
| 204 Tests.cpuGaussianBlur = function(ctx) { |
| 205 var s = document.getElementById('cpustat'); |
| 206 var t0 = new Date().getTime(); |
| 207 ctx.drawImage(document.getElementById('logo'),0,0); |
| 208 var idata = ctx.getImageData(0,0,256,256); |
| 209 for (var i=0; i<1; i++){ |
| 210 idata = hblur(ctx,idata); |
| 211 idata = vblur(ctx,idata); |
| 212 } |
| 213 ctx.putImageData(idata, 0, 0); |
| 214 var t1 = new Date().getTime(); |
| 215 s.textContent = 'Done! Time: '+(t1-t0)+'ms'; |
| 216 } |
| 217 |
| 218 Tests.gpuGaussianBlur = function(gl) { |
| 219 var s = document.getElementById('gpustat'); |
| 220 var t0 = new Date().getTime(); |
| 221 |
| 222 var fbo1 = new FBO(gl, 256, 256); |
| 223 var fbo2 = new FBO(gl, 256, 256); |
| 224 var hblur = new Filter(gl, 'identity-vert', 'hblur-frag'); |
| 225 var vblur = new Filter(gl, 'identity-vert', 'vblur-frag'); |
| 226 var identity = new Filter(gl, 'identity-vert', 'identity-frag'); |
| 227 var identityFlip = new Filter(gl, 'identity-flip-vert', 'identity-frag'); |
| 228 |
| 229 gl.viewport(0,0,256,256); |
| 230 gl.clearColor(0,0,1,1); |
| 231 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); |
| 232 gl.disable(gl.DEPTH_TEST); |
| 233 gl.activeTexture(gl.TEXTURE0); |
| 234 |
| 235 fbo1.use(); |
| 236 var tex = loadTexture(gl, document.getElementById('logo')); |
| 237 gl.bindTexture(gl.TEXTURE_2D, tex); |
| 238 identityFlip.apply(); // draw image |
| 239 |
| 240 // gaussian blur |
| 241 for (var i=0; i<1000; i++) { |
| 242 fbo2.use(); |
| 243 gl.bindTexture(gl.TEXTURE_2D, fbo1.texture); |
| 244 hblur.apply(function(f){ |
| 245 f.uniform1f('width', 256.0); |
| 246 f.uniform1i('Texture', 0); |
| 247 }); |
| 248 fbo1.use(); |
| 249 gl.bindTexture(gl.TEXTURE_2D, fbo2.texture); |
| 250 vblur.apply(function(f){ |
| 251 f.uniform1f('height', 256.0); |
| 252 f.uniform1i('Texture', 0); |
| 253 }); |
| 254 } |
| 255 |
| 256 gl.bindFramebuffer(gl.FRAMEBUFFER, null); |
| 257 gl.bindTexture(gl.TEXTURE_2D, fbo1.texture); |
| 258 identity.apply(); // draw blurred image on screen |
| 259 |
| 260 fbo1.destroy(); |
| 261 fbo2.destroy(); |
| 262 hblur.destroy(); |
| 263 vblur.destroy(); |
| 264 identity.destroy(); |
| 265 identityFlip.destroy(); |
| 266 gl.deleteTexture(tex); |
| 267 checkError(gl, "end"); |
| 268 var t1 = new Date().getTime(); |
| 269 s.textContent = 'Done! Time: '+(t1-t0)+'ms'; |
| 270 } |
| 271 |
| 272 |
| 273 </script> |
| 274 <script id="identity-vert" type="x-shader/x-vertex"> |
| 275 |
| 276 attribute vec3 Vertex; |
| 277 attribute vec2 Tex; |
| 278 |
| 279 varying vec4 texCoord0; |
| 280 void main() |
| 281 { |
| 282 texCoord0 = vec4(Tex, 0.0, 0.0); |
| 283 gl_Position = vec4(Vertex, 1.0); |
| 284 } |
| 285 </script> |
| 286 <script id="identity-flip-vert" type="x-shader/x-vertex"> |
| 287 |
| 288 attribute vec3 Vertex; |
| 289 attribute vec2 Tex; |
| 290 |
| 291 varying vec4 texCoord0; |
| 292 void main() |
| 293 { |
| 294 texCoord0 = vec4(Tex.s, 1.0-Tex.t, 0.0, 0.0); |
| 295 gl_Position = vec4(Vertex, 1.0); |
| 296 } |
| 297 </script> |
| 298 <script id="identity-frag" type="x-shader/x-fragment"> |
| 299 |
| 300 precision mediump float; |
| 301 |
| 302 uniform sampler2D Texture; |
| 303 |
| 304 varying vec4 texCoord0; |
| 305 void main() |
| 306 { |
| 307 gl_FragColor = texture2D(Texture, texCoord0.st); |
| 308 } |
| 309 </script> |
| 310 <script id="hblur-frag" type="x-shader/x-fragment"> |
| 311 |
| 312 precision mediump float; |
| 313 |
| 314 uniform sampler2D Texture; |
| 315 uniform float width; |
| 316 |
| 317 varying vec4 texCoord0; |
| 318 void main() |
| 319 { |
| 320 float kernel[7] = float[7](0.006, 0.061, 0.242, 0.383, 0.242, 0.061, 0.006); |
| 321 int i; |
| 322 float step = 1.0 / width; |
| 323 vec4 sum = vec4(0.0); |
| 324 for (i=-3; i<=3; i++) { |
| 325 vec4 tmp = texture2D(Texture, texCoord0.st + vec2(float(i)*step, 0.0)); |
| 326 sum = (tmp * kernel[i+3]) + sum; |
| 327 } |
| 328 gl_FragColor = sum; |
| 329 } |
| 330 </script> |
| 331 <script id="vblur-frag" type="x-shader/x-fragment"> |
| 332 |
| 333 precision mediump float; |
| 334 |
| 335 uniform sampler2D Texture; |
| 336 uniform float height; |
| 337 |
| 338 varying vec4 texCoord0; |
| 339 void main() |
| 340 { |
| 341 float kernel[7] = float[7](0.006, 0.061, 0.242, 0.383, 0.242, 0.061, 0.006); |
| 342 int i; |
| 343 float step = 1.0 / height; |
| 344 vec4 sum = vec4(0.0); |
| 345 for (i=-3; i<=3; i++) { |
| 346 vec4 tmp = texture2D(Texture, texCoord0.st + vec2(0.0, float(i)*step)); |
| 347 sum = (tmp * kernel[i+3]) + sum; |
| 348 } |
| 349 gl_FragColor = sum; |
| 350 } |
| 351 </script> |
| 352 </head><body> |
| 353 <img id="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAA
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" width="2
56" height="256"><br> |
| 354 <div id="cpu">CPU 1x Gaussian blur</div> |
| 355 <div id="cpustat"></div> |
| 356 <canvas id="2d" width="256" height="256"></canvas> |
| 357 <div id="gpu">GPU 1000x Gaussian blur</div> |
| 358 <div id="gpustat"></div> |
| 359 <canvas id="gl" width="256" height="256"></canvas><br> |
| 360 </body></html> |
OLD | NEW |