diff options
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copy-tex-image-2d-formats.html')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copy-tex-image-2d-formats.html | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copy-tex-image-2d-formats.html b/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copy-tex-image-2d-formats.html new file mode 100644 index 0000000000..fd44f9cc73 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copy-tex-image-2d-formats.html @@ -0,0 +1,173 @@ +<!-- +Copyright (c) 2019 The Khronos Group Inc. +Use of this source code is governed by an MIT-style license that can be +found in the LICENSE.txt file. +--> + +<!DOCTYPE html> +<html> +<head> +<title>Verify copyTexImage2D follows format restictions</title> +<meta charset="utf-8"> +<link rel="stylesheet" href="../../../resources/js-test-style.css"/> +<script src="../../../js/js-test-pre.js"></script> +<script src="../../../js/webgl-test-utils.js"></script> +</head> +<body> +<div id="description"></div> +<canvas id="canvas" width="2" height="2"></canvas> +<canvas id="canvasNoAlpha" width="2" height="2"></canvas> +<div id="console"></div> +<script> +"use strict"; + +function getChannelsFromFormat(format) { + switch (gl[format]) { + case gl.ALPHA: + return 0x0001; + case gl.LUMINANCE: + case gl.RGB: + return 0x1110; + case gl.LUMINANCE_ALPHA: + case gl.RGBA: + return 0x1111; + default: + return 0; + } +} + +var formats = [ + 'ALPHA', + 'LUMINANCE', + 'LUMINANCE_ALPHA', + 'RGB', + 'RGBA' +]; + +var isRenderable = { + 'ALPHA': false, + 'LUMINANCE': false, + 'LUMINANCE_ALPHA': false, + 'RGB': true, + 'RGBA': true +}; + +var gl = null; +var wtu = WebGLTestUtils; + +description(); + +var canvas = document.getElementById("canvas"); +var canvasNoAlpha = document.getElementById("canvasNoAlpha"); +var gl = wtu.create3DContext(canvas, {alpha:true}); +var glNoAlpha = wtu.create3DContext(canvasNoAlpha, {alpha:false}); + +debug("test with an RGBA backbuffer"); +var program = wtu.setupTexturedQuad(gl); +wtu.glErrorShouldBe(gl, gl.NO_ERROR, "During Initialization"); +testFormats('RGBA'); + +testBackbufferFormats(); + +debug("test with an RGB backbuffer"); +var gl = glNoAlpha; +var program = wtu.setupTexturedQuad(gl); +wtu.glErrorShouldBe(gl, gl.NO_ERROR, "During Initialization"); +testFormats('RGB'); + +function testBackbufferFormats() { + var fbo = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); + + for (var ii = 0; ii < formats.length; ++ii) { + var backFormat = formats[ii]; + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl[backFormat], 2, 2, 0, gl[backFormat], gl.UNSIGNED_BYTE, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + + debug(''); + if (status == gl.FRAMEBUFFER_COMPLETE) { + if (!isRenderable[backFormat]) { + testFailed('Creating framebuffer from ' + backFormat + ' texture succeeded even though it is not a renderable format'); + } else { + debug('test with ' + backFormat + ' fbo'); + testFormats(backFormat); + } + } else { + debug(backFormat + ' not supported as a renderbuffer attachment'); + } + } +} + +function testFormats(backFormat) { + for (var ii = 0; ii < formats.length; ++ii) { + testCopyTexImage2D(backFormat, formats[ii]); + } +} + +function toChannels(value) { + return ((value & 0x1000) ? 'R' : '_') + + ((value & 0x0100) ? 'G' : '_') + + ((value & 0x0010) ? 'B' : '_') + + ((value & 0x0001) ? 'A' : '_'); +} + +function testCopyTexImage2D(backFormat, texFormat) { + var need = getChannelsFromFormat(texFormat); + var have = getChannelsFromFormat(backFormat); + var shouldPass = (need & have) == need; + + //debug("need: " + toChannels(need)); + //debug("have: " + toChannels(have)); + //debug("both: " + toChannels(have & need)); + + // clear backbuffer + gl.clearColor(0.25, 1, 0.75, 0.5); + gl.clear(gl.COLOR_BUFFER_BIT); + + var texture = gl.createTexture(); + // Bind the texture to texture unit 0 + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + + gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl[texFormat], 0, 0, 2, 2, 0); + if (!shouldPass) { + wtu.glErrorShouldBe( + gl, gl.INVALID_OPERATION, + "should not be able to copyTexImage2D " + texFormat + " from " + backFormat); + return; + } + + wtu.glErrorShouldBe( + gl, gl.NO_ERROR, + "should be able to copyTexImage2D " + texFormat + " from " + backFormat); + + // Draw + wtu.clearAndDrawUnitQuad(gl); + + var expectedColors = { + 'ALPHA': [0, 0, 0, 127], + 'LUMINANCE': [64, 64, 64, 255], + 'LUMINANCE_ALPHA': [64, 64, 64, 127], + 'RGB': [64, 255, 191, 255], + 'RGBA': [64, 255, 191, 127] + }; + + var color = expectedColors[texFormat]; + + wtu.checkCanvas(gl, color, "should be " + color, 16); + + wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); +} +var successfullyParsed = true; +</script> +<script src="../../../js/js-test-post.js"></script> +</body> +</html> |