mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-02 18:25:56 +00:00
Emit the "[loop]" attribute on "for" and "while" so that FXC does not attempt to unroll them. This is to work around an FXC bug where it fails to unroll loops with gradient operations. FXC ostensibly unrolls such loops because gradient operations require uniform control flow, and loops that have varying iterations may possibly not be uniform. Tint will eventually validate that control flow is indeed uniform, so forcing FXC to avoid unrolling in these cases should be fine. Bug: tint:1112 Change-Id: I10077f8b62fbbb230a0003f3864c75a8fe0e1d18 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/69880 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Antonio Maiorano <amaiorano@google.com>
48 lines
1.3 KiB
HLSL
48 lines
1.3 KiB
HLSL
struct tint_padded_array_element {
|
|
float2 el;
|
|
};
|
|
|
|
RWByteAddressBuffer ssbo : register(u0, space0);
|
|
|
|
float2x2 arr_to_mat2x2_stride_16(tint_padded_array_element arr[2]) {
|
|
return float2x2(arr[0u].el, arr[1u].el);
|
|
}
|
|
|
|
typedef tint_padded_array_element mat2x2_stride_16_to_arr_ret[2];
|
|
mat2x2_stride_16_to_arr_ret mat2x2_stride_16_to_arr(float2x2 mat) {
|
|
const tint_padded_array_element tint_symbol_4[2] = {{mat[0u]}, {mat[1u]}};
|
|
return tint_symbol_4;
|
|
}
|
|
|
|
typedef tint_padded_array_element tint_symbol_ret[2];
|
|
tint_symbol_ret tint_symbol(RWByteAddressBuffer buffer, uint offset) {
|
|
tint_padded_array_element arr_1[2] = (tint_padded_array_element[2])0;
|
|
{
|
|
[loop] for(uint i = 0u; (i < 2u); i = (i + 1u)) {
|
|
arr_1[i].el = asfloat(buffer.Load2((offset + (i * 16u))));
|
|
}
|
|
}
|
|
return arr_1;
|
|
}
|
|
|
|
void tint_symbol_2(RWByteAddressBuffer buffer, uint offset, tint_padded_array_element value[2]) {
|
|
tint_padded_array_element array[2] = value;
|
|
{
|
|
[loop] for(uint i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
|
|
buffer.Store2((offset + (i_1 * 16u)), asuint(array[i_1].el));
|
|
}
|
|
}
|
|
}
|
|
|
|
void f_1() {
|
|
const float2x2 x_15 = arr_to_mat2x2_stride_16(tint_symbol(ssbo, 0u));
|
|
tint_symbol_2(ssbo, 0u, mat2x2_stride_16_to_arr(x_15));
|
|
return;
|
|
}
|
|
|
|
[numthreads(1, 1, 1)]
|
|
void f() {
|
|
f_1();
|
|
return;
|
|
}
|