yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
5c672cef1
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: Texture1D(size=4, content = zero):name t1D_f32v3 12//TEST_INPUT: Texture2D(size=4, content = zero):name t2D_f32v3 13//TEST_INPUT: Texture3D(size=4, content = zero):name t3D_f32v3 14//TEST_INPUT: Texture2D(size=4, content = zero):name t2DMS_f32v3 15//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name t2DArray_f32v3 16Texture1D<float3> t1D_f32v3; 17Texture2D<float3> t2D_f32v3; 18Texture3D<float3> t3D_f32v3; 19Texture2DMS<float3> t2DMS_f32v3; 20Texture2DArray<float3> t2DArray_f32v3; 21 22//TEST_INPUT: Texture1D(size=4, content = zero):name t1D_f32v4 23//TEST_INPUT: Texture2D(size=4, content = zero):name t2D_f32v4 24//TEST_INPUT: Texture3D(size=4, content = zero):name t3D_f32v4 25//TEST_INPUT: Texture2D(size=4, content = zero):name t2DMS_f32v4 26//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name t2DArray_f32v4 27Texture1D<float4> t1D_f32v4; 28Texture2D<float4> t2D_f32v4; 29Texture3D<float4> t3D_f32v4; 30Texture2DMS<float4> t2DMS_f32v4; 31Texture2DArray<float4> t2DArray_f32v4; 32 33// i32 types 34 35//TEST_INPUT: Texture1D(size=4, content = zero):name t1D_i32v3 36//TEST_INPUT: Texture2D(size=4, content = zero):name t2D_i32v3 37//TEST_INPUT: Texture3D(size=4, content = zero):name t3D_i32v3 38//TEST_INPUT: Texture2D(size=4, content = zero):name t2DMS_i32v3 39//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name t2DArray_i32v3 40Texture1D<int3> t1D_i32v3; 41Texture2D<int3> t2D_i32v3; 42Texture3D<int3> t3D_i32v3; 43Texture2DMS<int3> t2DMS_i32v3; 44Texture2DArray<int3> t2DArray_i32v3; 45 46//TEST_INPUT: Texture1D(size=4, content = zero):name t1D_i32v4 47//TEST_INPUT: Texture2D(size=4, content = zero):name t2D_i32v4 48//TEST_INPUT: Texture3D(size=4, content = zero):name t3D_i32v4 49//TEST_INPUT: Texture2D(size=4, content = zero):name t2DMS_i32v4 50//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name t2DArray_i32v4 51Texture1D<int4> t1D_i32v4; 52Texture2D<int4> t2D_i32v4; 53Texture3D<int4> t3D_i32v4; 54Texture2DMS<int4> t2DMS_i32v4; 55Texture2DArray<int4> t2DArray_i32v4; 56 57// u32 types 58 59//TEST_INPUT: Texture1D(size=4, content = zero):name t1D_u32v3 60//TEST_INPUT: Texture2D(size=4, content = zero):name t2D_u32v3 61//TEST_INPUT: Texture3D(size=4, content = zero):name t3D_u32v3 62//TEST_INPUT: Texture2D(size=4, content = zero):name t2DMS_u32v3 63//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name t2DArray_u32v3 64Texture1D<uint3> t1D_u32v3; 65Texture2D<uint3> t2D_u32v3; 66Texture3D<uint3> t3D_u32v3; 67Texture2DMS<uint3> t2DMS_u32v3; 68Texture2DArray<uint3> t2DArray_u32v3; 69 70//TEST_INPUT: Texture1D(size=4, content = zero):name t1D_u32v4 71//TEST_INPUT: Texture2D(size=4, content = zero):name t2D_u32v4 72//TEST_INPUT: Texture3D(size=4, content = zero):name t3D_u32v4 73//TEST_INPUT: Texture2D(size=4, content = zero):name t2DMS_u32v4 74//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name t2DArray_u32v4 75Texture1D<uint4> t1D_u32v4; 76Texture2D<uint4> t2D_u32v4; 77Texture3D<uint4> t3D_u32v4; 78Texture2DMS<uint4> t2DMS_u32v4; 79Texture2DArray<uint4> t2DArray_u32v4; 80 81// depth 82 83//TEST_INPUT: Texture2D(size=4, content = zero):name d2D 84DepthTexture2D d2D; 85//TEST_INPUT: Texture2D(size=4, content = zero):name d2DMS 86DepthTexture2DMS d2DMS; 87//TEST_INPUT: Texture2D(size=4, content = zero, arrayLength=2):name d2DArray 88DepthTexture2DArray d2DArray; 89 90 91bool TEST_textureLoad<T>( 92 Texture1D<T> t1D, 93 Texture2D<T> t2D, 94 Texture3D<T> t3D, 95 Texture2DMS<T> t2DMS, 96 Texture2DArray<T> t2DArray) 97 where T : ITexelElement, IArithmetic 98{ 99 // WGSL-LABEL: TEST_textureLoad 100 typealias Tvn = T; 101 102 return true 103 // =================== 104 // T Load() 105 // https://www.w3.org/TR/WGSL/#textureload 106 // =================== 107 108 // WGSL: textureLoad({{\(*}}t1D 109 && all(Tvn(T.Element(0)) == t1D.Load(int2(0, 0))) 110 111 // WGSL: textureLoad({{\(*}}t2D 112 && all(Tvn(T.Element(0)) == t2D.Load(int3(0, 0, 0))) 113 114 // WGSL: textureLoad({{\(*}}t3D 115 && all(Tvn(T.Element(0)) == t3D.Load(int4(0, 0, 0, 0))) 116 117 // WGSL: textureLoad({{\(*}}t2DMS 118 && all(Tvn(T.Element(0)) == t2DMS.Load(int3(0, 0, 0))) 119 120 // WGSL: textureLoad({{\(*}}t2DArray 121 && all(Tvn(T.Element(0)) == t2DArray.Load(int4(0, 0, 0, 0))) 122 ; 123} 124 125bool TEST_textureLoad_depth() 126{ 127 // WGSL-LABEL: TEST_textureLoad_depth 128 129 return true 130 // =================== 131 // T Load() 132 // https://www.w3.org/TR/WGSL/#textureload 133 // =================== 134 135 // WGSL: textureLoad({{\(*}}d2D 136 && all(0.f == d2D.Load(int3(0, 0, 0))) 137 138 // WGSL: textureLoad({{\(*}}d2DMS 139 && all(0.f == d2DMS.Load(int2(0, 0), 0)) 140 141 // WGSL: textureLoad({{\(*}}d2DArray 142 && all(0.f == d2DArray.Load(int4(0, 0, 0, 0))) 143 ; 144} 145 146void fragMain() 147{ 148 bool result = true 149 && TEST_textureLoad<float3>(t1D_f32v3, t2D_f32v3, t3D_f32v3, t2DMS_f32v3, t2DArray_f32v3) 150 && TEST_textureLoad<float4>(t1D_f32v4, t2D_f32v4, t3D_f32v4, t2DMS_f32v4, t2DArray_f32v4) 151 && TEST_textureLoad<int32_t3>(t1D_i32v3, t2D_i32v3, t3D_i32v3, t2DMS_i32v3, t2DArray_i32v3) 152 && TEST_textureLoad<int32_t4>(t1D_i32v4, t2D_i32v4, t3D_i32v4, t2DMS_i32v4, t2DArray_i32v4) 153 && TEST_textureLoad<uint32_t3>(t1D_u32v3, t2D_u32v3, t3D_u32v3, t2DMS_u32v3, t2DArray_u32v3) 154 && TEST_textureLoad<uint32_t4>(t1D_u32v4, t2D_u32v4, t3D_u32v4, t2DMS_u32v4, t2DArray_u32v4) 155 && TEST_textureLoad_depth() 156 ; 157 158 outputBuffer[0] = int(result); 159}