[require]
shader model >= 4.0

[srv 0]
size (2d, 2, 3)

1.0 0.0 1.0 0.0     1.0 0.0 1.0 0.0     1.0 0.0 1.0 0.0
1.0 0.0 1.0 0.0     1.0 0.0 1.0 0.0     1.0 0.0 1.0 0.0

[pixel shader]
Texture2D t : register(t0);

float4 main() : sv_target
{
    uint u1, u2;
    float f1, f2;
    float4 ret;

    t.GetDimensions(u1, u2);
    t.GetDimensions(f1, f2);
    ret.x = u1;
    ret.y = f2;
    t.GetDimensions(u1, f2);
    ret.z = u1;
    t.GetDimensions(f1, u2);
    ret.w = u2;
    return ret;
}

[test]
todo(glsl | msl) draw quad
probe (0, 0) rgba (2.0, 3.0, 2.0, 3.0)

[srv 1]
size (2d, 2, 2)
levels 2

1.0 0.0 1.0 0.0     1.0 0.0 1.0 0.0
1.0 0.0 1.0 0.0     1.0 0.0 1.0 0.0

0.0 0.0 1.0 0.0

[pixel shader]
Texture2D t : register(t1);

float4 main() : sv_target
{
    float4 ret;

    t.GetDimensions(ret.x, ret.y);
    t.GetDimensions(1, ret.z, ret.z, ret.w);
    return ret;
}

[test]
todo(glsl | msl) draw quad
probe (0, 0) rgba (2.0, 2.0, 1.0, 2.0)

[require]
shader model >= 6.2
native-16-bit

[uav 0]
format r32-uint
size (buffer, 4)
0 0 0 0

[compute shader]
RWBuffer<uint16_t> u : register(u0);

    [numthreads(1, 1, 1)]
void main()
{
    uint width;
    u.GetDimensions(width);
    u[0] = (uint16_t)width;
}

[test]
dispatch 1 1 1
probe uav 0 (0) u32(4)

[uav 0]
stride 6
size (buffer, 2)

0 0 0

[compute shader]
struct foo
{
    uint16_t count;
    half h;
    uint16_t stride;
};

RWStructuredBuffer<foo> u : register(u0);

    [numthreads(1, 1, 1)]
void main()
{
    uint count, stride;
    u.GetDimensions(count, stride);
    struct foo f0 = {(uint16_t)count, 0.5, (uint16_t)stride};
    u[0] = f0;
}

[test]
dispatch 1 1 1
probe uav 0 (0) u32(0x38000002)
probe uav 0 (1) u32(6)

[uav 0]
stride 8
size (buffer, 2)

0 0 0 0

[compute shader]
struct foo
{
    uint16_t count;
    half h;
    uint32_t stride;
};

RWStructuredBuffer<foo> u : register(u0);

    [numthreads(1, 1, 1)]
void main()
{
    uint count, stride;
    u.GetDimensions(count, stride);
    struct foo f0 = {(uint16_t)count, 0.5, stride};
    u[0] = f0;
}

[test]
dispatch 1 1 1
probe uav 0 (0) u32(0x38000002)
probe uav 0 (1) u32(8)

[uav 0]
stride 8
size (buffer, 2)

0 0 0 0

[compute shader]
struct foo
{
    uint16_t count;
    uint32_t stride;
};

RWStructuredBuffer<foo> u : register(u0);

    [numthreads(1, 1, 1)]
void main()
{
    uint count, stride;
    u.GetDimensions(count, stride);
    struct foo f0 = {(uint16_t)count, stride};
    u[0] = f0;
}

[test]
dispatch 1 1 1
probe uav 0 (0) u32(2)
probe uav 0 (1) u32(8)
