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:
Antonio Maiorano
2021-11-18 13:50:12 +00:00
committed by Tint LUCI CQ
parent 1704fe53f5
commit 11d09f2fe7
49 changed files with 117 additions and 110 deletions

View File

@@ -15,7 +15,7 @@ struct tint_symbol_2 {
void f_inner(uint local_invocation_index) {
{
for(uint idx = local_invocation_index; (idx < 64u); idx = (idx + 1u)) {
[loop] for(uint idx = local_invocation_index; (idx < 64u); idx = (idx + 1u)) {
const uint i = idx;
s.data[i] = 0;
}

View File

@@ -15,7 +15,7 @@ struct tint_symbol_2 {
void f_inner(uint local_invocation_index) {
{
for(uint idx = local_invocation_index; (idx < 64u); idx = (idx + 1u)) {
[loop] for(uint idx = local_invocation_index; (idx < 64u); idx = (idx + 1u)) {
const uint i = idx;
s.data[i] = 0;
}

View File

@@ -21,7 +21,7 @@ static bool2 v2b = bool2(false, false);
void foo() {
{
for(int i = 0; (i < 2); i = (i + 1)) {
[loop] for(int i = 0; (i < 2); i = (i + 1)) {
set_float2(v2f, i, 1.0f);
set_int3(v3i, i, 1);
set_uint4(v4u, i, 1u);
@@ -33,7 +33,7 @@ void foo() {
[numthreads(1, 1, 1)]
void main() {
{
for(int i = 0; (i < 2); i = (i + 1)) {
[loop] for(int i = 0; (i < 2); i = (i + 1)) {
foo();
}
}

View File

@@ -30,7 +30,7 @@ void foo() {
[numthreads(1, 1, 1)]
void main() {
{
for(int i = 0; (i < 2); i = (i + 1)) {
[loop] for(int i = 0; (i < 2); i = (i + 1)) {
foo();
}
}

View File

@@ -61,7 +61,7 @@ void main() {
bool3 v3b = bool3(false, false, false);
bool4 v4b = bool4(false, false, false, false);
{
for(int i = 0; (i < 2); i = (i + 1)) {
[loop] for(int i = 0; (i < 2); i = (i + 1)) {
set_float2(v2f, i, 1.0f);
set_float3(v3f, i, 1.0f);
set_float4(v4f, i, 1.0f);

View File

@@ -25,7 +25,7 @@ void main() {
bool2 v2b = bool2(false, false);
bool2 v2b_2 = bool2(false, false);
{
for(int i = 0; (i < 2); i = (i + 1)) {
[loop] for(int i = 0; (i < 2); i = (i + 1)) {
set_float2(v2f, i, 1.0f);
set_int3(v3i, i, 1);
set_uint4(v4u, i, 1u);

View File

@@ -61,7 +61,7 @@ void main() {
bool3 v3b = bool3(false, false, false);
bool4 v4b = bool4(false, false, false, false);
{
for(int i = 0; (i < 2); i = (i + 1)) {
[loop] for(int i = 0; (i < 2); i = (i + 1)) {
set_float2(v2f, i, 1.0f);
set_int2(v2i, i, 1);
set_uint2(v2u, i, 1u);