diff options
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.spec.ts')
-rw-r--r-- | dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.spec.ts | 198 |
1 files changed, 62 insertions, 136 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.spec.ts index 6b6794fb9f..096abe034f 100644 --- a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.spec.ts +++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.spec.ts @@ -1,142 +1,68 @@ export const description = ` Execution tests for the 'faceForward' builtin function -T is vecN<AbstractFloat>, vecN<f32>, or vecN<f16> +T is vecN<Type.abstractFloat>, vecN<f32>, or vecN<f16> @const fn faceForward(e1: T ,e2: T ,e3: T ) -> T Returns e1 if dot(e2,e3) is negative, and -e1 otherwise. `; import { makeTestGroup } from '../../../../../../common/framework/test_group.js'; -import { ROArrayArray } from '../../../../../../common/util/types.js'; import { GPUTest } from '../../../../../gpu_test.js'; -import { anyOf } from '../../../../../util/compare.js'; -import { toVector, TypeF32, TypeF16, TypeVec } from '../../../../../util/conversion.js'; -import { FP, FPKind, FPVector } from '../../../../../util/floating_point.js'; -import { - cartesianProduct, - sparseVectorF32Range, - sparseVectorF16Range, -} from '../../../../../util/math.js'; -import { makeCaseCache } from '../../case_cache.js'; -import { allInputSources, Case, IntervalFilter, run } from '../../expression.js'; +import { Type } from '../../../../../util/conversion.js'; +import { allInputSources, onlyConstInputSource, run } from '../../expression.js'; -import { builtin } from './builtin.js'; +import { abstractFloatBuiltin, builtin } from './builtin.js'; +import { d } from './faceForward.cache.js'; export const g = makeTestGroup(GPUTest); -// Using a bespoke implementation of make*Case and generate*Cases here -// since faceForwardIntervals is the only builtin with the API signature -// (vec, vec, vec) -> vec -// -// Additionally faceForward has significant complexities around it due to the -// fact that `dot` is calculated in it s operation, but the result of dot isn't -// used to calculate the builtin's result. - -/** - * @returns a Case for `faceForward` - * @param kind what kind of floating point numbers being operated on - * @param x the `x` param for the case - * @param y the `y` param for the case - * @param z the `z` param for the case - * @param check what interval checking to apply - * */ -function makeCase( - kind: FPKind, - x: readonly number[], - y: readonly number[], - z: readonly number[], - check: IntervalFilter -): Case | undefined { - const fp = FP[kind]; - x = x.map(fp.quantize); - y = y.map(fp.quantize); - z = z.map(fp.quantize); - - const results = FP[kind].faceForwardIntervals(x, y, z); - if (check === 'finite' && results.some(r => r === undefined)) { - return undefined; - } - - // Stripping the undefined results, since undefined is used to signal that an OOB - // could occur within the calculation that isn't reflected in the result - // intervals. - const define_results = results.filter((r): r is FPVector => r !== undefined); - - return { - input: [ - toVector(x, fp.scalarBuilder), - toVector(y, fp.scalarBuilder), - toVector(z, fp.scalarBuilder), - ], - expected: anyOf(...define_results), - }; -} - -/** - * @returns an array of Cases for `faceForward` - * @param kind what kind of floating point numbers being operated on - * @param xs array of inputs to try for the `x` param - * @param ys array of inputs to try for the `y` param - * @param zs array of inputs to try for the `z` param - * @param check what interval checking to apply - */ -function generateCases( - kind: FPKind, - xs: ROArrayArray<number>, - ys: ROArrayArray<number>, - zs: ROArrayArray<number>, - check: IntervalFilter -): Case[] { - // Cannot use `cartesianProduct` here due to heterogeneous param types - return cartesianProduct(xs, ys, zs) - .map(e => makeCase(kind, e[0], e[1], e[2], check)) - .filter((c): c is Case => c !== undefined); -} - -// Cases: f32_vecN_[non_]const -const f32_vec_cases = ([2, 3, 4] as const) - .flatMap(n => - ([true, false] as const).map(nonConst => ({ - [`f32_vec${n}_${nonConst ? 'non_const' : 'const'}`]: () => { - return generateCases( - 'f32', - sparseVectorF32Range(n), - sparseVectorF32Range(n), - sparseVectorF32Range(n), - nonConst ? 'unfiltered' : 'finite' - ); - }, - })) - ) - .reduce((a, b) => ({ ...a, ...b }), {}); - -// Cases: f16_vecN_[non_]const -const f16_vec_cases = ([2, 3, 4] as const) - .flatMap(n => - ([true, false] as const).map(nonConst => ({ - [`f16_vec${n}_${nonConst ? 'non_const' : 'const'}`]: () => { - return generateCases( - 'f16', - sparseVectorF16Range(n), - sparseVectorF16Range(n), - sparseVectorF16Range(n), - nonConst ? 'unfiltered' : 'finite' - ); - }, - })) - ) - .reduce((a, b) => ({ ...a, ...b }), {}); +g.test('abstract_float_vec2') + .specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions') + .desc(`abstract float tests using vec2s`) + .params(u => u.combine('inputSource', onlyConstInputSource)) + .fn(async t => { + const cases = await d.get('abstract_vec2_const'); + await run( + t, + abstractFloatBuiltin('faceForward'), + [Type.vec2af, Type.vec2af, Type.vec2af], + Type.vec2af, + t.params, + cases + ); + }); -export const d = makeCaseCache('faceForward', { - ...f32_vec_cases, - ...f16_vec_cases, -}); +g.test('abstract_float_vec3') + .specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions') + .desc(`abstract float tests using vec3s`) + .params(u => u.combine('inputSource', onlyConstInputSource)) + .fn(async t => { + const cases = await d.get('abstract_vec3_const'); + await run( + t, + abstractFloatBuiltin('faceForward'), + [Type.vec3af, Type.vec3af, Type.vec3af], + Type.vec3af, + t.params, + cases + ); + }); -g.test('abstract_float') - .specURL('https://www.w3.org/TR/WGSL/#float-builtin-functions') - .desc(`abstract float tests`) - .params(u => u.combine('inputSource', allInputSources).combine('vectorize', [2, 3, 4] as const)) - .unimplemented(); +g.test('abstract_float_vec4') + .specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions') + .desc(`abstract float tests using vec4s`) + .params(u => u.combine('inputSource', onlyConstInputSource)) + .fn(async t => { + const cases = await d.get('abstract_vec4_const'); + await run( + t, + abstractFloatBuiltin('faceForward'), + [Type.vec4af, Type.vec4af, Type.vec4af], + Type.vec4af, + t.params, + cases + ); + }); g.test('f32_vec2') .specURL('https://www.w3.org/TR/WGSL/#numeric-builtin-functions') @@ -149,8 +75,8 @@ g.test('f32_vec2') await run( t, builtin('faceForward'), - [TypeVec(2, TypeF32), TypeVec(2, TypeF32), TypeVec(2, TypeF32)], - TypeVec(2, TypeF32), + [Type.vec2f, Type.vec2f, Type.vec2f], + Type.vec2f, t.params, cases ); @@ -167,8 +93,8 @@ g.test('f32_vec3') await run( t, builtin('faceForward'), - [TypeVec(3, TypeF32), TypeVec(3, TypeF32), TypeVec(3, TypeF32)], - TypeVec(3, TypeF32), + [Type.vec3f, Type.vec3f, Type.vec3f], + Type.vec3f, t.params, cases ); @@ -185,8 +111,8 @@ g.test('f32_vec4') await run( t, builtin('faceForward'), - [TypeVec(4, TypeF32), TypeVec(4, TypeF32), TypeVec(4, TypeF32)], - TypeVec(4, TypeF32), + [Type.vec4f, Type.vec4f, Type.vec4f], + Type.vec4f, t.params, cases ); @@ -206,8 +132,8 @@ g.test('f16_vec2') await run( t, builtin('faceForward'), - [TypeVec(2, TypeF16), TypeVec(2, TypeF16), TypeVec(2, TypeF16)], - TypeVec(2, TypeF16), + [Type.vec2h, Type.vec2h, Type.vec2h], + Type.vec2h, t.params, cases ); @@ -227,8 +153,8 @@ g.test('f16_vec3') await run( t, builtin('faceForward'), - [TypeVec(3, TypeF16), TypeVec(3, TypeF16), TypeVec(3, TypeF16)], - TypeVec(3, TypeF16), + [Type.vec3h, Type.vec3h, Type.vec3h], + Type.vec3h, t.params, cases ); @@ -248,8 +174,8 @@ g.test('f16_vec4') await run( t, builtin('faceForward'), - [TypeVec(4, TypeF16), TypeVec(4, TypeF16), TypeVec(4, TypeF16)], - TypeVec(4, TypeF16), + [Type.vec4h, Type.vec4h, Type.vec4h], + Type.vec4h, t.params, cases ); |