mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-16 12:21:35 +00:00
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>
49 lines
1.7 KiB
WebGPU Shading Language
49 lines
1.7 KiB
WebGPU Shading Language
[[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);
|
|
}
|
|
}
|