<!DOCTYPE html><!-- webkit-test-runner [ experimental:WebGPUEnabled=true ] -->
<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 device, context;

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

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

promise_test(async () => {
    device = await getBasicDevice();
    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.");
}, "Create texture view from swap chain.");

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

promise_test(async () => {
    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.");
}, "Create basic 4x multisampled texture.");

promise_test(async () => {
    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.");
}, "Create basic 3D texture from device.");

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