summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copytexsubimage2d-subrects.html
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copytexsubimage2d-subrects.html170
1 files changed, 170 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copytexsubimage2d-subrects.html b/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copytexsubimage2d-subrects.html
new file mode 100644
index 0000000000..d4a1791790
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/textures/misc/copytexsubimage2d-subrects.html
@@ -0,0 +1,170 @@
+<!--
+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>
+<meta charset="utf-8">
+<title>CopyTexSubImage2D partial destination texture test</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>
+<div id="description"></div>
+<canvas id="canvas"></canvas>
+<div id="console"></div>
+
+<script>
+"use strict";
+description("Verifies that copyTexSubImage2D redefining part of the destination texture works as expected.");
+
+////
+
+var kWidth = 16;
+var kHeight = 16;
+
+////
+
+var wtu = WebGLTestUtils;
+var canvas = document.getElementById("canvas");
+
+canvas.width = kWidth;
+canvas.height = kHeight;
+var gl = wtu.create3DContext(canvas);
+
+////
+
+function clearTo(color) {
+ gl.clearColor(color[0], color[1], color[2], color[3]);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+}
+
+function readInto(view) {
+ gl.readPixels(0, 0, kWidth, kHeight, gl.RGBA, gl.UNSIGNED_BYTE,
+ new Uint8Array(view.buffer));
+}
+
+////
+
+function runTest() {
+ gl.enable(gl.SCISSOR_TEST);
+
+ gl.scissor(0, 0, kWidth/2, kHeight/2);
+ clearTo([1,0,0,1]);
+ gl.scissor(kWidth/2, 0, kWidth/2, kHeight/2);
+ clearTo([0,1,0,1]);
+ gl.scissor(0, kHeight/2, kWidth/2, kHeight/2);
+ clearTo([0,0,1,1]);
+ gl.scissor(kWidth/2, kHeight/2, kWidth/2, kHeight/2);
+ clearTo([0,1,1,1]);
+
+ var srcData = new Uint32Array(kWidth * kHeight);
+ readInto(srcData);
+ console.log('0x' + srcData[0].toString(16));
+
+ ////
+
+ var dstTex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, dstTex);
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, kWidth, kHeight,
+ 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // Uploads zeros.
+ var dstRefData = new Uint32Array(kWidth * kHeight); // Also cleared to zeros!
+ var dstTestData = new Uint32Array(kWidth * kHeight);
+
+ var dstFB = gl.createFramebuffer();
+ gl.bindFramebuffer(gl.FRAMEBUFFER, dstFB);
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
+ gl.TEXTURE_2D, dstTex, 0);
+
+ ////
+
+ function pixelPos(x, y) {
+ return y * kWidth + x;
+ }
+
+ function testCmd(tuple) {
+ var dstX0, dstY0, srcX0, srcY0, width, height;
+ [dstX0, dstY0, srcX0, srcY0, width, height] = tuple
+ debug("copyTexSubImage2D(" +
+ [dstX0+','+dstY0, srcX0+','+srcY0, width+','+height].join(', ') +
+ ")");
+
+ // Test
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.copyTexSubImage2D(gl.TEXTURE_2D, 0,
+ dstX0, dstY0, srcX0, srcY0, width, height);
+
+ // Emulate for reference
+ for (var x = 0; x < width; x++) {
+ var srcX = srcX0 + x;
+ var dstX = dstX0 + x;
+ if (srcX < 0 || srcX >= kWidth ||
+ dstX < 0 || dstX >= kWidth)
+ {
+ continue;
+ }
+
+ for (var y = 0; y < height; y++) {
+ var srcY = srcY0 + y;
+ var dstY = dstY0 + y;
+ if (srcY < 0 || srcY >= kHeight ||
+ dstY < 0 || dstY >= kHeight)
+ {
+ continue;
+ }
+
+
+ var srcPos = pixelPos(srcX, srcY);
+ var dstPos = pixelPos(dstX, dstY);
+ dstRefData[dstPos] = srcData[srcPos];
+ }
+ }
+
+ // Compare
+ gl.bindFramebuffer(gl.FRAMEBUFFER, dstFB);
+ readInto(dstTestData);
+
+ for (var x = 0; x < kWidth; x++) {
+ for (var y = 0; y < kHeight; y++) {
+ var pos = pixelPos(x, y);
+ var refPixel = dstRefData[pos];
+ var testPixel = dstTestData[pos];
+
+ //console.log([x, y].join(",") + ":",
+ // testPixel.toString(16), refPixel.toString(16))
+ if (testPixel == refPixel)
+ continue;
+
+ testFailed("Mismatch at (" + [x, y].join(", ") + "): " +
+ " Should be 0x" + refPixel.toString(16) +
+ ", was 0x" + testPixel.toString(16));
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ var tests = [
+ [0,0, 0,0, 2,3],
+ [0,0, 5,8, 2,3],
+ [1,0, 0,0, 2,3],
+ [1,7, 0,0, 2,3],
+ ];
+
+ tests.every(x => testCmd(x));
+}
+
+runTest();
+
+debug("");
+var successfullyParsed = true;
+</script>
+<script src="../../../js/js-test-post.js"></script>
+
+</body>
+</html>