blob: 632b9a182b6560163f3ed047fc42609e507ce320 [file] [log] [blame]
<!--
/*
** Copyright (c) 2016 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL CopyTexImage Tests</title>
<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>
<canvas id="example" width="64" height="64"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
var wtu = WebGLTestUtils;
description("This test verifies the functionality of copyTexImage2D.");
debug("");
var gl = wtu.create3DContext("example", undefined, 2);
function enumToString(value) {
return wtu.glEnumToString(gl, value);
}
function checkFramebuffer(expected) {
var actual = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
if (expected.indexOf(actual) < 0) {
var msg = "checkFramebufferStatus expects [";
for (var index = 0; index < expected.length; ++index) {
msg += wtu.glEnumToString(gl, expected[index]);
if (index + 1 < expected.length)
msg += ", ";
}
msg += "], was " + wtu.glEnumToString(gl, actual);
testFailed(msg);
} else {
var msg = "checkFramebufferStatus got " + wtu.glEnumToString(gl, actual) +
" as expected";
testPassed(msg);
}
}
var testInternalformat = function () {
var goodByteFormats = [
"RGB",
"RGBA",
"LUMINANCE_ALPHA",
"LUMINANCE",
"ALPHA",
"R8",
"RG8",
"RGB8",
"RGBA8",
];
var goodByteFormatsWithUnmatchedComponentSizes = [
"RGB565",
"RGBA4",
"RGB5_A1",
"RGB10_A2",
];
var goodSRGBFormats = [
"SRGB8",
"SRGB8_ALPHA8",
];
var goodIntFormats = [
"R32I",
"RG32I",
"RGBA32I",
];
var goodIntFormatsWithUnmatchedComponentSizes = [
"R8I",
"R16I",
"RG8I",
"RG16I",
"RGBA8I",
"RGBA16I",
];
var goodUnsignedIntFormats = [
"R32UI",
"RG32UI",
"RGBA32UI",
];
var goodUnsignedIntFormatsWithUnmatchedComponentSizes = [
"R8UI",
"R16UI",
"RG8UI",
"RG16UI",
"RGB10_A2UI",
"RGBA8UI",
"RGBA16UI",
];
var badByteFormats = [
"R8_SNORM",
"RG8_SNORM",
"RGB8_SNORM",
"RGBA8_SNORM",
];
var badIntFormats = [
"RGB8I",
"RGB16I",
"RGB32I",
];
var badUnsingedIntFormats = [
"RGB8UI",
"RGB16UI",
"RGB32UI",
];
var badDepthStencilFormats = [
"DEPTH_COMPONENT16",
"DEPTH_COMPONENT24",
"DEPTH_COMPONENT32F",
"DEPTH24_STENCIL8",
];
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
function testFormat(internalformat, srcTexFormatsTypes, fboAttachmentType, expected, msg) {
var fbo = gl.createFramebuffer();
var srcTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, srcTexture);
gl.texImage2D(gl.TEXTURE_2D, 0, srcTexFormatsTypes.internalformat, 64, 64, 0, srcTexFormatsTypes.format, srcTexFormatsTypes.type, null);
gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
gl.framebufferTexture2D(gl.FRAMEBUFFER, fboAttachmentType, gl.TEXTURE_2D, srcTexture, 0);
checkFramebuffer([gl.FRAMEBUFFER_COMPLETE]);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl[internalformat], 0, 0, 64, 64, 0);
wtu.glErrorShouldBe(gl, expected, msg + enumToString(gl[internalformat]));
gl.deleteTexture(srcTexture);
gl.deleteFramebuffer(fbo);
}
goodByteFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA, format: gl.RGBA, type: gl.UNSIGNED_BYTE };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.NO_ERROR, "copyTexImage2D should succeed for good internalformat ");
srcTexFormatsTypes = { internalformat: gl.RGBA8, format: gl.RGBA, type: gl.UNSIGNED_BYTE };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.NO_ERROR, "copyTexImage2D should succeed for good internalformat ");
});
goodByteFormatsWithUnmatchedComponentSizes.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA8, format: gl.RGBA, type: gl.UNSIGNED_BYTE };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.INVALID_OPERATION,
"copyTexImage2D should fail for good internalformat with unmatched component sizes ");
});
goodSRGBFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.SRGB8_ALPHA8, format: gl.RGBA, type: gl.UNSIGNED_BYTE };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.NO_ERROR, "copyTexImage2D should succeed for good internalformat ");
});
goodIntFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA32I, format: gl.RGBA_INTEGER, type: gl.INT };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.NO_ERROR, "copyTexImage2D should succeed for good internalformat ");
});
goodIntFormatsWithUnmatchedComponentSizes.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA32I, format: gl.RGBA_INTEGER, type: gl.INT };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.INVALID_OPERATION,
"copyTexImage2D should fail for good internalformat with unmatched component sizes ");
});
goodUnsignedIntFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA32UI, format: gl.RGBA_INTEGER, type: gl.UNSIGNED_INT };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.NO_ERROR, "copyTexImage2D should succeed for good internalformat ");
});
goodUnsignedIntFormatsWithUnmatchedComponentSizes.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA32UI, format: gl.RGBA_INTEGER, type: gl.UNSIGNED_INT };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.INVALID_OPERATION,
"copyTexImage2D should fail for good internalformat with unmatched component sizes ");
});
badByteFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA8, format: gl.RGBA, type: gl.UNSIGNED_BYTE };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.INVALID_ENUM, "copyTexImage2D should fail for bad internalformat ");
});
badIntFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA32I, format: gl.RGBA_INTEGER, type: gl.INT };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.INVALID_ENUM, "copyTexImage2D should fail for bad internalformat ");
});
badUnsingedIntFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.RGBA32UI, format: gl.RGBA_INTEGER, type: gl.UNSIGNED_INT };
testFormat(internalformat, srcTexFormatsTypes, gl.COLOR_ATTACHMENT0, gl.INVALID_ENUM, "copyTexImage2D should fail for bad internalformat ");
});
badDepthStencilFormats.forEach(function(internalformat) {
var srcTexFormatsTypes = { internalformat: gl.DEPTH24_STENCIL8, format: gl.DEPTH_STENCIL, type: gl.UNSIGNED_INT_24_8};
testFormat(internalformat, srcTexFormatsTypes, gl.DEPTH_STENCIL_ATTACHMENT, gl.INVALID_ENUM, "copyTexImage2D should fail for bad internalformat ");
});
gl.deleteTexture(texture);
}
if (!gl) {
testFailed("WebGL context does not exist");
} else {
testPassed("WebGL context exists");
testInternalformat();
}
var successfullyParsed = true;
</script>
<script src="../../../js/js-test-post.js"></script>
</body>
</html>