content/canvas/test/webgl-conformance/conformance/misc/object-deletion-behaviour.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.

michael@0 1 <!--
michael@0 2 Copyright (c) 2011 The Chromium Authors.
michael@0 3 Copyright (c) 2011 Mozilla Foundation.
michael@0 4
michael@0 5 All rights reserved.
michael@0 6 Use of this source code is governed by a BSD-style license that can be
michael@0 7 found in the LICENSE file.
michael@0 8 -->
michael@0 9 <!DOCTYPE html>
michael@0 10 <html>
michael@0 11 <head>
michael@0 12 <meta charset="utf-8">
michael@0 13 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
michael@0 14 <script src="../../resources/js-test-pre.js"></script>
michael@0 15 <script src="../resources/webgl-test.js"></script>
michael@0 16 <script src="../resources/webgl-test-utils.js"></script>
michael@0 17 </head>
michael@0 18 <body>
michael@0 19 <div id="description"></div>
michael@0 20 <div id="console"></div>
michael@0 21
michael@0 22 <script>
michael@0 23 description("Tests deletion behavior for texture, renderbuffer, shader, and program");
michael@0 24
michael@0 25 var wtu = WebGLTestUtils;
michael@0 26 var gl = wtu.create3DContext();
michael@0 27 var shouldGenerateGLError = wtu.shouldGenerateGLError;
michael@0 28
michael@0 29 debug("");
michael@0 30 debug("shader and program deletion");
michael@0 31
michael@0 32 var vertexShader = wtu.loadStandardVertexShader(gl);
michael@0 33 assertMsg(vertexShader, "vertex shader loaded");
michael@0 34 var fragmentShader = wtu.loadStandardFragmentShader(gl);
michael@0 35 assertMsg(fragmentShader, "fragment shader loaded");
michael@0 36
michael@0 37 var program = gl.createProgram();
michael@0 38 shouldBeNonNull("program");
michael@0 39 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.attachShader(program, vertexShader)");
michael@0 40 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.attachShader(program, fragmentShader)");
michael@0 41 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.linkProgram(program)");
michael@0 42 shouldBeTrue("gl.getProgramParameter(program, gl.LINK_STATUS)");
michael@0 43 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.useProgram(program)");
michael@0 44 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteShader(vertexShader)");
michael@0 45 shouldBeTrue("gl.isShader(vertexShader)");
michael@0 46 shouldBeTrue("gl.getShaderParameter(vertexShader, gl.DELETE_STATUS)");
michael@0 47 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.detachShader(program, vertexShader)");
michael@0 48 shouldBeFalse("gl.isShader(vertexShader)");
michael@0 49 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteShader(fragmentShader)");
michael@0 50 shouldBeTrue("gl.isShader(fragmentShader)");
michael@0 51 shouldBeTrue("gl.getShaderParameter(fragmentShader, gl.DELETE_STATUS)");
michael@0 52 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteProgram(program)");
michael@0 53 shouldBeTrue("gl.isProgram(program)");
michael@0 54 shouldBeTrue("gl.getProgramParameter(program, gl.DELETE_STATUS)");
michael@0 55 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.useProgram(null)");
michael@0 56 shouldBeFalse("gl.isProgram(program)");
michael@0 57 shouldBeFalse("gl.isShader(fragmentShader)");
michael@0 58
michael@0 59 debug("");
michael@0 60 debug("texture deletion");
michael@0 61
michael@0 62 var fbo = gl.createFramebuffer(), fbo2 = gl.createFramebuffer(), fbo3 = gl.createFramebuffer();
michael@0 63 shouldBeNonNull("fbo");
michael@0 64 shouldBeNonNull("fbo2");
michael@0 65 shouldBeNonNull("fbo3");
michael@0 66 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 67
michael@0 68 var tex = gl.createTexture();
michael@0 69 shouldBeNonNull("tex");
michael@0 70 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)");
michael@0 71 shouldBe("gl.getParameter(gl.TEXTURE_BINDING_2D)", "tex");
michael@0 72 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)");
michael@0 73 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "tex");
michael@0 74 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.TEXTURE");
michael@0 75 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)");
michael@0 76 // Deleting a texture bound to the currently-bound fbo is the same as
michael@0 77 // detaching the textue from fbo first, then delete the texture.
michael@0 78 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE");
michael@0 79 shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
michael@0 80 shouldBeFalse("gl.isTexture(tex)");
michael@0 81 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)");
michael@0 82 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)");
michael@0 83 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)");
michael@0 84
michael@0 85 var texCubeMap = gl.createTexture();
michael@0 86 shouldBeNonNull("texCubeMap");
michael@0 87 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)");
michael@0 88 shouldBe("gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)", "texCubeMap");
michael@0 89 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(texCubeMap)");
michael@0 90 shouldBeFalse("gl.isTexture(texCubeMap)");
michael@0 91 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)");
michael@0 92 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)");
michael@0 93 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)");
michael@0 94
michael@0 95 var t = gl.createTexture();
michael@0 96 shouldBeNonNull("t");
michael@0 97 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t)");
michael@0 98 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)");
michael@0 99 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(t)");
michael@0 100 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t)");
michael@0 101 shouldGenerateGLError(gl, gl.INVALID_OPERATION, "gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)");
michael@0 102
michael@0 103 var t2 = gl.createTexture();
michael@0 104 shouldBeNonNull("t2");
michael@0 105 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.activeTexture(gl.TEXTURE0)");
michael@0 106 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t2)");
michael@0 107 shouldBe("gl.getParameter(gl.TEXTURE_BINDING_2D)", "t2");
michael@0 108 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.activeTexture(gl.TEXTURE1)");
michael@0 109 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t2)");
michael@0 110 shouldBe("gl.getParameter(gl.TEXTURE_BINDING_2D)", "t2");
michael@0 111 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(t2)");
michael@0 112 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)");
michael@0 113 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.activeTexture(gl.TEXTURE0)");
michael@0 114 shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)");
michael@0 115
michael@0 116 debug("");
michael@0 117 debug("renderbuffer deletion");
michael@0 118
michael@0 119 var rbo = gl.createRenderbuffer(), rbo2 = gl.createRenderbuffer(), rbo3 = gl.createRenderbuffer();
michael@0 120 shouldBeNonNull("rbo");
michael@0 121 shouldBeNonNull("rbo2");
michael@0 122 shouldBeNonNull("rbo3");
michael@0 123 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
michael@0 124 shouldBe("gl.getParameter(gl.RENDERBUFFER_BINDING)", "rbo");
michael@0 125 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)");
michael@0 126 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo");
michael@0 127 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)");
michael@0 128 // Deleting a renderbuffer bound to the currently-bound fbo is the same as
michael@0 129 // detaching the renderbuffer from fbo first, then delete the renderbuffer.
michael@0 130 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE");
michael@0 131 shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
michael@0 132 shouldBeFalse("gl.isRenderbuffer(rbo)");
michael@0 133 shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)");
michael@0 134 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
michael@0 135 shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)");
michael@0 136 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo2)");
michael@0 137 shouldBe("gl.getParameter(gl.RENDERBUFFER_BINDING)", "rbo2");
michael@0 138 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo3)");
michael@0 139 shouldBe("gl.getParameter(gl.RENDERBUFFER_BINDING)", "rbo2");
michael@0 140
michael@0 141 debug("");
michael@0 142 debug("using deleted renderbuffer");
michael@0 143 rbo = gl.createRenderbuffer();
michael@0 144 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
michael@0 145 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)");
michael@0 146 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 147 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)");
michael@0 148 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) {
michael@0 149 // make backbuffer red
michael@0 150 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 151 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(1,0,0,1)");
michael@0 152 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 153 // make fbo green
michael@0 154 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 155 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)");
michael@0 156 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 157 // Bind backbuffer.
michael@0 158 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 159 // delete renderbuffer. It should still be attached to fbo though.
michael@0 160 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)");
michael@0 161 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")');
michael@0 162 // Use fbo that has deleted rbo.
michael@0 163 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 164 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,255,0,255], "fbo should be green")');
michael@0 165 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)");
michael@0 166 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 167 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,0,255,255], "fbo should be blue")');
michael@0 168 // Bind backbuffer.
michael@0 169 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 170 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")');
michael@0 171 }
michael@0 172
michael@0 173 debug("");
michael@0 174 debug("renderbuffer attached twice to same framebuffer");
michael@0 175 rbo = gl.createRenderbuffer();
michael@0 176 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
michael@0 177 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)");
michael@0 178 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 179 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)");
michael@0 180 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) {
michael@0 181 rbo2 = gl.createRenderbuffer();
michael@0 182 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo2)");
michael@0 183 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)");
michael@0 184 // attach rbo2 at two attachment points incompatible with it
michael@0 185 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rbo2)");
michael@0 186 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, rbo2)");
michael@0 187 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo2");
michael@0 188 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo2");
michael@0 189 // fbo can't be complete as rbo2 is attached at incompatible attachment points
michael@0 190 shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 191 // now we delete rbo2, which detaches it from the two attachment points where it currently is attached
michael@0 192 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo2)");
michael@0 193 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE");
michael@0 194 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE");
michael@0 195 // we should now be in the same state as before with only rbo attached, so fbo should be complete again
michael@0 196 shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 197 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo");
michael@0 198 }
michael@0 199 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)");
michael@0 200 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 201
michael@0 202
michael@0 203
michael@0 204 debug("");
michael@0 205 debug("using deleted texture");
michael@0 206 tex = gl.createTexture();
michael@0 207 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)");
michael@0 208 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 209 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)");
michael@0 210 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)");
michael@0 211 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) {
michael@0 212 // make fbo green
michael@0 213 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 214 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)");
michael@0 215 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 216 // Bind backbuffer.
michael@0 217 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 218 // delete texture. It should still be attached to fbo though.
michael@0 219 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)");
michael@0 220 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [255,0,0,255], "backbuffer should be red")');
michael@0 221 // Use fbo that has deleted texture.
michael@0 222 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 223 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,255,0,255], "fbo should be green")');
michael@0 224 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)");
michael@0 225 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 226 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,0,255,255], "fbo should be blue")');
michael@0 227 // Bind backbuffer.
michael@0 228 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 229 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")');
michael@0 230 }
michael@0 231
michael@0 232 debug("");
michael@0 233 debug("using deleted renderbuffer");
michael@0 234 rbo = gl.createRenderbuffer();
michael@0 235 shouldBeNonNull("rbo");
michael@0 236 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
michael@0 237 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)");
michael@0 238 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 239 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)");
michael@0 240 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) {
michael@0 241 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)");
michael@0 242 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)");
michael@0 243 shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 244 // make backbuffer red
michael@0 245 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 246 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(1,0,0,1)");
michael@0 247 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 248 // make fbo green
michael@0 249 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 250 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)");
michael@0 251 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 252 // delete renderbuffer. It should still be attached to fbo2 though.
michael@0 253 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)");
michael@0 254 // fbo has no attachments
michael@0 255 shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 256 // Use fbo2 that has deleted rbo.
michael@0 257 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)");
michael@0 258 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,255,0,255], "fbo should be green")');
michael@0 259 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)");
michael@0 260 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 261 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,0,255,255], "fbo should be blue")');
michael@0 262 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo");
michael@0 263
michael@0 264 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 265 shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
michael@0 266 shouldGenerateGLError(gl, gl.NONE, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)");
michael@0 267 shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 268 // Bind backbuffer.
michael@0 269 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 270 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")');
michael@0 271 }
michael@0 272
michael@0 273 debug("");
michael@0 274 debug("using deleted texture");
michael@0 275 tex = gl.createTexture();
michael@0 276 shouldBeNonNull("tex");
michael@0 277 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)");
michael@0 278 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 279 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)");
michael@0 280 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)");
michael@0 281 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) {
michael@0 282 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)");
michael@0 283 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)");
michael@0 284 // make fbo green
michael@0 285 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 286 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)");
michael@0 287 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 288 // delete texture. It should still be attached to fbo2 though.
michael@0 289 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)");
michael@0 290 // fbo has no attachments
michael@0 291 shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 292 // Use fbo that has deleted texture.
michael@0 293 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)");
michael@0 294 shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 295 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,255,0,255], "fbo should be green")');
michael@0 296 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)");
michael@0 297 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 298 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,0,255,255], "fbo should be blue")');
michael@0 299 shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "tex");
michael@0 300
michael@0 301 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 302 shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
michael@0 303 shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
michael@0 304 // Bind backbuffer.
michael@0 305 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 306 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")');
michael@0 307 }
michael@0 308
michael@0 309 debug("");
michael@0 310 debug("buffer deletion");
michael@0 311
michael@0 312 var buffer = gl.createBuffer();
michael@0 313 shouldBeNonNull("buffer");
michael@0 314 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer)");
michael@0 315 shouldBe("gl.getParameter(gl.ARRAY_BUFFER_BINDING)", "buffer");
michael@0 316 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(buffer)");
michael@0 317 shouldBeFalse("gl.isBuffer(buffer)");
michael@0 318 shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)");
michael@0 319 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer)");
michael@0 320 shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)");
michael@0 321
michael@0 322 var buffer2 = gl.createBuffer();
michael@0 323 shouldBeNonNull("buffer2");
michael@0 324 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer2)");
michael@0 325 shouldBe("gl.getParameter(gl.ARRAY_BUFFER_BINDING)", "buffer2");
michael@0 326 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, null)");
michael@0 327 shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)");
michael@0 328 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(buffer2)");
michael@0 329 shouldBeFalse("gl.isBuffer(buffer2)");
michael@0 330 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer2)");
michael@0 331 shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)");
michael@0 332
michael@0 333 var bufferElement = gl.createBuffer();
michael@0 334 shouldBeNonNull("bufferElement");
michael@0 335 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferElement)");
michael@0 336 shouldBe("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)", "bufferElement");
michael@0 337 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(bufferElement)");
michael@0 338 shouldBeFalse("gl.isBuffer(bufferElement)");
michael@0 339 shouldBeNull("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)");
michael@0 340 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferElement)");
michael@0 341 shouldBeNull("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)");
michael@0 342
michael@0 343 var b = gl.createBuffer();
michael@0 344 shouldBeNonNull("b");
michael@0 345 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b)");
michael@0 346 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW)");
michael@0 347 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(b)");
michael@0 348 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b)");
michael@0 349 shouldGenerateGLError(gl, gl.INVALID_OPERATION, "gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW)");
michael@0 350
michael@0 351 var b1 = gl.createBuffer();
michael@0 352 shouldBeNonNull("b1");
michael@0 353 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b1);");
michael@0 354 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enableVertexAttribArray(1);");
michael@0 355 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);");
michael@0 356 var b2 = gl.createBuffer();
michael@0 357 shouldBeNonNull("b2");
michael@0 358 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b2);");
michael@0 359 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enableVertexAttribArray(2);");
michael@0 360 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);");
michael@0 361 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enableVertexAttribArray(3);");
michael@0 362 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.vertexAttribPointer(3, 4, gl.FLOAT, false, 0, 0);");
michael@0 363 shouldBe("gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b1");
michael@0 364 shouldBe("gl.getVertexAttrib(2, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b2");
michael@0 365 shouldBe("gl.getVertexAttrib(3, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b2");
michael@0 366 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(b2);");
michael@0 367 shouldBe("gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b1");
michael@0 368 shouldBeNull("gl.getVertexAttrib(2, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)");
michael@0 369 shouldBeNull("gl.getVertexAttrib(3, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)");
michael@0 370 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(b1);");
michael@0 371 shouldBeNull("gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)");
michael@0 372
michael@0 373 debug("");
michael@0 374 debug("framebuffer deletion");
michael@0 375
michael@0 376 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 377 shouldBe("gl.getParameter(gl.FRAMEBUFFER_BINDING)", "fbo");
michael@0 378 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteFramebuffer(fbo)");
michael@0 379 shouldBeFalse("gl.isFramebuffer(fbo)");
michael@0 380 shouldBeNull("gl.getParameter(gl.FRAMEBUFFER_BINDING)");
michael@0 381 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 382 shouldBeNull("gl.getParameter(gl.FRAMEBUFFER_BINDING)");
michael@0 383 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)");
michael@0 384 shouldBe("gl.getParameter(gl.FRAMEBUFFER_BINDING)", "fbo2");
michael@0 385 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteFramebuffer(fbo3)");
michael@0 386 shouldBe("gl.getParameter(gl.FRAMEBUFFER_BINDING)", "fbo2");
michael@0 387
michael@0 388 fbo = gl.createFramebuffer();
michael@0 389 rbo = gl.createRenderbuffer();
michael@0 390 shouldBeNonNull("fbo");
michael@0 391 shouldBeNonNull("rbo");
michael@0 392 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 393 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
michael@0 394 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)");
michael@0 395 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)");
michael@0 396 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) {
michael@0 397 // set backbuffer to red
michael@0 398 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 399 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(1,0,0,1)");
michael@0 400 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 401 // set framebuffer to green
michael@0 402 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)");
michael@0 403 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)");
michael@0 404 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 405 // check framebuffer
michael@0 406 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,255,0,255], "fbo should be green")');
michael@0 407 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 16, 16, 1, 1, [0,0,0,0], "outside fbo should be black")');
michael@0 408 // delete framebuffer. because this was the bound fbo the backbuffer should be active now
michael@0 409 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteFramebuffer(fbo)");
michael@0 410 // check backbuffer
michael@0 411 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 300, 150, [255,0,0,255], "backbuffer should be red")');
michael@0 412 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 300, 0, 300, 300, [0,0,0,0], "outside backbuffer should be black")');
michael@0 413 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 150, 300, 300, [0,0,0,0], "outside backbuffer should be black")');
michael@0 414 // check drawing to backbuffer
michael@0 415 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)");
michael@0 416 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)");
michael@0 417 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 300, 150, [0,255,0,255], "fbo should be green")');
michael@0 418 shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)");
michael@0 419 // check again because many buggy implementations will have bound to the true backbuffer on deleteFramebuffer.
michael@0 420 shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 300, 150, [0,255,0,255], "fbo should be green")');
michael@0 421 }
michael@0 422
michael@0 423 successfullyParsed = true;
michael@0 424 </script>
michael@0 425
michael@0 426 <script>finishTest();</script>
michael@0 427 </body>
michael@0 428 </html>

mercurial