mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-09 21:47:47 +00:00
HLSL: force FXC to never unroll loops
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>
This commit is contained in:
committed by
Tint LUCI CQ
parent
1704fe53f5
commit
11d09f2fe7
@@ -32,7 +32,7 @@ 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;
|
||||
{
|
||||
for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
||||
[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]);
|
||||
}
|
||||
@@ -44,7 +44,7 @@ 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;
|
||||
{
|
||||
for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
||||
[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))));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ 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;
|
||||
{
|
||||
for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
||||
[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]);
|
||||
}
|
||||
@@ -46,7 +46,7 @@ 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;
|
||||
{
|
||||
for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
||||
[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))));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ S ret_struct_arr() {
|
||||
void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, tint_padded_array_element value[4]) {
|
||||
tint_padded_array_element array[4] = value;
|
||||
{
|
||||
for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
||||
[loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
||||
buffer.Store((offset + (i * 16u)), asuint(array[i].el));
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,7 @@ typedef tint_padded_array_element tint_symbol_3_ret[4];
|
||||
tint_symbol_3_ret tint_symbol_3(uint4 buffer[4], uint offset) {
|
||||
tint_padded_array_element arr_1[4] = (tint_padded_array_element[4])0;
|
||||
{
|
||||
for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
||||
[loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
||||
const uint scalar_offset = ((offset + (i_1 * 16u))) / 4;
|
||||
arr_1[i_1].el = asint(buffer[scalar_offset / 4][scalar_offset % 4]);
|
||||
}
|
||||
@@ -55,7 +55,7 @@ typedef tint_padded_array_element tint_symbol_5_ret[4];
|
||||
tint_symbol_5_ret tint_symbol_5(RWByteAddressBuffer buffer, uint offset) {
|
||||
tint_padded_array_element arr_2[4] = (tint_padded_array_element[4])0;
|
||||
{
|
||||
for(uint i_2 = 0u; (i_2 < 4u); i_2 = (i_2 + 1u)) {
|
||||
[loop] for(uint i_2 = 0u; (i_2 < 4u); i_2 = (i_2 + 1u)) {
|
||||
arr_2[i_2].el = asint(buffer.Load((offset + (i_2 * 16u))));
|
||||
}
|
||||
}
|
||||
@@ -65,7 +65,7 @@ tint_symbol_5_ret tint_symbol_5(RWByteAddressBuffer buffer, uint offset) {
|
||||
void tint_symbol_9(RWByteAddressBuffer buffer, uint offset, int value[2]) {
|
||||
int array_3[2] = value;
|
||||
{
|
||||
for(uint i_3 = 0u; (i_3 < 2u); i_3 = (i_3 + 1u)) {
|
||||
[loop] for(uint i_3 = 0u; (i_3 < 2u); i_3 = (i_3 + 1u)) {
|
||||
buffer.Store((offset + (i_3 * 4u)), asuint(array_3[i_3]));
|
||||
}
|
||||
}
|
||||
@@ -74,7 +74,7 @@ void tint_symbol_9(RWByteAddressBuffer buffer, uint offset, int value[2]) {
|
||||
void tint_symbol_8(RWByteAddressBuffer buffer, uint offset, int value[3][2]) {
|
||||
int array_2[3][2] = value;
|
||||
{
|
||||
for(uint i_4 = 0u; (i_4 < 3u); i_4 = (i_4 + 1u)) {
|
||||
[loop] for(uint i_4 = 0u; (i_4 < 3u); i_4 = (i_4 + 1u)) {
|
||||
tint_symbol_9(buffer, (offset + (i_4 * 8u)), array_2[i_4]);
|
||||
}
|
||||
}
|
||||
@@ -83,7 +83,7 @@ void tint_symbol_8(RWByteAddressBuffer buffer, uint offset, int value[3][2]) {
|
||||
void tint_symbol_7(RWByteAddressBuffer buffer, uint offset, int value[4][3][2]) {
|
||||
int array_1[4][3][2] = value;
|
||||
{
|
||||
for(uint i_5 = 0u; (i_5 < 4u); i_5 = (i_5 + 1u)) {
|
||||
[loop] for(uint i_5 = 0u; (i_5 < 4u); i_5 = (i_5 + 1u)) {
|
||||
tint_symbol_8(buffer, (offset + (i_5 * 24u)), array_1[i_5]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ 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;
|
||||
{
|
||||
for(uint i = 0u; (i < 4u); i = (i + 1u)) {
|
||||
[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]);
|
||||
}
|
||||
@@ -46,7 +46,7 @@ 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;
|
||||
{
|
||||
for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) {
|
||||
[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))));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user