copy-texture-image-same-texture.html (5876B)
1 <!-- 2 Copyright (c) 2019 The Khronos Group Inc. 3 Use of this source code is governed by an MIT-style license that can be 4 found in the LICENSE.txt file. 5 --> 6 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <title>WebGL CopyTexImage from/to the same texture Tests</title> 12 <link rel="stylesheet" href="../../../resources/js-test-style.css"/> 13 <script src="../../../js/js-test-pre.js"></script> 14 <script src="../../../js/webgl-test-utils.js"></script> 15 </head> 16 <body> 17 <canvas id="example" width="64" height="64"></canvas> 18 <div id="description"></div> 19 <div id="console"></div> 20 <script> 21 "use strict"; 22 23 var wtu = WebGLTestUtils; 24 // https://bugs.chromium.org/p/chromium/issues/detail?id=797235 25 description("This test verifies CopyTexImage2D works if source/destination images belong to the same texture"); 26 debug(""); 27 28 var gl = wtu.create3DContext("example", undefined, 2); 29 30 function enumToString(value) { 31 return wtu.glEnumToString(gl, value); 32 } 33 34 function checkFramebuffer(expected) { 35 var actual = gl.checkFramebufferStatus(gl.FRAMEBUFFER); 36 if (expected.indexOf(actual) < 0) { 37 var msg = "checkFramebufferStatus expects ["; 38 for (var index = 0; index < expected.length; ++index) { 39 msg += wtu.glEnumToString(gl, expected[index]); 40 if (index + 1 < expected.length) 41 msg += ", "; 42 } 43 msg += "], was " + wtu.glEnumToString(gl, actual); 44 testFailed(msg); 45 } else { 46 var msg = "checkFramebufferStatus got " + wtu.glEnumToString(gl, actual) + 47 " as expected"; 48 testPassed(msg); 49 } 50 } 51 52 function checkTextureLevelColor(texture, level, level_width, level_height, x, y, width, height, color) { 53 var fbo = gl.createFramebuffer(); 54 gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); 55 var color_renderable_tex = gl.createTexture(); 56 gl.bindTexture(gl.TEXTURE_2D, color_renderable_tex); 57 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, level_width, level_height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); 58 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, color_renderable_tex, 0); 59 checkFramebuffer([gl.FRAMEBUFFER_COMPLETE]); 60 61 var program = wtu.setupTexturedQuad(gl); 62 gl.bindTexture(gl.TEXTURE_2D, texture); 63 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_BASE_LEVEL, level); 64 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAX_LEVEL, level); 65 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 66 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 67 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); 68 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); 69 wtu.clearAndDrawUnitQuad(gl); 70 wtu.checkCanvasRect(gl, x, y, width, height, color); 71 72 gl.deleteTexture(color_renderable_tex); 73 gl.deleteFramebuffer(fbo); 74 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Check texture level color should generate no GL errors."); 75 } 76 77 function testChangeTargetTextureLevelSize() { 78 debug(""); 79 var fbo = gl.createFramebuffer(); 80 gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); 81 82 var texture = gl.createTexture(); 83 wtu.fillTexture(gl, texture, 64, 64, [255, 0, 0, 255], 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.RGBA8); 84 gl.generateMipmap(gl.TEXTURE_2D); 85 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 1); 86 checkFramebuffer([gl.FRAMEBUFFER_COMPLETE]); 87 88 // fbo source texture is |texture| level 1, 32x32. Target is |texture| level 2, 64x64. 89 // Only one quarter of the target 64x64 will come from the source. 90 // Implementations may insert internal commands before copying over 32x32 in order to 91 // initialize undefined three quarters to 0 as WebGL spec requires. This will actually create 92 // a 64x64 image at level 2 and make the fbo incomplete, thus, the copying will fail. 93 gl.copyTexImage2D(gl.TEXTURE_2D, 2, gl.RGBA8, 0, 0, 64, 64, 0); 94 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "copyTexImage2D should succeed."); 95 checkFramebuffer([gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT]); 96 97 checkTextureLevelColor(texture, 2, 64, 64, 0, 0, 32, 32, [255, 0, 0, 255]); 98 checkTextureLevelColor(texture, 2, 64, 64, 0, 32, 64, 32, [0, 0, 0, 0]); 99 checkTextureLevelColor(texture, 2, 64, 64, 32, 32, 32, 32, [0, 0, 0, 0]); 100 101 gl.deleteFramebuffer(fbo); 102 gl.deleteTexture(texture); 103 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Test should generate no GL errors."); 104 } 105 106 function testChangeTargetTextureLevelFormat() { 107 debug(""); 108 var fbo = gl.createFramebuffer(); 109 gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); 110 111 var texture = gl.createTexture(); 112 wtu.fillTexture(gl, texture, 64, 64, [255, 0, 0, 255], 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.RGBA8); 113 gl.generateMipmap(gl.TEXTURE_2D); 114 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 1); 115 checkFramebuffer([gl.FRAMEBUFFER_COMPLETE]); 116 117 // Using LUNIMANCE_ALPHA format may trigger implementations' emulation code path 118 // on desktop core profile GL, which might change level 2 image definition first 119 // and make the fbo incomplete, thus, the actual copying will fail. 120 gl.copyTexImage2D(gl.TEXTURE_2D, 2, gl.LUMINANCE_ALPHA, 0, 0, 16, 16, 0); 121 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "copyTexImage2D should succeed."); 122 checkFramebuffer([gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT]); 123 124 checkTextureLevelColor(texture, 2, 16, 16, 0, 0, 16, 16, [255, 255, 255, 255]); 125 126 gl.deleteFramebuffer(fbo); 127 gl.deleteTexture(texture); 128 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Test should generate no GL errors."); 129 } 130 131 if (!gl) { 132 testFailed("WebGL context does not exist"); 133 } else { 134 testPassed("WebGL context exists"); 135 testChangeTargetTextureLevelSize(); 136 testChangeTargetTextureLevelFormat(); 137 } 138 139 var successfullyParsed = true; 140 </script> 141 <script src="../../../js/js-test-post.js"></script> 142 143 </body> 144 </html>