//TEST:SIMPLE(filecheck=WGSL): -stage fragment -entry fragMain -target wgsl // In WGSL, `textureSample` and other variants work only for f32 type. // But textureLoad works for i32, u32 and f32. //TEST_INPUT: ubuffer(data=[0], stride=4):out,name outputBuffer RWStructuredBuffer outputBuffer; // f32 types //TEST_INPUT: RWTexture1D(format=RG32Float, size=4, content = zero):name w1D_f32v2 //TEST_INPUT: RWTexture2D(format=RG32Float, size=4, content = zero):name w2D_f32v2 //TEST_INPUT: RWTexture3D(format=RG32Float, size=4, content = zero):name w3D_f32v2 //TEST_INPUT: RWTexture2D(format=RG32Float, size=4, content = zero, arrayLength=2):name w2DArray_f32v2 // WGSL: var w1D_f32v2{{[^:]*}}: texture_storage_1d [format("rg32f")] RWTexture1D w1D_f32v2; [format("rg32f")] RWTexture2D w2D_f32v2; [format("rg32f")] RWTexture3D w3D_f32v2; [format("rg32f")] RWTexture2DArray w2DArray_f32v2; //TEST_INPUT: RWTexture1D(format=RGBA8Unorm, size=4, content = zero):name w1D_f32v4 //TEST_INPUT: RWTexture2D(format=RGBA8Unorm, size=4, content = zero):name w2D_f32v4 //TEST_INPUT: RWTexture3D(format=RGBA8Unorm, size=4, content = zero):name w3D_f32v4 //TEST_INPUT: RWTexture2D(format=RGBA8Unorm, size=4, content = zero, arrayLength=2):name w2DArray_f32v4 // WGSL: var w1D_f32v4{{[^:]*}}: texture_storage_1d [format("rgba8")] RWTexture1D w1D_f32v4; [format("rgba8")] RWTexture2D w2D_f32v4; [format("rgba8")] RWTexture3D w3D_f32v4; [format("rgba8")] RWTexture2DArray w2DArray_f32v4; //TEST_INPUT: RWTexture1D(format=BGRA8Unorm, size=4, content = zero):name w1D_f32_bgra_v4 //TEST_INPUT: RWTexture2D(format=BGRA8Unorm, size=4, content = zero):name w2D_f32_bgra_v4 //TEST_INPUT: RWTexture3D(format=BGRA8Unorm, size=4, content = zero):name w3D_f32_bgra_v4 //TEST_INPUT: RWTexture2D(format=BGRA8Unorm, size=4, content = zero, arrayLength=2):name w2DArray_f32_bgra_v4 // WGSL: var w1D_f32_bgra_v4{{[^:]*}}: texture_storage_1d [format("bgra8")] RWTexture1D w1D_f32_bgra_v4; [format("bgra8")] RWTexture2D w2D_f32_bgra_v4; [format("bgra8")] RWTexture3D w3D_f32_bgra_v4; [format("bgra8")] RWTexture2DArray w2DArray_f32_bgra_v4; // i32 types //TEST_INPUT: RWTexture1D(format=RG32Sint, size=4, content = zero):name w1D_i32v2 //TEST_INPUT: RWTexture2D(format=RG32Sint, size=4, content = zero):name w2D_i32v2 //TEST_INPUT: RWTexture3D(format=RG32Sint, size=4, content = zero):name w3D_i32v2 //TEST_INPUT: RWTexture2D(format=RG32Sint, size=4, content = zero, arrayLength=2):name w2DArray_i32v2 // WGSL: var w1D_i32v2{{[^:]*}}: texture_storage_1d [format("rg32i")] RWTexture1D w1D_i32v2; [format("rg32i")] RWTexture2D w2D_i32v2; [format("rg32i")] RWTexture3D w3D_i32v2; [format("rg32i")] RWTexture2DArray w2DArray_i32v2; //TEST_INPUT: RWTexture1D(format=RGBA32Sint, size=4, content = zero):name w1D_i32v4 //TEST_INPUT: RWTexture2D(format=RGBA32Sint, size=4, content = zero):name w2D_i32v4 //TEST_INPUT: RWTexture3D(format=RGBA32Sint, size=4, content = zero):name w3D_i32v4 //TEST_INPUT: RWTexture2D(format=RGBA32Sint, size=4, content = zero, arrayLength=2):name w2DArray_i32v4 // WGSL: var w1D_i32v4{{[^:]*}}: texture_storage_1d [format("rgba32i")] RWTexture1D w1D_i32v4; [format("rgba32i")] RWTexture2D w2D_i32v4; [format("rgba32i")] RWTexture3D w3D_i32v4; [format("rgba32i")] RWTexture2DArray w2DArray_i32v4; // u32 types //TEST_INPUT: RWTexture1D(format=RG32Uint, size=4, content = zero):name w1D_u32v2 //TEST_INPUT: RWTexture2D(format=RG32Uint, size=4, content = zero):name w2D_u32v2 //TEST_INPUT: RWTexture3D(format=RG32Uint, size=4, content = zero):name w3D_u32v2 //TEST_INPUT: RWTexture2D(format=RG32Uint, size=4, content = zero, arrayLength=2):name w2DArray_u32v2 // WGSL: var w1D_u32v2{{[^:]*}}: texture_storage_1d [format("rg32ui")] RWTexture1D w1D_u32v2; [format("rg32ui")] RWTexture2D w2D_u32v2; [format("rg32ui")] RWTexture3D w3D_u32v2; [format("rg32ui")] RWTexture2DArray w2DArray_u32v2; //TEST_INPUT: RWTexture1D(format=RGBA16Uint, size=4, content = zero):name w1D_u32v4 //TEST_INPUT: RWTexture2D(format=RGBA16Uint, size=4, content = zero):name w2D_u32v4 //TEST_INPUT: RWTexture3D(format=RGBA16Uint, size=4, content = zero):name w3D_u32v4 //TEST_INPUT: RWTexture2D(format=RGBA16Uint, size=4, content = zero, arrayLength=2):name w2DArray_u32v4 // WGSL: var w1D_u32v4{{[^:]*}}: texture_storage_1d [format("rgba16ui")] RWTexture1D w1D_u32v4; [format("rgba16ui")] RWTexture2D w2D_u32v4; [format("rgba16ui")] RWTexture3D w3D_u32v4; [format("rgba16ui")] RWTexture2DArray w2DArray_u32v4; __generic [ForceInline] // Workaround for a WGSL requirement that `texture_storage_Xd` must always be a global variable bool TEST_textureStorage_StoreLoad( RWTexture1D w1D, RWTexture2D w2D, RWTexture3D w3D, RWTexture2DArray w2DArray) where T:ITexelElement, IArithmetic { typealias Tvn = T; // =================== // o[i] = v; // https://www.w3.org/TR/WGSL/#texturestore // =================== // TODO: store before load // WGSL: textureStore({{\(*}}w1D w1D[0] = Tvn(T.Element(1)); // WGSL: textureStore({{\(*}}w2D w2D[0] = Tvn(T.Element(1)); // WGSL: textureStore({{\(*}}w3D w3D[0] = Tvn(T.Element(1)); // WGSL: textureStore({{\(*}}w2DArray w2DArray[0] = Tvn(T.Element(1)); return true // =================== // T Load() // https://www.w3.org/TR/WGSL/#textureload // =================== // WGSL: textureLoad({{\(*}}w1D && all(Tvn(T.Element(0)) == w1D.Load(0)) // WGSL: textureLoad({{\(*}}w2D && all(Tvn(T.Element(0)) == w2D.Load(int2(0, 0))) // WGSL: textureLoad({{\(*}}w3D && all(Tvn(T.Element(0)) == w3D.Load(int3(0, 0, 0))) // WGSL: textureLoad({{\(*}}w2DArray && all(Tvn(T.Element(0)) == w2DArray.Load(int3(0, 0, 0))) ; } void fragMain() { bool result = true && TEST_textureStorage_StoreLoad(w1D_f32v2, w2D_f32v2, w3D_f32v2, w2DArray_f32v2) && TEST_textureStorage_StoreLoad(w1D_f32v4, w2D_f32v4, w3D_f32v4, w2DArray_f32v4) && TEST_textureStorage_StoreLoad(w1D_f32_bgra_v4, w2D_f32_bgra_v4, w3D_f32_bgra_v4, w2DArray_f32_bgra_v4) && TEST_textureStorage_StoreLoad(w1D_i32v2, w2D_i32v2, w3D_i32v2, w2DArray_i32v2) && TEST_textureStorage_StoreLoad(w1D_i32v4, w2D_i32v4, w3D_i32v4, w2DArray_i32v4) && TEST_textureStorage_StoreLoad(w1D_u32v2, w2D_u32v2, w3D_u32v2, w2DArray_u32v2) && TEST_textureStorage_StoreLoad(w1D_u32v4, w2D_u32v4, w3D_u32v4, w2DArray_u32v4) ; outputBuffer[0] = int(result); }