2021-06-16 09:19:36 +00:00
|
|
|
[numthreads(1, 1, 1)]
|
|
|
|
void unused_entry_point() {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-06-16 09:19:36 +00:00
|
|
|
struct S {
|
2022-01-20 22:11:07 +00:00
|
|
|
int4 arr[4];
|
2021-06-16 09:19:36 +00:00
|
|
|
};
|
2021-06-16 09:19:36 +00:00
|
|
|
|
2022-01-20 22:11:07 +00:00
|
|
|
static int4 src_private[4] = (int4[4])0;
|
|
|
|
groupshared int4 src_workgroup[4];
|
2023-03-31 17:55:19 +00:00
|
|
|
cbuffer cbuffer_src_uniform : register(b0) {
|
transform: Fixes for DecomposeMemoryAccess
CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.
The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).
Switch the usage of CloneContext::Replace(T*, T*) to the new function form.
As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.
Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.
Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
2021-07-15 20:29:09 +00:00
|
|
|
uint4 src_uniform[4];
|
|
|
|
};
|
2023-03-31 17:55:19 +00:00
|
|
|
RWByteAddressBuffer src_storage : register(u1);
|
|
|
|
RWByteAddressBuffer tint_symbol : register(u2);
|
|
|
|
RWByteAddressBuffer dst_nested : register(u3);
|
transform: Fixes for DecomposeMemoryAccess
CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.
The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).
Switch the usage of CloneContext::Replace(T*, T*) to the new function form.
As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.
Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.
Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
2021-07-15 20:29:09 +00:00
|
|
|
|
2022-01-20 22:11:07 +00:00
|
|
|
typedef int4 ret_arr_ret[4];
|
transform: Fixes for DecomposeMemoryAccess
CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.
The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).
Switch the usage of CloneContext::Replace(T*, T*) to the new function form.
As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.
Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.
Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
2021-07-15 20:29:09 +00:00
|
|
|
ret_arr_ret ret_arr() {
|
2023-03-08 21:48:45 +00:00
|
|
|
const int4 tint_symbol_2[4] = (int4[4])0;
|
|
|
|
return tint_symbol_2;
|
2021-06-16 09:19:36 +00:00
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
|
transform: Fixes for DecomposeMemoryAccess
CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.
The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).
Switch the usage of CloneContext::Replace(T*, T*) to the new function form.
As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.
Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.
Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
2021-07-15 20:29:09 +00:00
|
|
|
S ret_struct_arr() {
|
2023-03-08 21:48:45 +00:00
|
|
|
const S tint_symbol_3 = (S)0;
|
|
|
|
return tint_symbol_3;
|
2021-06-18 21:15:25 +00:00
|
|
|
}
|
|
|
|
|
2023-02-24 17:16:55 +00:00
|
|
|
void tint_symbol_store(uint offset, int4 value[4]) {
|
2023-02-14 13:52:43 +00:00
|
|
|
int4 array_1[4] = value;
|
2021-07-16 19:47:44 +00:00
|
|
|
{
|
2022-09-29 16:53:58 +00:00
|
|
|
for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
2023-02-24 17:16:55 +00:00
|
|
|
tint_symbol.Store4((offset + (i * 16u)), asuint(array_1[i]));
|
2021-07-16 19:47:44 +00:00
|
|
|
}
|
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
}
|
|
|
|
|
2023-02-24 17:16:55 +00:00
|
|
|
typedef int4 src_uniform_load_ret[4];
|
|
|
|
src_uniform_load_ret src_uniform_load(uint offset) {
|
2022-01-20 22:11:07 +00:00
|
|
|
int4 arr_1[4] = (int4[4])0;
|
2021-07-16 19:47:44 +00:00
|
|
|
{
|
2022-09-29 16:53:58 +00:00
|
|
|
for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
2021-07-16 19:47:44 +00:00
|
|
|
const uint scalar_offset = ((offset + (i_1 * 16u))) / 4;
|
2023-02-24 17:16:55 +00:00
|
|
|
arr_1[i_1] = asint(src_uniform[scalar_offset / 4]);
|
2021-07-16 19:47:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return arr_1;
|
transform: Fixes for DecomposeMemoryAccess
CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.
The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).
Switch the usage of CloneContext::Replace(T*, T*) to the new function form.
As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.
Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.
Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
2021-07-15 20:29:09 +00:00
|
|
|
}
|
|
|
|
|
2023-02-24 17:16:55 +00:00
|
|
|
typedef int4 src_storage_load_ret[4];
|
|
|
|
src_storage_load_ret src_storage_load(uint offset) {
|
2022-01-20 22:11:07 +00:00
|
|
|
int4 arr_2[4] = (int4[4])0;
|
2021-07-16 19:47:44 +00:00
|
|
|
{
|
2022-09-29 16:53:58 +00:00
|
|
|
for(uint i_2 = 0u; (i_2 < 4u); i_2 = (i_2 + 1u)) {
|
2023-02-24 17:16:55 +00:00
|
|
|
arr_2[i_2] = asint(src_storage.Load4((offset + (i_2 * 16u))));
|
2021-07-16 19:47:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return arr_2;
|
transform: Fixes for DecomposeMemoryAccess
CloneContext::Replace(T* what, T* with) is bug-prone, as complex transforms may want to clone `what` multiple times, or not at all. In both cases, this will likely result in an ICE as either the replacement will be reachable multiple times, or not at all.
The CTS test: webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";atomic=true;baseType="i32"
Was triggering this brokenness with DecomposeMemoryAccess's use of CloneContext::Replace(T*, T*).
Switch the usage of CloneContext::Replace(T*, T*) to the new function form.
As std::function is copyable, it cannot hold a captured std::unique_ptr.
This prevented the Replace() lambdas from capturing the necessary `BufferAccess` data, as this held a `std::unique_ptr<Offset>`.
To fix this, use a `BlockAllocator` for Offsets, and use raw pointers instead.
Because the function passed to Replace() is called just before the node is cloned, insertion of new functions will occur just before the currently evaluated module-scope entity.
This allows us to remove the "insert_after" arguments to LoadFunc(), StoreFunc(), and AtomicFunc().
We can also kill the icky InsertGlobal() and TypeDeclOf() helpers.
Bug: tint:993
Change-Id: I60972bc13a2fa819a163ee2671f61e82d0e68d2a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58222
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
2021-07-15 20:29:09 +00:00
|
|
|
}
|
|
|
|
|
2023-02-24 17:16:55 +00:00
|
|
|
void dst_nested_store_2(uint offset, int value[2]) {
|
2023-02-14 13:52:43 +00:00
|
|
|
int array_4[2] = value;
|
2021-07-16 19:47:44 +00:00
|
|
|
{
|
2022-09-29 16:53:58 +00:00
|
|
|
for(uint i_3 = 0u; (i_3 < 2u); i_3 = (i_3 + 1u)) {
|
2023-02-24 17:16:55 +00:00
|
|
|
dst_nested.Store((offset + (i_3 * 4u)), asuint(array_4[i_3]));
|
2021-07-16 19:47:44 +00:00
|
|
|
}
|
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
|
2023-02-24 17:16:55 +00:00
|
|
|
void dst_nested_store_1(uint offset, int value[3][2]) {
|
2023-02-14 13:52:43 +00:00
|
|
|
int array_3[3][2] = value;
|
2021-07-16 19:47:44 +00:00
|
|
|
{
|
2022-09-29 16:53:58 +00:00
|
|
|
for(uint i_4 = 0u; (i_4 < 3u); i_4 = (i_4 + 1u)) {
|
2023-02-24 17:16:55 +00:00
|
|
|
dst_nested_store_2((offset + (i_4 * 8u)), array_3[i_4]);
|
2021-07-16 19:47:44 +00:00
|
|
|
}
|
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
|
2023-02-24 17:16:55 +00:00
|
|
|
void dst_nested_store(uint offset, int value[4][3][2]) {
|
2023-02-14 13:52:43 +00:00
|
|
|
int array_2[4][3][2] = value;
|
2021-07-16 19:47:44 +00:00
|
|
|
{
|
2022-09-29 16:53:58 +00:00
|
|
|
for(uint i_5 = 0u; (i_5 < 4u); i_5 = (i_5 + 1u)) {
|
2023-02-24 17:16:55 +00:00
|
|
|
dst_nested_store_1((offset + (i_5 * 24u)), array_2[i_5]);
|
2021-07-16 19:47:44 +00:00
|
|
|
}
|
|
|
|
}
|
2021-06-16 09:19:36 +00:00
|
|
|
}
|
|
|
|
|
2022-01-20 22:11:07 +00:00
|
|
|
void foo(int4 src_param[4]) {
|
|
|
|
int4 src_function[4] = (int4[4])0;
|
2023-03-08 21:48:45 +00:00
|
|
|
const int4 tint_symbol_4[4] = {(1).xxxx, (2).xxxx, (3).xxxx, (3).xxxx};
|
|
|
|
tint_symbol_store(0u, tint_symbol_4);
|
2023-02-24 17:16:55 +00:00
|
|
|
tint_symbol_store(0u, src_param);
|
2023-03-08 21:48:45 +00:00
|
|
|
tint_symbol_store(0u, ret_arr());
|
2022-01-20 22:11:07 +00:00
|
|
|
const int4 src_let[4] = (int4[4])0;
|
2023-02-24 17:16:55 +00:00
|
|
|
tint_symbol_store(0u, src_let);
|
|
|
|
tint_symbol_store(0u, src_function);
|
|
|
|
tint_symbol_store(0u, src_private);
|
|
|
|
tint_symbol_store(0u, src_workgroup);
|
2023-03-08 21:48:45 +00:00
|
|
|
const S tint_symbol_1 = ret_struct_arr();
|
|
|
|
tint_symbol_store(0u, tint_symbol_1.arr);
|
2023-02-24 17:16:55 +00:00
|
|
|
tint_symbol_store(0u, src_uniform_load(0u));
|
|
|
|
tint_symbol_store(0u, src_storage_load(0u));
|
2021-07-05 15:20:57 +00:00
|
|
|
int src_nested[4][3][2] = (int[4][3][2])0;
|
2023-02-24 17:16:55 +00:00
|
|
|
dst_nested_store(0u, src_nested);
|
2021-06-16 09:19:36 +00:00
|
|
|
}
|