From 07166468c6fa706b7f35d3422e4966f62e7b86d2 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:51:08 -0700 Subject: Implement math intrinsics for WGSL (#5078) * Implement math intrinsics for WGSL This commit implements math related intrinsics and a few others for WGSL. The implementation is based on the following doc, https://www.w3.org/TR/WGSL slang-test was looking for the downstream compiler for WGSL even though it is not used. This commit adds a minimal change to avoid the crash. --- tests/wgsl/math.slang | 279 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 tests/wgsl/math.slang (limited to 'tests') diff --git a/tests/wgsl/math.slang b/tests/wgsl/math.slang new file mode 100644 index 000000000..d7f39ce43 --- /dev/null +++ b/tests/wgsl/math.slang @@ -0,0 +1,279 @@ +//TEST:SIMPLE(filecheck=WGSL): -stage compute -entry computeMain -target wgsl + +RWStructuredBuffer inputBuffer; +RWStructuredBuffer outputBuffer; + +__generic +bool Test_Scalar() +{ + // WGSL-LABEL: Test_Scalar + + const T zero = T(inputBuffer[0]); + const T one = T(inputBuffer[1]); + const int zeroInt = int(inputBuffer[0]); + + T outFloat1, outFloat2; + int outInt; + + return true + + // WGSL: acos( + && zero == acos(one) + + // WGSL: acosh( + && zero == acosh(one) + + // WGSL: asin( + && zero == asin(zero) + + // WGSL: asinh( + && zero == asinh(zero) + + // WGSL: atan( + && zero == atan(zero) + + // WGSL: atan2( + && zero == atan2(zero, zero) + + // WGSL: atanh( + && zero == atanh(zero) + + // WGSL: ceil( + && zero == ceil(zero) + + // WGSL: cos( + && one == cos(zero) + + // WGSL: cosh( + && one == cosh(zero) + + // WGSL: exp( + && one == exp(zero) + + // WGSL: exp2( + && one == exp2(zero) + + // WGSL: abs( + && zero == abs(zero) + + // WGSL: floor( + && zero == floor(zero) + + // WGSL: fma( + && zero == fma(zero, zero, zero) + + // WGSL: max( + && zero == max(zero, zero) + + // WGSL: min( + && zero == min(zero, zero) + + // WGSL: fract( + && zero == fract(zero) + + // WGSL: frexp( + && zero == frexp(zero, outInt) && zeroInt == outInt + + // WGSL: ldexp( + && zero == ldexp(zero, zeroInt) + + // WGSL: log( + && zero == log(one) + + // WGSL: log2( + && zero == log2(one) + + // WGSL: modf( + && zero == modf(zero, outFloat1) + + // WGSL: pow( + && zero == pow(zero, one) + + // WGSL: round( + && zero == round(zero) + + // WGSL: sin( + && zero == sin(zero) + + // WGSL: sinh( + && zero == sinh(zero) + + // WGSL: sqrt( + && zero == sqrt(zero) + + // WGSL: tan( + && zero == tan(zero) + + // WGSL: tanh( + && zero == tanh(zero) + + // WGSL: trunc( + && zero == trunc(zero) + ; +} + +__generic +bool Test_Vector() +{ + // WGSL-LABEL: Test_Vector_0 + const vector zero = T(inputBuffer[0]); + const vector one = T(inputBuffer[1]); + + const vector zeroInt = int(inputBuffer[0]); + + vector outFloat1, outFloat2; + vector outInt; + + return true + // WGSL: acos( + // WGSL-NOT: acos( + && zero == acos(one) + + // WGSL: acosh( + // WGSL-NOT: acosh( + && zero == acosh(one) + + // WGSL: asin( + // WGSL-NOT: asin( + && zero == asin(zero) + + // WGSL: asinh( + // WGSL-NOT: asinh( + && zero == asinh(zero) + + // WGSL: atan( + // WGSL-NOT: atan( + && zero == atan(zero) + + // WGSL: atan2( + // WGSL-NOT: atan2( + && zero == atan2(zero, zero) + + // WGSL: atanh( + // WGSL-NOT: atanh( + && zero == atanh(zero) + + // WGSL: ceil( + // WGSL-NOT: ceil( + && zero == ceil(zero) + + // WGSL: cos( + // WGSL-NOT: cos( + && one == cos(zero) + + // WGSL: cosh( + // WGSL-NOT: cosh( + && one == cosh(zero) + + // WGSL: exp( + // WGSL-NOT: exp( + && one == exp(zero) + + // WGSL: exp2( + // WGSL-NOT: exp2( + && one == exp2(zero) + + // WGSL: abs( + // WGSL-NOT: abs( + && zero == abs(zero) + + // WGSL: floor( + // WGSL-NOT: floor( + && zero == floor(zero) + + // WGSL: fma( + // WGSL-NOT: fma( + && zero == fma(zero, zero, zero) + + // WGSL: max( + // WGSL-NOT: max( + && zero == max(zero, zero) + + // WGSL: min( + // WGSL-NOT: min( + && zero == min(zero, zero) + + // WGSL: fract( + // WGSL-NOT: fract( + && zero == fract(zero) + + // WGSL: frexp( + // WGSL-NOT: frexp( + && zero == frexp(zero, outInt) && all(zeroInt == outInt) + + // WGSL: ldexp( + // WGSL-NOT: ldexp( + && zero == ldexp(zero, zeroInt) + + // WGSL: log( + // WGSL-NOT: log( + && zero == log(one) + + // WGSL: log2( + // WGSL-NOT: log2( + && zero == log2(one) + + // WGSL: modf( + // WGSL-NOT: modf( + && zero == modf(zero, outFloat1) + + // WGSL: pow( + // WGSL-NOT: pow( + && zero == pow(zero, one) + + // WGSL: round( + // WGSL-NOT: round( + && zero == round(zero) + + // WGSL: sin( + // WGSL-NOT: sin( + && zero == sin(zero) + + // WGSL: sinh( + // WGSL-NOT: sinh( + && zero == sinh(zero) + + // WGSL: sqrt( + // WGSL-NOT: sqrt( + && zero == sqrt(zero) + + // WGSL: tan( + // WGSL-NOT: tan( + && zero == tan(zero) + + // WGSL: tanh( + // WGSL-NOT: tanh( + && zero == tanh(zero) + + // WGSL: trunc( + // WGSL-NOT: trunc( + && zero == trunc(zero) + ; + + // WGSL-LABEL: Test_Vector_1 +} + +[numthreads(1,1,1)] +void computeMain() +{ + // GLSL: void main( + // GLSL_SPIRV: OpEntryPoint + // SPIR: OpEntryPoint + // HLSL: void computeMain( + // CUDA: void computeMain( + // CPP: void _computeMain( + + bool result = true + && Test_Scalar() + && Test_Vector() + && Test_Vector() + && Test_Vector() + && Test_Scalar() + && Test_Vector() + && Test_Vector() + && Test_Vector() + ; + + // BUF: 1 + outputBuffer[0] = int(result); +} -- cgit v1.2.3