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
|
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -compile-arg -skip-spirv-validation -emit-spirv-directly
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-dx12
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-mtl
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cpu
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-cuda
//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-wgpu
// CHECK: 8765432F
// CHECK-NEXT: 876543F1
// CHECK-NEXT: 87654F21
// CHECK-NEXT: 8765F321
// CHECK-NEXT: A8
// CHECK-NEXT: 3FC0
// CHECK-NEXT: AF
// CHECK-NEXT: 123456F8
// CHECK-NEXT: 9ABCDE60
// CHECK-NEXT: 87654331
// CHECK-NEXT: FEDCBA68
// CHECK-NEXT: 12345EF8
// CHECK-NEXT: 9ABCD560
// CHECK-NEXT: 87654431
// CHECK-NEXT: FEDCB568
//TEST_INPUT:ubuffer(data=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14], stride=4):out,name=u32Buffer
RWStructuredBuffer<uint> u32Buffer;
[numthreads(1, 1, 1)]
void computeMain()
{
// 32-bit tests
{
// Simple hex insertion to test, varying the offset.
uint base = 0x87654321;
uint value = 0xABCDEF;
u32Buffer[0] = bitfieldInsert(base, value, 4 * 0, 4); // 0x8765432F
u32Buffer[1] = bitfieldInsert(base, value, 4 * 1, 4); // 0x876543F1
u32Buffer[2] = bitfieldInsert(base, value, 4 * 2, 4); // 0x8765F321
u32Buffer[3] = bitfieldInsert(base, value, 4 * 3, 4); // 0x87F54321
// Test with varying bit length
base = 0;
value = 0b101010;
u32Buffer[4] = bitfieldInsert(base, value, 2, 6); // 0b10101000
value = 0b11111111;
u32Buffer[5] = bitfieldInsert(base, value, 6, 8); // 0b11111111000000
// Test with int input
u32Buffer[6] = bitfieldInsert(0b10100000, 0b1111, 0, 4); // 0b10101111
// Test with a vector
uint4 base4 = uint4(0x12345678, 0x9abcdef0, 0x87654321, 0xfedcba98);
uint4 value4 = uint4(0xABCDEF, 0x123456, 0x876543, 0x123456);
uint4 output4 = bitfieldInsert(base4, value4, 4, 4);
u32Buffer[7] = output4.x;
u32Buffer[8] = output4.y;
u32Buffer[9] = output4.z;
u32Buffer[10] = output4.w;
// Test with a int vector
int4 ibase4 = int4(0x12345678, 0x9abcdef0, 0x87654321, 0xfedcba98);
int4 ivalue4 = int4(0xABCDEF, 0x123456, 0x876543, 0x123456);
int4 ioutput4 = bitfieldInsert(ibase4, ivalue4, 4, 8);
u32Buffer[11] = ioutput4.x;
u32Buffer[12] = ioutput4.y;
u32Buffer[13] = ioutput4.z;
u32Buffer[14] = ioutput4.w;
}
}
|