mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-09 13:38:00 +00:00
Implement FXC workaround for vector access in loops resulting in failed loop unrolling
When indexing into vectors in a loop, FXC sometimes fails to determine the max number of iterations when attempting to unroll the loop, resulting in "error X3511: forced to unroll loop, but unrolling failed.". We work around this by calling a function that sets the input value at the input index into an inout vector. This seems to nudge FXC enough for it to determine the number of loop iterations to unroll. Bug: tint:534 Change-Id: I52cb209be29fcad8fbb91283c7be8c6e22e00656 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56140 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Antonio Maiorano <amaiorano@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
53069b283d
commit
b293f51f83
48
test/bug/tint/534.wgsl
Normal file
48
test/bug/tint/534.wgsl
Normal file
@@ -0,0 +1,48 @@
|
||||
[[block]] struct Uniforms {
|
||||
dstTextureFlipY : u32;
|
||||
isFloat16 : u32;
|
||||
isRGB10A2Unorm : u32;
|
||||
channelCount : u32;
|
||||
};
|
||||
[[block]] struct OutputBuf {
|
||||
result : [[stride(4)]] array<u32>;
|
||||
};
|
||||
[[group(0), binding(0)]] var src : texture_2d<f32>;
|
||||
[[group(0), binding(1)]] var dst : texture_2d<f32>;
|
||||
[[group(0), binding(2)]] var<storage_buffer, read_write> output : OutputBuf;
|
||||
[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
|
||||
//[[builtin(global_invocation_id)]] var<in> GlobalInvocationID : vec3<u32>;
|
||||
// Fp16 logic
|
||||
// Infinity and NaN won't happen in this test case.
|
||||
fn ConvertToFp16FloatValue(fp32 : f32) -> u32 {
|
||||
return 1u;
|
||||
}
|
||||
|
||||
[[stage(compute), workgroup_size(1, 1, 1)]]
|
||||
fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
|
||||
var size : vec2<i32> = textureDimensions(src);
|
||||
var dstTexCoord : vec2<i32> = vec2<i32>(GlobalInvocationID.xy);
|
||||
var srcTexCoord : vec2<i32> = dstTexCoord;
|
||||
if (uniforms.dstTextureFlipY == 1u) {
|
||||
srcTexCoord.y = size.y - dstTexCoord.y - 1;
|
||||
}
|
||||
|
||||
var srcColor : vec4<f32> = textureLoad(src, srcTexCoord, 0);
|
||||
var dstColor : vec4<f32> = textureLoad(dst, dstTexCoord, 0);
|
||||
var success : bool = true;
|
||||
|
||||
var srcColorBits : vec4<u32>;
|
||||
var dstColorBits : vec4<u32> = vec4<u32>(dstColor);
|
||||
|
||||
for (var i : u32 = 0u; i < uniforms.channelCount; i = i + 1u) {
|
||||
srcColorBits[i] = ConvertToFp16FloatValue(srcColor[i]);
|
||||
success = success && (srcColorBits[i] == dstColorBits[i]);
|
||||
}
|
||||
|
||||
var outputIndex : u32 = GlobalInvocationID.y * u32(size.x) + GlobalInvocationID.x;
|
||||
if (success) {
|
||||
output.result[outputIndex] = u32(1);
|
||||
} else {
|
||||
output.result[outputIndex] = u32(0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user