yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
ae1a5e408
master
1//TEST:SIMPLE(filecheck=WGSL): -stage fragment -entry fragMain -target wgsl 2 3// In WGSL, `textureSample` and other variants work only for f32 type. 4// But textureLoad works for i32, u32 and f32. 5 6//TEST_INPUT: ubuffer(data=[0], stride=4):out,name outputBuffer 7RWStructuredBuffer<int> outputBuffer; 8 9// f32 types 10 11//TEST_INPUT: RWTexture1D(format=RG32Float, size=4, content = zero):name w1D_f32v2 12//TEST_INPUT: RWTexture2D(format=RG32Float, size=4, content = zero):name w2D_f32v2 13//TEST_INPUT: RWTexture3D(format=RG32Float, size=4, content = zero):name w3D_f32v2 14//TEST_INPUT: RWTexture2D(format=RG32Float, size=4, content = zero, arrayLength=2):name w2DArray_f32v2 15// WGSL: var w1D_f32v2{{[^:]*}}: texture_storage_1d<rg32float, read_write> 16[format("rg32f")] RWTexture1D<float2> w1D_f32v2; 17[format("rg32f")] RWTexture2D<float2> w2D_f32v2; 18[format("rg32f")] RWTexture3D<float2> w3D_f32v2; 19[format("rg32f")] RWTexture2DArray<float2> w2DArray_f32v2; 20 21//TEST_INPUT: RWTexture1D(format=RGBA8Unorm, size=4, content = zero):name w1D_f32v4 22//TEST_INPUT: RWTexture2D(format=RGBA8Unorm, size=4, content = zero):name w2D_f32v4 23//TEST_INPUT: RWTexture3D(format=RGBA8Unorm, size=4, content = zero):name w3D_f32v4 24//TEST_INPUT: RWTexture2D(format=RGBA8Unorm, size=4, content = zero, arrayLength=2):name w2DArray_f32v4 25// WGSL: var w1D_f32v4{{[^:]*}}: texture_storage_1d<rgba8unorm, read_write> 26[format("rgba8")] RWTexture1D<float4> w1D_f32v4; 27[format("rgba8")] RWTexture2D<float4> w2D_f32v4; 28[format("rgba8")] RWTexture3D<float4> w3D_f32v4; 29[format("rgba8")] RWTexture2DArray<float4> w2DArray_f32v4; 30 31//TEST_INPUT: RWTexture1D(format=BGRA8Unorm, size=4, content = zero):name w1D_f32_bgra_v4 32//TEST_INPUT: RWTexture2D(format=BGRA8Unorm, size=4, content = zero):name w2D_f32_bgra_v4 33//TEST_INPUT: RWTexture3D(format=BGRA8Unorm, size=4, content = zero):name w3D_f32_bgra_v4 34//TEST_INPUT: RWTexture2D(format=BGRA8Unorm, size=4, content = zero, arrayLength=2):name w2DArray_f32_bgra_v4 35// WGSL: var w1D_f32_bgra_v4{{[^:]*}}: texture_storage_1d<bgra8unorm, read_write> 36[format("bgra8")] RWTexture1D<float4> w1D_f32_bgra_v4; 37[format("bgra8")] RWTexture2D<float4> w2D_f32_bgra_v4; 38[format("bgra8")] RWTexture3D<float4> w3D_f32_bgra_v4; 39[format("bgra8")] RWTexture2DArray<float4> w2DArray_f32_bgra_v4; 40 41// i32 types 42 43//TEST_INPUT: RWTexture1D(format=RG32Sint, size=4, content = zero):name w1D_i32v2 44//TEST_INPUT: RWTexture2D(format=RG32Sint, size=4, content = zero):name w2D_i32v2 45//TEST_INPUT: RWTexture3D(format=RG32Sint, size=4, content = zero):name w3D_i32v2 46//TEST_INPUT: RWTexture2D(format=RG32Sint, size=4, content = zero, arrayLength=2):name w2DArray_i32v2 47// WGSL: var w1D_i32v2{{[^:]*}}: texture_storage_1d<rg32sint, read_write> 48[format("rg32i")] RWTexture1D<int2> w1D_i32v2; 49[format("rg32i")] RWTexture2D<int2> w2D_i32v2; 50[format("rg32i")] RWTexture3D<int2> w3D_i32v2; 51[format("rg32i")] RWTexture2DArray<int2> w2DArray_i32v2; 52 53//TEST_INPUT: RWTexture1D(format=RGBA32Sint, size=4, content = zero):name w1D_i32v4 54//TEST_INPUT: RWTexture2D(format=RGBA32Sint, size=4, content = zero):name w2D_i32v4 55//TEST_INPUT: RWTexture3D(format=RGBA32Sint, size=4, content = zero):name w3D_i32v4 56//TEST_INPUT: RWTexture2D(format=RGBA32Sint, size=4, content = zero, arrayLength=2):name w2DArray_i32v4 57// WGSL: var w1D_i32v4{{[^:]*}}: texture_storage_1d<rgba32sint, read_write> 58[format("rgba32i")] RWTexture1D<int4> w1D_i32v4; 59[format("rgba32i")] RWTexture2D<int4> w2D_i32v4; 60[format("rgba32i")] RWTexture3D<int4> w3D_i32v4; 61[format("rgba32i")] RWTexture2DArray<int4> w2DArray_i32v4; 62 63// u32 types 64 65//TEST_INPUT: RWTexture1D(format=RG32Uint, size=4, content = zero):name w1D_u32v2 66//TEST_INPUT: RWTexture2D(format=RG32Uint, size=4, content = zero):name w2D_u32v2 67//TEST_INPUT: RWTexture3D(format=RG32Uint, size=4, content = zero):name w3D_u32v2 68//TEST_INPUT: RWTexture2D(format=RG32Uint, size=4, content = zero, arrayLength=2):name w2DArray_u32v2 69// WGSL: var w1D_u32v2{{[^:]*}}: texture_storage_1d<rg32uint, read_write> 70[format("rg32ui")] RWTexture1D<uint2> w1D_u32v2; 71[format("rg32ui")] RWTexture2D<uint2> w2D_u32v2; 72[format("rg32ui")] RWTexture3D<uint2> w3D_u32v2; 73[format("rg32ui")] RWTexture2DArray<uint2> w2DArray_u32v2; 74 75//TEST_INPUT: RWTexture1D(format=RGBA16Uint, size=4, content = zero):name w1D_u32v4 76//TEST_INPUT: RWTexture2D(format=RGBA16Uint, size=4, content = zero):name w2D_u32v4 77//TEST_INPUT: RWTexture3D(format=RGBA16Uint, size=4, content = zero):name w3D_u32v4 78//TEST_INPUT: RWTexture2D(format=RGBA16Uint, size=4, content = zero, arrayLength=2):name w2DArray_u32v4 79// WGSL: var w1D_u32v4{{[^:]*}}: texture_storage_1d<rgba16uint, read_write> 80[format("rgba16ui")] RWTexture1D<uint4> w1D_u32v4; 81[format("rgba16ui")] RWTexture2D<uint4> w2D_u32v4; 82[format("rgba16ui")] RWTexture3D<uint4> w3D_u32v4; 83[format("rgba16ui")] RWTexture2DArray<uint4> w2DArray_u32v4; 84 85 86__generic<T, let sampleIndex:int, let format:int> 87[ForceInline] // Workaround for a WGSL requirement that `texture_storage_Xd` must always be a global variable 88bool TEST_textureStorage_StoreLoad( 89 RWTexture1D<T, sampleIndex, format> w1D, 90 RWTexture2D<T, sampleIndex, format> w2D, 91 RWTexture3D<T, sampleIndex, format> w3D, 92 RWTexture2DArray<T, sampleIndex, format> w2DArray) 93 where T:ITexelElement, IArithmetic 94{ 95 typealias Tvn = T; 96 97 // =================== 98 // o[i] = v; 99 // https://www.w3.org/TR/WGSL/#texturestore 100 // =================== 101 102 // TODO: store before load 103 // WGSL: textureStore({{\(*}}w1D 104 w1D[0] = Tvn(T.Element(1)); 105 106 // WGSL: textureStore({{\(*}}w2D 107 w2D[0] = Tvn(T.Element(1)); 108 109 // WGSL: textureStore({{\(*}}w3D 110 w3D[0] = Tvn(T.Element(1)); 111 112 // WGSL: textureStore({{\(*}}w2DArray 113 w2DArray[0] = Tvn(T.Element(1)); 114 115 return true 116 // =================== 117 // T Load() 118 // https://www.w3.org/TR/WGSL/#textureload 119 // =================== 120 121 // WGSL: textureLoad({{\(*}}w1D 122 && all(Tvn(T.Element(0)) == w1D.Load(0)) 123 124 // WGSL: textureLoad({{\(*}}w2D 125 && all(Tvn(T.Element(0)) == w2D.Load(int2(0, 0))) 126 127 // WGSL: textureLoad({{\(*}}w3D 128 && all(Tvn(T.Element(0)) == w3D.Load(int3(0, 0, 0))) 129 130 // WGSL: textureLoad({{\(*}}w2DArray 131 && all(Tvn(T.Element(0)) == w2DArray.Load(int3(0, 0, 0))) 132 ; 133} 134 135void fragMain() 136{ 137 bool result = true 138 && TEST_textureStorage_StoreLoad<float2>(w1D_f32v2, w2D_f32v2, w3D_f32v2, w2DArray_f32v2) 139 && TEST_textureStorage_StoreLoad<float4>(w1D_f32v4, w2D_f32v4, w3D_f32v4, w2DArray_f32v4) 140 && TEST_textureStorage_StoreLoad<float4>(w1D_f32_bgra_v4, w2D_f32_bgra_v4, w3D_f32_bgra_v4, w2DArray_f32_bgra_v4) 141 && TEST_textureStorage_StoreLoad<int32_t2>(w1D_i32v2, w2D_i32v2, w3D_i32v2, w2DArray_i32v2) 142 && TEST_textureStorage_StoreLoad<int32_t4>(w1D_i32v4, w2D_i32v4, w3D_i32v4, w2DArray_i32v4) 143 && TEST_textureStorage_StoreLoad<uint32_t2>(w1D_u32v2, w2D_u32v2, w3D_u32v2, w2DArray_u32v2) 144 && TEST_textureStorage_StoreLoad<uint32_t4>(w1D_u32v4, w2D_u32v4, w3D_u32v4, w2DArray_u32v4) 145 ; 146 147 outputBuffer[0] = int(result); 148}