<!DOCTYPE html>
<meta charset=utf-8>
<title>Basic GPUTexture Tests.</title>
<body>
<canvas width="400" height="400"></canvas>
<script src="js/webgpu-functions.js"></script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
const canvas = document.querySelector("canvas");    
let context;

let texSize = {
    width: canvas.width,
    height: canvas.height,
    depth: 1
};

let texDescriptor = {
    size: texSize,
    format: "depth32float-stencil8",
    usage: GPUTextureUsage.OUTPUT_ATTACHMENT
};

promise_test(() => {
    return getBasicDevice().then(function(device) {
        swapChain = createBasicSwapChain(canvas, device);

        const texture = swapChain.getCurrentTexture();
        assert_true(texture instanceof GPUTexture, "Successfully acquired next texture.");

        const textureView = texture.createDefaultView();
        assert_true(textureView instanceof GPUTextureView, "Successfully created texture view from next texture.");
    }, function() {
    });
}, "Create texture view from swap chain.");

promise_test(() => {
    return getBasicDevice().then(function(device) {
        const depthTexture = device.createTexture(texDescriptor);
        assert_true(depthTexture instanceof GPUTexture, "Successfully created depth texture.");
    }, function() {
    });
}, "Create basic depth texture from device.");

promise_test(() => {
    return getBasicDevice().then(function(device) {
        texDescriptor.sampleCount = 4;
        texDescriptor.format = "rgba8unorm";
        texDescriptor.usage = GPUTextureUsage.SAMPLED | GPUTextureUsage.TRANSFER_SRC

        const multisampledTexture = device.createTexture(texDescriptor);
        assert_true(multisampledTexture instanceof GPUTexture, "Successfully created multisampled texture.");
    }, function() {
    });
}, "Create basic 4x multisampled texture.");

promise_test(() => {
    return getBasicDevice().then(function(device) {
        texDescriptor.size.depth = 3;
        texDescriptor.sampleCount = 1;
        texDescriptor.dimension = "3d";

        const texture3d = device.createTexture(texDescriptor);
        assert_true(texture3d instanceof GPUTexture, "Successfully created basic 3D texture.");
    }, function() {
    });
}, "Create basic 3D texture from device.");

// FIXME: Add tests for 1D textures, textureArrays, and GPUTextureViews.
</script>
</body>
</html>
