blob: 2f8141dc69973b96810052b22fe17cded585ddb0 [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<title>Basic Blitting</title>
<meta name="assert" content="Blit operations copy a green canvas.">
<link rel="match" href="blit-commands-expected.html">
<p>Pass if square canvas below is completely green.</p>
<canvas width="400" height="400"></canvas>
<body>
<script src="js/webgpu-functions.js"></script>
<script>
if (window.testRunner)
testRunner.waitUntilDone();
const canvas2d = document.querySelector("canvas");
async function loadImage() {
const image = new Image();
image.src = "resources/green-400.png";
image.onload = function() {
getBasicDevice().then(function(device) {
test(device, image).then(function() {
if (window.testRunner)
testRunner.notifyDone();
}, function(e) {
if (window.testRunner)
testRunner.notifyDone();
});
}, function() {
drawGreenSquareInSoftware(canvas2d);
if (window.testRunner)
testRunner.notifyDone();
});
}
}
async function test(device, image) {
canvas2d.width = image.width;
canvas2d.height = image.height;
const context2d = canvas2d.getContext('2d');
context2d.drawImage(image, 0, 0);
const imageData = context2d.getImageData(0, 0, image.width, image.height);
const bufferDescriptor = {
size: imageData.data.byteLength,
usage: GPUBufferUsage.TRANSFER_SRC
};
bufferA = createBufferWithData(device, bufferDescriptor, imageData.data.buffer);
bufferDescriptor.usage |= GPUBufferUsage.TRANSFER_DST;
const bufferB = device.createBuffer(bufferDescriptor);
const bufferViewB = {
buffer: bufferB,
rowPitch: image.width * 4,
imageHeight: 0
};
const textureSize = {
width: image.width,
height: image.height,
depth: 1
};
const textureDescriptor = {
size: textureSize,
format: "rgba8unorm",
usage: GPUTextureUsage.TRANSFER_SRC | GPUTextureUsage.TRANSFER_DST
};
const textureA = device.createTexture(textureDescriptor);
const textureViewA = { texture: textureA };
const textureB = device.createTexture(textureDescriptor);
const textureViewB = { texture: textureB };
const readBufferDescriptor = {
size: imageData.data.byteLength,
usage: GPUBufferUsage.TRANSFER_DST | GPUBufferUsage.MAP_READ
};
const readBuffer = device.createBuffer(readBufferDescriptor);
const readBufferView = {
buffer: readBuffer,
rowPitch: image.width * 4,
imageHeight: 0
};
const commandEncoder = device.createCommandEncoder();
commandEncoder.copyBufferToBuffer(bufferA, 0, bufferB, 0, imageData.data.byteLength);
commandEncoder.copyBufferToTexture(bufferViewB, textureViewA, textureSize);
commandEncoder.copyBufferToTexture(bufferViewB, textureViewA, textureSize);
commandEncoder.copyTextureToTexture(textureViewA, textureViewB, textureSize);
commandEncoder.copyTextureToBuffer(textureViewB, readBufferView, textureSize);
device.getQueue().submit([commandEncoder.finish()]);
bufferA.destroy();
bufferB.destroy();
textureA.destroy();
textureB.destroy();
const resultContext = document.querySelector('canvas').getContext('2d');
await readBuffer.mapReadAsync().then(ab => {
const array = new Uint8ClampedArray(ab);
const resultImageData = new ImageData(array, image.width, image.height);
resultContext.putImageData(resultImageData, 0, 0);
readBuffer.destroy();
});
}
loadImage();
</script>
</body>