1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/canvas/test/webgl-conformance/conformance/misc/object-deletion-behaviour.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,428 @@ 1.4 +<!-- 1.5 +Copyright (c) 2011 The Chromium Authors. 1.6 +Copyright (c) 2011 Mozilla Foundation. 1.7 + 1.8 +All rights reserved. 1.9 +Use of this source code is governed by a BSD-style license that can be 1.10 +found in the LICENSE file. 1.11 + --> 1.12 +<!DOCTYPE html> 1.13 +<html> 1.14 +<head> 1.15 +<meta charset="utf-8"> 1.16 +<link rel="stylesheet" href="../../resources/js-test-style.css"/> 1.17 +<script src="../../resources/js-test-pre.js"></script> 1.18 +<script src="../resources/webgl-test.js"></script> 1.19 +<script src="../resources/webgl-test-utils.js"></script> 1.20 +</head> 1.21 +<body> 1.22 +<div id="description"></div> 1.23 +<div id="console"></div> 1.24 + 1.25 +<script> 1.26 +description("Tests deletion behavior for texture, renderbuffer, shader, and program"); 1.27 + 1.28 +var wtu = WebGLTestUtils; 1.29 +var gl = wtu.create3DContext(); 1.30 +var shouldGenerateGLError = wtu.shouldGenerateGLError; 1.31 + 1.32 +debug(""); 1.33 +debug("shader and program deletion"); 1.34 + 1.35 +var vertexShader = wtu.loadStandardVertexShader(gl); 1.36 +assertMsg(vertexShader, "vertex shader loaded"); 1.37 +var fragmentShader = wtu.loadStandardFragmentShader(gl); 1.38 +assertMsg(fragmentShader, "fragment shader loaded"); 1.39 + 1.40 +var program = gl.createProgram(); 1.41 +shouldBeNonNull("program"); 1.42 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.attachShader(program, vertexShader)"); 1.43 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.attachShader(program, fragmentShader)"); 1.44 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.linkProgram(program)"); 1.45 +shouldBeTrue("gl.getProgramParameter(program, gl.LINK_STATUS)"); 1.46 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.useProgram(program)"); 1.47 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteShader(vertexShader)"); 1.48 +shouldBeTrue("gl.isShader(vertexShader)"); 1.49 +shouldBeTrue("gl.getShaderParameter(vertexShader, gl.DELETE_STATUS)"); 1.50 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.detachShader(program, vertexShader)"); 1.51 +shouldBeFalse("gl.isShader(vertexShader)"); 1.52 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteShader(fragmentShader)"); 1.53 +shouldBeTrue("gl.isShader(fragmentShader)"); 1.54 +shouldBeTrue("gl.getShaderParameter(fragmentShader, gl.DELETE_STATUS)"); 1.55 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteProgram(program)"); 1.56 +shouldBeTrue("gl.isProgram(program)"); 1.57 +shouldBeTrue("gl.getProgramParameter(program, gl.DELETE_STATUS)"); 1.58 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.useProgram(null)"); 1.59 +shouldBeFalse("gl.isProgram(program)"); 1.60 +shouldBeFalse("gl.isShader(fragmentShader)"); 1.61 + 1.62 +debug(""); 1.63 +debug("texture deletion"); 1.64 + 1.65 +var fbo = gl.createFramebuffer(), fbo2 = gl.createFramebuffer(), fbo3 = gl.createFramebuffer(); 1.66 +shouldBeNonNull("fbo"); 1.67 +shouldBeNonNull("fbo2"); 1.68 +shouldBeNonNull("fbo3"); 1.69 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.70 + 1.71 +var tex = gl.createTexture(); 1.72 +shouldBeNonNull("tex"); 1.73 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)"); 1.74 +shouldBe("gl.getParameter(gl.TEXTURE_BINDING_2D)", "tex"); 1.75 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)"); 1.76 +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "tex"); 1.77 +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.TEXTURE"); 1.78 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)"); 1.79 +// Deleting a texture bound to the currently-bound fbo is the same as 1.80 +// detaching the textue from fbo first, then delete the texture. 1.81 +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); 1.82 +shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 1.83 +shouldBeFalse("gl.isTexture(tex)"); 1.84 +shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); 1.85 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)"); 1.86 +shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); 1.87 + 1.88 +var texCubeMap = gl.createTexture(); 1.89 +shouldBeNonNull("texCubeMap"); 1.90 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)"); 1.91 +shouldBe("gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)", "texCubeMap"); 1.92 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(texCubeMap)"); 1.93 +shouldBeFalse("gl.isTexture(texCubeMap)"); 1.94 +shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)"); 1.95 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)"); 1.96 +shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)"); 1.97 + 1.98 +var t = gl.createTexture(); 1.99 +shouldBeNonNull("t"); 1.100 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t)"); 1.101 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)"); 1.102 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(t)"); 1.103 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t)"); 1.104 +shouldGenerateGLError(gl, gl.INVALID_OPERATION, "gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)"); 1.105 + 1.106 +var t2 = gl.createTexture(); 1.107 +shouldBeNonNull("t2"); 1.108 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.activeTexture(gl.TEXTURE0)"); 1.109 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t2)"); 1.110 +shouldBe("gl.getParameter(gl.TEXTURE_BINDING_2D)", "t2"); 1.111 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.activeTexture(gl.TEXTURE1)"); 1.112 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, t2)"); 1.113 +shouldBe("gl.getParameter(gl.TEXTURE_BINDING_2D)", "t2"); 1.114 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(t2)"); 1.115 +shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); 1.116 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.activeTexture(gl.TEXTURE0)"); 1.117 +shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); 1.118 + 1.119 +debug(""); 1.120 +debug("renderbuffer deletion"); 1.121 + 1.122 +var rbo = gl.createRenderbuffer(), rbo2 = gl.createRenderbuffer(), rbo3 = gl.createRenderbuffer(); 1.123 +shouldBeNonNull("rbo"); 1.124 +shouldBeNonNull("rbo2"); 1.125 +shouldBeNonNull("rbo3"); 1.126 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); 1.127 +shouldBe("gl.getParameter(gl.RENDERBUFFER_BINDING)", "rbo"); 1.128 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)"); 1.129 +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo"); 1.130 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)"); 1.131 +// Deleting a renderbuffer bound to the currently-bound fbo is the same as 1.132 +// detaching the renderbuffer from fbo first, then delete the renderbuffer. 1.133 +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); 1.134 +shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 1.135 +shouldBeFalse("gl.isRenderbuffer(rbo)"); 1.136 +shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)"); 1.137 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); 1.138 +shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)"); 1.139 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo2)"); 1.140 +shouldBe("gl.getParameter(gl.RENDERBUFFER_BINDING)", "rbo2"); 1.141 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo3)"); 1.142 +shouldBe("gl.getParameter(gl.RENDERBUFFER_BINDING)", "rbo2"); 1.143 + 1.144 +debug(""); 1.145 +debug("using deleted renderbuffer"); 1.146 +rbo = gl.createRenderbuffer(); 1.147 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); 1.148 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)"); 1.149 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.150 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)"); 1.151 +if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 1.152 + // make backbuffer red 1.153 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.154 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(1,0,0,1)"); 1.155 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.156 + // make fbo green 1.157 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.158 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)"); 1.159 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.160 + // Bind backbuffer. 1.161 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.162 + // delete renderbuffer. It should still be attached to fbo though. 1.163 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)"); 1.164 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")'); 1.165 + // Use fbo that has deleted rbo. 1.166 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.167 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,255,0,255], "fbo should be green")'); 1.168 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)"); 1.169 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.170 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,0,255,255], "fbo should be blue")'); 1.171 + // Bind backbuffer. 1.172 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.173 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")'); 1.174 +} 1.175 + 1.176 +debug(""); 1.177 +debug("renderbuffer attached twice to same framebuffer"); 1.178 +rbo = gl.createRenderbuffer(); 1.179 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); 1.180 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)"); 1.181 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.182 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)"); 1.183 +if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 1.184 + rbo2 = gl.createRenderbuffer(); 1.185 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo2)"); 1.186 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)"); 1.187 + // attach rbo2 at two attachment points incompatible with it 1.188 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rbo2)"); 1.189 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, rbo2)"); 1.190 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo2"); 1.191 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo2"); 1.192 + // fbo can't be complete as rbo2 is attached at incompatible attachment points 1.193 + shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.194 + // now we delete rbo2, which detaches it from the two attachment points where it currently is attached 1.195 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo2)"); 1.196 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); 1.197 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); 1.198 + // we should now be in the same state as before with only rbo attached, so fbo should be complete again 1.199 + shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.200 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo"); 1.201 +} 1.202 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)"); 1.203 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.204 + 1.205 + 1.206 + 1.207 +debug(""); 1.208 +debug("using deleted texture"); 1.209 +tex = gl.createTexture(); 1.210 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)"); 1.211 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.212 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)"); 1.213 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)"); 1.214 +if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 1.215 + // make fbo green 1.216 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.217 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)"); 1.218 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.219 + // Bind backbuffer. 1.220 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.221 + // delete texture. It should still be attached to fbo though. 1.222 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)"); 1.223 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [255,0,0,255], "backbuffer should be red")'); 1.224 + // Use fbo that has deleted texture. 1.225 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.226 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,255,0,255], "fbo should be green")'); 1.227 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)"); 1.228 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.229 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,0,255,255], "fbo should be blue")'); 1.230 + // Bind backbuffer. 1.231 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.232 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")'); 1.233 +} 1.234 + 1.235 +debug(""); 1.236 +debug("using deleted renderbuffer"); 1.237 +rbo = gl.createRenderbuffer(); 1.238 +shouldBeNonNull("rbo"); 1.239 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); 1.240 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)"); 1.241 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.242 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)"); 1.243 +if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 1.244 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)"); 1.245 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)"); 1.246 + shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.247 + // make backbuffer red 1.248 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.249 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(1,0,0,1)"); 1.250 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.251 + // make fbo green 1.252 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.253 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)"); 1.254 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.255 + // delete renderbuffer. It should still be attached to fbo2 though. 1.256 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)"); 1.257 + // fbo has no attachments 1.258 + shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.259 + // Use fbo2 that has deleted rbo. 1.260 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)"); 1.261 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,255,0,255], "fbo should be green")'); 1.262 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)"); 1.263 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.264 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,0,255,255], "fbo should be blue")'); 1.265 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "rbo"); 1.266 + 1.267 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.268 + shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 1.269 + shouldGenerateGLError(gl, gl.NONE, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)"); 1.270 + shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.271 + // Bind backbuffer. 1.272 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.273 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")'); 1.274 +} 1.275 + 1.276 +debug(""); 1.277 +debug("using deleted texture"); 1.278 +tex = gl.createTexture(); 1.279 +shouldBeNonNull("tex"); 1.280 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)"); 1.281 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.282 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)"); 1.283 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)"); 1.284 +if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 1.285 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)"); 1.286 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0)"); 1.287 + // make fbo green 1.288 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.289 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)"); 1.290 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.291 + // delete texture. It should still be attached to fbo2 though. 1.292 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)"); 1.293 + // fbo has no attachments 1.294 + shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.295 + // Use fbo that has deleted texture. 1.296 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)"); 1.297 + shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.298 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,255,0,255], "fbo should be green")'); 1.299 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,0,1,1)"); 1.300 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.301 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 1, 1, [0,0,255,255], "fbo should be blue")'); 1.302 + shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", "tex"); 1.303 + 1.304 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.305 + shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); 1.306 + shouldNotBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); 1.307 + // Bind backbuffer. 1.308 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.309 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [255,0,0,255], "backbuffer should be red")'); 1.310 +} 1.311 + 1.312 +debug(""); 1.313 +debug("buffer deletion"); 1.314 + 1.315 +var buffer = gl.createBuffer(); 1.316 +shouldBeNonNull("buffer"); 1.317 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer)"); 1.318 +shouldBe("gl.getParameter(gl.ARRAY_BUFFER_BINDING)", "buffer"); 1.319 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(buffer)"); 1.320 +shouldBeFalse("gl.isBuffer(buffer)"); 1.321 +shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)"); 1.322 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer)"); 1.323 +shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)"); 1.324 + 1.325 +var buffer2 = gl.createBuffer(); 1.326 +shouldBeNonNull("buffer2"); 1.327 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer2)"); 1.328 +shouldBe("gl.getParameter(gl.ARRAY_BUFFER_BINDING)", "buffer2"); 1.329 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, null)"); 1.330 +shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)"); 1.331 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(buffer2)"); 1.332 +shouldBeFalse("gl.isBuffer(buffer2)"); 1.333 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, buffer2)"); 1.334 +shouldBeNull("gl.getParameter(gl.ARRAY_BUFFER_BINDING)"); 1.335 + 1.336 +var bufferElement = gl.createBuffer(); 1.337 +shouldBeNonNull("bufferElement"); 1.338 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferElement)"); 1.339 +shouldBe("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)", "bufferElement"); 1.340 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(bufferElement)"); 1.341 +shouldBeFalse("gl.isBuffer(bufferElement)"); 1.342 +shouldBeNull("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)"); 1.343 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferElement)"); 1.344 +shouldBeNull("gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)"); 1.345 + 1.346 +var b = gl.createBuffer(); 1.347 +shouldBeNonNull("b"); 1.348 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b)"); 1.349 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW)"); 1.350 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(b)"); 1.351 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b)"); 1.352 +shouldGenerateGLError(gl, gl.INVALID_OPERATION, "gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW)"); 1.353 + 1.354 +var b1 = gl.createBuffer(); 1.355 +shouldBeNonNull("b1"); 1.356 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b1);"); 1.357 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enableVertexAttribArray(1);"); 1.358 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);"); 1.359 +var b2 = gl.createBuffer(); 1.360 +shouldBeNonNull("b2"); 1.361 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindBuffer(gl.ARRAY_BUFFER, b2);"); 1.362 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enableVertexAttribArray(2);"); 1.363 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.vertexAttribPointer(2, 4, gl.FLOAT, false, 0, 0);"); 1.364 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enableVertexAttribArray(3);"); 1.365 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.vertexAttribPointer(3, 4, gl.FLOAT, false, 0, 0);"); 1.366 +shouldBe("gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b1"); 1.367 +shouldBe("gl.getVertexAttrib(2, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b2"); 1.368 +shouldBe("gl.getVertexAttrib(3, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b2"); 1.369 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(b2);"); 1.370 +shouldBe("gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", "b1"); 1.371 +shouldBeNull("gl.getVertexAttrib(2, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)"); 1.372 +shouldBeNull("gl.getVertexAttrib(3, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)"); 1.373 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteBuffer(b1);"); 1.374 +shouldBeNull("gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)"); 1.375 + 1.376 +debug(""); 1.377 +debug("framebuffer deletion"); 1.378 + 1.379 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.380 +shouldBe("gl.getParameter(gl.FRAMEBUFFER_BINDING)", "fbo"); 1.381 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteFramebuffer(fbo)"); 1.382 +shouldBeFalse("gl.isFramebuffer(fbo)"); 1.383 +shouldBeNull("gl.getParameter(gl.FRAMEBUFFER_BINDING)"); 1.384 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.385 +shouldBeNull("gl.getParameter(gl.FRAMEBUFFER_BINDING)"); 1.386 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2)"); 1.387 +shouldBe("gl.getParameter(gl.FRAMEBUFFER_BINDING)", "fbo2"); 1.388 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteFramebuffer(fbo3)"); 1.389 +shouldBe("gl.getParameter(gl.FRAMEBUFFER_BINDING)", "fbo2"); 1.390 + 1.391 +fbo = gl.createFramebuffer(); 1.392 +rbo = gl.createRenderbuffer(); 1.393 +shouldBeNonNull("fbo"); 1.394 +shouldBeNonNull("rbo"); 1.395 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.396 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); 1.397 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16)"); 1.398 +shouldGenerateGLError(gl, gl.NO_ERROR, "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo)"); 1.399 +if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 1.400 + // set backbuffer to red 1.401 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.402 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(1,0,0,1)"); 1.403 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.404 + // set framebuffer to green 1.405 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, fbo)"); 1.406 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)"); 1.407 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.408 + // check framebuffer 1.409 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 16, 16, [0,255,0,255], "fbo should be green")'); 1.410 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 16, 16, 1, 1, [0,0,0,0], "outside fbo should be black")'); 1.411 + // delete framebuffer. because this was the bound fbo the backbuffer should be active now 1.412 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteFramebuffer(fbo)"); 1.413 + // check backbuffer 1.414 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 300, 150, [255,0,0,255], "backbuffer should be red")'); 1.415 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 300, 0, 300, 300, [0,0,0,0], "outside backbuffer should be black")'); 1.416 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 150, 300, 300, [0,0,0,0], "outside backbuffer should be black")'); 1.417 + // check drawing to backbuffer 1.418 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clearColor(0,1,0,1)"); 1.419 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.clear(gl.COLOR_BUFFER_BIT)"); 1.420 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 300, 150, [0,255,0,255], "fbo should be green")'); 1.421 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindFramebuffer(gl.FRAMEBUFFER, null)"); 1.422 + // check again because many buggy implementations will have bound to the true backbuffer on deleteFramebuffer. 1.423 + shouldGenerateGLError(gl, gl.NO_ERROR, 'wtu.checkCanvasRect(gl, 0, 0, 300, 150, [0,255,0,255], "fbo should be green")'); 1.424 +} 1.425 + 1.426 +successfullyParsed = true; 1.427 +</script> 1.428 + 1.429 +<script>finishTest();</script> 1.430 +</body> 1.431 +</html>