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
|
|
|
cbuffer cbuffer_x_20 : register(b0, space0) {
|
|
|
|
uint4 x_20[1];
|
|
|
|
};
|
|
|
|
cbuffer cbuffer_x_26 : register(b0, space1) {
|
|
|
|
uint4 x_26[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct tint_symbol_1 {
|
|
|
|
uint gl_VertexIndex : SV_VertexID;
|
|
|
|
};
|
|
|
|
struct tint_symbol_2 {
|
|
|
|
float4 value : SV_Position;
|
|
|
|
};
|
|
|
|
|
2021-06-24 22:37:48 +00:00
|
|
|
float2x2 tint_symbol_4(uint4 buffer[1], uint offset) {
|
2021-07-02 19:27:42 +00:00
|
|
|
const uint scalar_offset = ((offset + 0u)) / 4;
|
2021-06-24 22:37:48 +00:00
|
|
|
uint4 ubo_load = buffer[scalar_offset / 4];
|
2021-07-02 19:27:42 +00:00
|
|
|
const uint scalar_offset_1 = ((offset + 8u)) / 4;
|
2021-06-24 22:37:48 +00:00
|
|
|
uint4 ubo_load_1 = buffer[scalar_offset_1 / 4];
|
|
|
|
return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)));
|
|
|
|
}
|
2021-06-10 18:49:14 +00:00
|
|
|
|
2021-06-24 22:37:48 +00:00
|
|
|
float2x2 tint_symbol_6(uint4 buffer[1], uint offset) {
|
2021-07-02 19:27:42 +00:00
|
|
|
const uint scalar_offset_2 = ((offset + 0u)) / 4;
|
2021-06-24 22:37:48 +00:00
|
|
|
uint4 ubo_load_2 = buffer[scalar_offset_2 / 4];
|
2021-07-02 19:27:42 +00:00
|
|
|
const uint scalar_offset_3 = ((offset + 8u)) / 4;
|
2021-06-24 22:37:48 +00:00
|
|
|
uint4 ubo_load_3 = buffer[scalar_offset_3 / 4];
|
|
|
|
return float2x2(asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy)));
|
|
|
|
}
|
2021-06-10 18:49:14 +00:00
|
|
|
|
|
|
|
tint_symbol_2 main(tint_symbol_1 tint_symbol) {
|
2021-06-24 22:37:48 +00:00
|
|
|
const uint gl_VertexIndex = tint_symbol.gl_VertexIndex;
|
2021-07-05 15:20:57 +00:00
|
|
|
float2 indexable[3] = (float2[3])0;
|
2021-06-24 22:37:48 +00:00
|
|
|
const float2x2 x_23 = tint_symbol_4(x_20, 0u);
|
|
|
|
const float2x2 x_28 = tint_symbol_6(x_26, 0u);
|
|
|
|
const uint x_46 = gl_VertexIndex;
|
2021-07-05 15:20:57 +00:00
|
|
|
const float2 tint_symbol_7[3] = {float2(-1.0f, 1.0f), float2(1.0f, 1.0f), float2(-1.0f, -1.0f)};
|
2021-06-24 22:37:48 +00:00
|
|
|
indexable = tint_symbol_7;
|
2021-07-05 15:20:57 +00:00
|
|
|
const float2 x_51 = indexable[x_46];
|
2021-06-10 18:49:14 +00:00
|
|
|
const float2 x_52 = mul(x_51, float2x2((x_23[0u] + x_28[0u]), (x_23[1u] + x_28[1u])));
|
2021-06-24 22:37:48 +00:00
|
|
|
const tint_symbol_2 tint_symbol_8 = {float4(x_52.x, x_52.y, 0.0f, 1.0f)};
|
|
|
|
return tint_symbol_8;
|
2021-06-10 18:49:14 +00:00
|
|
|
}
|