mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-13 19:01:24 +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>
73 lines
2.2 KiB
HLSL
73 lines
2.2 KiB
HLSL
[numthreads(1, 1, 1)]
|
|
void unused_entry_point() {
|
|
return;
|
|
}
|
|
|
|
struct tint_padded_array_element {
|
|
int el;
|
|
};
|
|
struct S {
|
|
tint_padded_array_element arr[4];
|
|
};
|
|
|
|
static tint_padded_array_element src_private[4] = (tint_padded_array_element[4])0;
|
|
groupshared tint_padded_array_element src_workgroup[4];
|
|
cbuffer cbuffer_src_uniform : register(b0, space0) {
|
|
uint4 src_uniform[4];
|
|
};
|
|
RWByteAddressBuffer src_storage : register(u1, space0);
|
|
groupshared tint_padded_array_element tint_symbol[4];
|
|
groupshared int dst_nested[4][3][2];
|
|
|
|
typedef tint_padded_array_element ret_arr_ret[4];
|
|
ret_arr_ret ret_arr() {
|
|
const tint_padded_array_element tint_symbol_5[4] = (tint_padded_array_element[4])0;
|
|
return tint_symbol_5;
|
|
}
|
|
|
|
S ret_struct_arr() {
|
|
const S tint_symbol_6 = (S)0;
|
|
return tint_symbol_6;
|
|
}
|
|
|
|
typedef tint_padded_array_element tint_symbol_1_ret[4];
|
|
tint_symbol_1_ret tint_symbol_1(uint4 buffer[4], uint offset) {
|
|
tint_padded_array_element arr_1[4] = (tint_padded_array_element[4])0;
|
|
{
|
|
[loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
|
const uint scalar_offset = ((offset + (i * 16u))) / 4;
|
|
arr_1[i].el = asint(buffer[scalar_offset / 4][scalar_offset % 4]);
|
|
}
|
|
}
|
|
return arr_1;
|
|
}
|
|
|
|
typedef tint_padded_array_element tint_symbol_3_ret[4];
|
|
tint_symbol_3_ret tint_symbol_3(RWByteAddressBuffer buffer, uint offset) {
|
|
tint_padded_array_element arr_2[4] = (tint_padded_array_element[4])0;
|
|
{
|
|
[loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
|
arr_2[i_1].el = asint(buffer.Load((offset + (i_1 * 16u))));
|
|
}
|
|
}
|
|
return arr_2;
|
|
}
|
|
|
|
void foo(tint_padded_array_element src_param[4]) {
|
|
tint_padded_array_element src_function[4] = (tint_padded_array_element[4])0;
|
|
const tint_padded_array_element tint_symbol_7[4] = {{1}, {2}, {3}, {3}};
|
|
tint_symbol = tint_symbol_7;
|
|
tint_symbol = src_param;
|
|
tint_symbol = ret_arr();
|
|
const tint_padded_array_element src_let[4] = (tint_padded_array_element[4])0;
|
|
tint_symbol = src_let;
|
|
tint_symbol = src_function;
|
|
tint_symbol = src_private;
|
|
tint_symbol = src_workgroup;
|
|
tint_symbol = ret_struct_arr().arr;
|
|
tint_symbol = tint_symbol_1(src_uniform, 0u);
|
|
tint_symbol = tint_symbol_3(src_storage, 0u);
|
|
int src_nested[4][3][2] = (int[4][3][2])0;
|
|
dst_nested = src_nested;
|
|
}
|