From 8c713be450f29a1b8e0e7c78a09b756c5cdd7cea Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Tue, 18 Apr 2023 00:46:02 -0700 Subject: [PATCH] [WGSL] Add type declarations for logical built-in functions https://bugs.webkit.org/show_bug.cgi?id=255513 rdar://108134231 Reviewed by Mike Wyrzykowski. Add type declarations for the 3 functions from section 17.3 (Logical Built-in Functions) of the spec[1]. [1]: https://www.w3.org/TR/WGSL/#logical-builtin-functions * Source/WebGPU/WGSL/TypeDeclarations.rb: * Source/WebGPU/WGSL/tests/valid/overload.wgsl: Canonical link: https://commits.webkit.org/263064@main --- Source/WebGPU/WGSL/TypeDeclarations.rb | 17 ++++ Source/WebGPU/WGSL/tests/valid/overload.wgsl | 89 +++++++++++++++++++- 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/Source/WebGPU/WGSL/TypeDeclarations.rb b/Source/WebGPU/WGSL/TypeDeclarations.rb index f1b6b3c84df1..c0288ef56afc 100644 --- a/Source/WebGPU/WGSL/TypeDeclarations.rb +++ b/Source/WebGPU/WGSL/TypeDeclarations.rb @@ -164,3 +164,20 @@ [T < Float, N].(Vector[T, N]) => Vector[T, N], } end + +# 17.3. Logical Built-in Functions (https://www.w3.org/TR/WGSL/#logical-builtin-functions) + +# 17.3.1 & 17.3.2 +["all", "any"].each do |op| + operator :"#{op}", { + [N].(Vector[Bool, N]) => Bool, + [N].(Bool) => Bool, + } +end + +# 17.3.3 +operator :select, { + [T < Scalar].(T, T, Bool) => T, + [T < Scalar, N].(Vector[T, N], Vector[T, N], Bool) => Vector[T, N], + [T < Scalar, N].(Vector[T, N], Vector[T, N], Vector[Bool, N]) => Vector[T, N], +} diff --git a/Source/WebGPU/WGSL/tests/valid/overload.wgsl b/Source/WebGPU/WGSL/tests/valid/overload.wgsl index ccd9ea1091c8..ea17d28ce900 100644 --- a/Source/WebGPU/WGSL/tests/valid/overload.wgsl +++ b/Source/WebGPU/WGSL/tests/valid/overload.wgsl @@ -485,4 +485,91 @@ fn testBitwise() let x1 = 0i ^ 1i; let x2 = 0u ^ 1u; } -} \ No newline at end of file +} + +// 17.3. Logical Built-in Functions (https://www.w3.org/TR/WGSL/#logical-builtin-functions) + +// 17.3.1 +fn testAll() +{ + // [N].(Vector[Bool, N]) => Bool, + let x1 = all(vec2(false, true)); + let x2 = all(vec3(true, true, true)); + let x3 = all(vec4(false, false, false, false)); + + // [N].(Bool) => Bool, + let x4 = all(true); + let x5 = all(false); +} + +// 17.3.2 +fn testAny() +{ + // [N].(Vector[Bool, N]) => Bool, + let x1 = any(vec2(false, true)); + let x2 = any(vec3(true, true, true)); + let x3 = any(vec4(false, false, false, false)); + + // [N].(Bool) => Bool, + let x4 = any(true); + let x5 = any(false); +} + +// 17.3.3 +fn testSelect() +{ + // [T < Scalar].(T, T, Bool) => T, + { + let x1 = select(13, 42, false); + let x2 = select(13, 42i, false); + let x3 = select(13, 42u, true); + let x4 = select(13, 42f, true); + let x5 = select(13, 42.0, true); + } + + // [T < Scalar, N].(Vector[T, N], Vector[T, N], Bool) => Vector[T, N], + { + let x1 = select(vec2(13), vec2(42), false); + let x2 = select(vec2(13), vec2(42i), false); + let x3 = select(vec2(13), vec2(42u), true); + let x4 = select(vec2(13), vec2(42f), true); + let x5 = select(vec2(13), vec2(42.0), true); + } + { + let x1 = select(vec3(13), vec3(42), false); + let x2 = select(vec3(13), vec3(42i), false); + let x3 = select(vec3(13), vec3(42u), true); + let x4 = select(vec3(13), vec3(42f), true); + let x5 = select(vec3(13), vec3(42.0), true); + } + { + let x1 = select(vec4(13), vec4(42), false); + let x2 = select(vec4(13), vec4(42i), false); + let x3 = select(vec4(13), vec4(42u), true); + let x4 = select(vec4(13), vec4(42f), true); + let x5 = select(vec4(13), vec4(42.0), true); + } + + // [T < Scalar, N].(Vector[T, N], Vector[T, N], Vector[Bool, N]) => Vector[T, N], + { + let x1 = select(vec2(13), vec2(42), vec2(false)); + let x2 = select(vec2(13), vec2(42i), vec2(false)); + let x3 = select(vec2(13), vec2(42u), vec2(true)); + let x4 = select(vec2(13), vec2(42f), vec2(true)); + let x5 = select(vec2(13), vec2(42.0), vec2(true)); + } + { + let x1 = select(vec3(13), vec3(42), vec3(false)); + let x2 = select(vec3(13), vec3(42i), vec3(false)); + let x3 = select(vec3(13), vec3(42u), vec3(true)); + let x4 = select(vec3(13), vec3(42f), vec3(true)); + let x5 = select(vec3(13), vec3(42.0), vec3(true)); + } + { + let x1 = select(vec4(13), vec4(42), vec4(false)); + let x2 = select(vec4(13), vec4(42i), vec4(false)); + let x3 = select(vec4(13), vec4(42u), vec4(true)); + let x4 = select(vec4(13), vec4(42f), vec4(true)); + let x5 = select(vec4(13), vec4(42.0), vec4(true)); + } +}