1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
/**
* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts
**/export const description = `
Atomically read, subtract and store value.
* Load the original value pointed to by atomic_ptr.
* Obtains a new value by subtracting 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 { GPUTest } from '../../../../../../gpu_test.js';
import {
dispatchSizes,
workgroupSizes,
runStorageVariableTest,
runWorkgroupVariableTest,
typedArrayCtor } from
'./harness.js';
export const g = makeTestGroup(GPUTest);
g.test('sub_storage').
specURL('https://www.w3.org/TR/WGSL/#atomic-rmw').
desc(
`
AS is storage or workgroup
T is i32 or u32
fn atomicSub(atomic_ptr: ptr<AS, atomic<T>, read_write>, v: T) -> T
`
).
params((u) =>
u.
combine('workgroupSize', workgroupSizes).
combine('dispatchSize', dispatchSizes).
combine('scalarType', ['u32', 'i32'])
).
fn((t) => {
const numInvocations = t.params.workgroupSize * t.params.dispatchSize;
// Allocate one extra element to ensure it doesn't get modified
const bufferNumElements = 2;
const initValue = 0;
const op = `atomicSub(&output[0], 1)`;
const expected = new (typedArrayCtor(t.params.scalarType))(bufferNumElements);
expected[0] = -1 * numInvocations;
runStorageVariableTest({
t,
workgroupSize: t.params.workgroupSize,
dispatchSize: t.params.dispatchSize,
bufferNumElements,
initValue,
op,
expected
});
});
g.test('sub_workgroup').
specURL('https://www.w3.org/TR/WGSL/#atomic-rmw').
desc(
`
AS is storage or workgroup
T is i32 or u32
fn atomicSub(atomic_ptr: ptr<AS, atomic<T>, read_write>, v: T) -> T
`
).
params((u) =>
u.
combine('workgroupSize', workgroupSizes).
combine('dispatchSize', dispatchSizes).
combine('scalarType', ['u32', 'i32'])
).
fn((t) => {
// Allocate one extra element to ensure it doesn't get modified
const wgNumElements = 2;
const initValue = 0;
const op = `atomicSub(&wg[0], 1)`;
const expected = new (typedArrayCtor(t.params.scalarType))(
wgNumElements * t.params.dispatchSize
);
for (let d = 0; d < t.params.dispatchSize; ++d) {
const wg = expected.subarray(d * wgNumElements);
wg[0] = -1 * t.params.workgroupSize;
}
runWorkgroupVariableTest({
t,
workgroupSize: t.params.workgroupSize,
dispatchSize: t.params.dispatchSize,
wgNumElements,
initValue,
op,
expected
});
});
|