summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js')
-rw-r--r--testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js135
1 files changed, 135 insertions, 0 deletions
diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js
new file mode 100644
index 0000000000..ebc125b3fb
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/call/builtin/atomics/atomicAnd.spec.js
@@ -0,0 +1,135 @@
+/**
+* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
+**/export const description = `
+Atomically read, and and store value.
+
+* Load the original value pointed to by atomic_ptr.
+* Obtains a new value by anding with the value v.
+* Store the new value using atomic_ptr.
+
+Returns the original value stored in the atomic object.
+`;import { makeTestGroup } from '../../../../../../../common/framework/test_group.js';
+import { keysOf } from '../../../../../../../common/util/data_tables.js';
+import { GPUTest } from '../../../../../../gpu_test.js';
+
+import {
+ dispatchSizes,
+ workgroupSizes,
+ runStorageVariableTest,
+ runWorkgroupVariableTest,
+ kMapId,
+ typedArrayCtor } from
+'./harness.js';
+
+export const g = makeTestGroup(GPUTest);
+
+g.test('and_storage').
+specURL('https://www.w3.org/TR/WGSL/#atomic-rmw').
+desc(
+ `
+AS is storage or workgroup
+T is i32 or u32
+
+fn atomicAnd(atomic_ptr: ptr<AS, atomic<T>, read_write>, v: T) -> T
+`
+).
+params((u) =>
+u.
+combine('workgroupSize', workgroupSizes).
+combine('dispatchSize', dispatchSizes).
+combine('mapId', keysOf(kMapId)).
+combine('scalarType', ['u32', 'i32'])
+).
+fn((t) => {
+ const numInvocations = t.params.workgroupSize * t.params.dispatchSize;
+
+ // Allocate an output buffer with bitsize of max invocations plus 1 for validation
+ const bufferNumElements = Math.max(1, numInvocations / 32) + 1;
+
+ // Start with all bits high, then using atomicAnd to set mapped global id bit off.
+ // Note: Both WGSL and JS will shift left 1 by id modulo 32.
+ const initValue = 0xffffffff;
+
+ const scalarType = t.params.scalarType;
+ const mapId = kMapId[t.params.mapId];
+ const extra = mapId.wgsl(numInvocations); // Defines map_id()
+ const op = `
+ let i = map_id(u32(id));
+ atomicAnd(&output[i / 32], ~(${scalarType}(1) << i))
+ `;
+
+ const expected = new (typedArrayCtor(scalarType))(bufferNumElements).fill(initValue);
+ for (let id = 0; id < numInvocations; ++id) {
+ const i = mapId.f(id, numInvocations);
+ expected[Math.floor(i / 32)] &= ~(1 << i);
+ }
+
+ runStorageVariableTest({
+ t,
+ workgroupSize: t.params.workgroupSize,
+ dispatchSize: t.params.dispatchSize,
+ bufferNumElements,
+ initValue,
+ op,
+ expected,
+ extra
+ });
+});
+
+g.test('and_workgroup').
+specURL('https://www.w3.org/TR/WGSL/#atomic-rmw').
+desc(
+ `
+AS is storage or workgroup
+T is i32 or u32
+
+fn atomicAnd(atomic_ptr: ptr<AS, atomic<T>, read_write>, v: T) -> T
+`
+).
+params((u) =>
+u.
+combine('workgroupSize', workgroupSizes).
+combine('dispatchSize', dispatchSizes).
+combine('mapId', keysOf(kMapId)).
+combine('scalarType', ['u32', 'i32'])
+).
+fn((t) => {
+ const numInvocations = t.params.workgroupSize;
+
+ // Allocate workgroup array with bitsize of max invocations plus 1 for validation
+ const wgNumElements = Math.max(1, numInvocations / 32) + 1;
+
+ // Start with all bits high, then using atomicAnd to set mapped global id bit off.
+ // Note: Both WGSL and JS will shift left 1 by id modulo 32.
+ const initValue = 0xffffffff;
+
+ const scalarType = t.params.scalarType;
+ const mapId = kMapId[t.params.mapId];
+ const extra = mapId.wgsl(numInvocations); // Defines map_id()
+ const op = `
+ let i = map_id(u32(id));
+ atomicAnd(&wg[i / 32], ~(${scalarType}(1) << i))
+ `;
+
+ const expected = new (typedArrayCtor(scalarType))(wgNumElements * t.params.dispatchSize).fill(
+ initValue
+ );
+ for (let d = 0; d < t.params.dispatchSize; ++d) {
+ for (let id = 0; id < numInvocations; ++id) {
+ const wg = expected.subarray(d * wgNumElements);
+ const i = mapId.f(id, numInvocations);
+ wg[Math.floor(i / 32)] &= ~(1 << i);
+ }
+ }
+
+ runWorkgroupVariableTest({
+ t,
+ workgroupSize: t.params.workgroupSize,
+ dispatchSize: t.params.dispatchSize,
+ wgNumElements,
+ initValue,
+ op,
+ expected,
+ extra
+ });
+}); \ No newline at end of file