Add end-to-end test for tint:1112
I meant to add this to this CL:
https://dawn-review.googlesource.com/c/tint/+/69880
Bug: tint:1112
Change-Id: I7b5a3ab068ddbce1650a9e00609fed11e32db17d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/70320
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
new file mode 100644
index 0000000..b4dff54
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
@@ -0,0 +1,28 @@
+// 1112.wgsl
+[[group(0), binding(0)]] var Sampler: sampler;
+[[group(0), binding(1)]] var randomTexture: texture_2d<f32>;
+[[group(0), binding(2)]] var depthTexture: texture_2d<f32>;
+
+[[stage(fragment)]]
+fn main([[location(0)]] vUV : vec2<f32>) -> [[location(0)]] vec4<f32> {
+ let random: vec3<f32> = textureSample(randomTexture, Sampler, vUV).rgb;
+
+ var i = 0;
+ loop {
+ if (i < 1) {
+ } else {
+ break;
+ }
+ let offset : vec3<f32> = vec3<f32>(random.x);
+
+ if (offset.x < 0.0 || offset.y < 0.0 || offset.x > 1.0 || offset.y > 1.0) {
+ i = i + 1;
+ continue;
+ }
+
+ let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r;
+ i = i + 1;
+ }
+
+ return vec4<f32>(1.0);
+}
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl
new file mode 100644
index 0000000..4c8362a
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+SamplerState tint_symbol : register(s0, space0);
+Texture2D<float4> randomTexture : register(t1, space0);
+Texture2D<float4> depthTexture : register(t2, space0);
+
+struct tint_symbol_2 {
+ float2 vUV : TEXCOORD0;
+};
+struct tint_symbol_3 {
+ float4 value : SV_Target0;
+};
+
+float4 main_inner(float2 vUV) {
+ const float3 random = randomTexture.Sample(tint_symbol, vUV).rgb;
+ int i = 0;
+ [loop] while (true) {
+ if ((i < 1)) {
+ } else {
+ break;
+ }
+ const float3 offset = float3((random.x).xxx);
+ bool tint_tmp_2 = (offset.x < 0.0f);
+ if (!tint_tmp_2) {
+ tint_tmp_2 = (offset.y < 0.0f);
+ }
+ bool tint_tmp_1 = (tint_tmp_2);
+ if (!tint_tmp_1) {
+ tint_tmp_1 = (offset.x > 1.0f);
+ }
+ bool tint_tmp = (tint_tmp_1);
+ if (!tint_tmp) {
+ tint_tmp = (offset.y > 1.0f);
+ }
+ if ((tint_tmp)) {
+ i = (i + 1);
+ continue;
+ }
+ const float sampleDepth = depthTexture.Sample(tint_symbol, offset.xy).r;
+ i = (i + 1);
+ }
+ return float4((1.0f).xxxx);
+}
+
+tint_symbol_3 main(tint_symbol_2 tint_symbol_1) {
+ const float4 inner_result = main_inner(tint_symbol_1.vUV);
+ tint_symbol_3 wrapper_result = (tint_symbol_3)0;
+ wrapper_result.value = inner_result;
+ return wrapper_result;
+}
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl
new file mode 100644
index 0000000..7ac38ae
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl
@@ -0,0 +1,36 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_2 {
+ float2 vUV [[user(locn0)]];
+};
+struct tint_symbol_3 {
+ float4 value [[color(0)]];
+};
+
+float4 tint_symbol_inner(float2 vUV, texture2d<float, access::sample> tint_symbol_4, sampler tint_symbol_5, texture2d<float, access::sample> tint_symbol_6) {
+ float3 const random = float4(tint_symbol_4.sample(tint_symbol_5, vUV)).rgb;
+ int i = 0;
+ while (true) {
+ if ((i < 1)) {
+ } else {
+ break;
+ }
+ float3 const offset = float3(random[0]);
+ if (((((offset[0] < 0.0f) || (offset[1] < 0.0f)) || (offset[0] > 1.0f)) || (offset[1] > 1.0f))) {
+ i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
+ continue;
+ }
+ float const sampleDepth = tint_symbol_6.sample(tint_symbol_5, float3(offset).xy)[0];
+ i = as_type<int>((as_type<uint>(i) + as_type<uint>(1)));
+ }
+ return float4(1.0f);
+}
+
+fragment tint_symbol_3 tint_symbol(texture2d<float, access::sample> tint_symbol_7 [[texture(0)]], sampler tint_symbol_8 [[sampler(0)]], texture2d<float, access::sample> tint_symbol_9 [[texture(1)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+ float4 const inner_result = tint_symbol_inner(tint_symbol_1.vUV, tint_symbol_7, tint_symbol_8, tint_symbol_9);
+ tint_symbol_3 wrapper_result = {};
+ wrapper_result.value = inner_result;
+ return wrapper_result;
+}
+
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
new file mode 100644
index 0000000..49aff3b
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %vUV_1 %value
+ OpExecutionMode %main OriginUpperLeft
+ OpName %vUV_1 "vUV_1"
+ OpName %value "value"
+ OpName %Sampler "Sampler"
+ OpName %randomTexture "randomTexture"
+ OpName %depthTexture "depthTexture"
+ OpName %main_inner "main_inner"
+ OpName %vUV "vUV"
+ OpName %i "i"
+ OpName %main "main"
+ OpDecorate %vUV_1 Location 0
+ OpDecorate %value Location 0
+ OpDecorate %Sampler DescriptorSet 0
+ OpDecorate %Sampler Binding 0
+ OpDecorate %randomTexture DescriptorSet 0
+ OpDecorate %randomTexture Binding 1
+ OpDecorate %depthTexture DescriptorSet 0
+ OpDecorate %depthTexture Binding 2
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %vUV_1 = OpVariable %_ptr_Input_v2float Input
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %8 = OpConstantNull %v4float
+ %value = OpVariable %_ptr_Output_v4float Output %8
+ %11 = OpTypeSampler
+%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
+ %Sampler = OpVariable %_ptr_UniformConstant_11 UniformConstant
+ %14 = OpTypeImage %float 2D 0 0 0 1 Unknown
+%_ptr_UniformConstant_14 = OpTypePointer UniformConstant %14
+%randomTexture = OpVariable %_ptr_UniformConstant_14 UniformConstant
+%depthTexture = OpVariable %_ptr_UniformConstant_14 UniformConstant
+ %16 = OpTypeFunction %v4float %v2float
+ %23 = OpTypeSampledImage %14
+ %v3float = OpTypeVector %float 3
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+%_ptr_Function_int = OpTypePointer Function %int
+ %31 = OpConstantNull %int
+ %int_1 = OpConstant %int 1
+ %bool = OpTypeBool
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %76 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+ %void = OpTypeVoid
+ %77 = OpTypeFunction %void
+ %main_inner = OpFunction %v4float None %16
+ %vUV = OpFunctionParameter %v2float
+ %19 = OpLabel
+ %i = OpVariable %_ptr_Function_int Function %31
+ %21 = OpLoad %11 %Sampler
+ %22 = OpLoad %14 %randomTexture
+ %24 = OpSampledImage %23 %22 %21
+ %20 = OpImageSampleImplicitLod %v4float %24 %vUV
+ %26 = OpVectorShuffle %v3float %20 %20 0 1 2
+ OpStore %i %int_0
+ OpBranch %32
+ %32 = OpLabel
+ OpLoopMerge %33 %34 None
+ OpBranch %35
+ %35 = OpLabel
+ %36 = OpLoad %int %i
+ %38 = OpSLessThan %bool %36 %int_1
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %41 %42
+ %41 = OpLabel
+ OpBranch %40
+ %42 = OpLabel
+ OpBranch %33
+ %40 = OpLabel
+ %43 = OpCompositeExtract %float %26 0
+ %44 = OpCompositeConstruct %v3float %43 %43 %43
+ %45 = OpCompositeExtract %float %44 0
+ %47 = OpFOrdLessThan %bool %45 %float_0
+ OpSelectionMerge %48 None
+ OpBranchConditional %47 %48 %49
+ %49 = OpLabel
+ %50 = OpCompositeExtract %float %44 1
+ %51 = OpFOrdLessThan %bool %50 %float_0
+ OpBranch %48
+ %48 = OpLabel
+ %52 = OpPhi %bool %47 %40 %51 %49
+ OpSelectionMerge %53 None
+ OpBranchConditional %52 %53 %54
+ %54 = OpLabel
+ %55 = OpCompositeExtract %float %44 0
+ %57 = OpFOrdGreaterThan %bool %55 %float_1
+ OpBranch %53
+ %53 = OpLabel
+ %58 = OpPhi %bool %52 %48 %57 %54
+ OpSelectionMerge %59 None
+ OpBranchConditional %58 %59 %60
+ %60 = OpLabel
+ %61 = OpCompositeExtract %float %44 1
+ %62 = OpFOrdGreaterThan %bool %61 %float_1
+ OpBranch %59
+ %59 = OpLabel
+ %63 = OpPhi %bool %58 %53 %62 %60
+ OpSelectionMerge %64 None
+ OpBranchConditional %63 %65 %64
+ %65 = OpLabel
+ %66 = OpLoad %int %i
+ %67 = OpIAdd %int %66 %int_1
+ OpStore %i %67
+ OpBranch %34
+ %64 = OpLabel
+ %69 = OpLoad %11 %Sampler
+ %70 = OpLoad %14 %depthTexture
+ %71 = OpSampledImage %23 %70 %69
+ %72 = OpVectorShuffle %v2float %44 %44 0 1
+ %68 = OpImageSampleImplicitLod %v4float %71 %72
+ %73 = OpCompositeExtract %float %68 0
+ %74 = OpLoad %int %i
+ %75 = OpIAdd %int %74 %int_1
+ OpStore %i %75
+ OpBranch %34
+ %34 = OpLabel
+ OpBranch %32
+ %33 = OpLabel
+ OpReturnValue %76
+ OpFunctionEnd
+ %main = OpFunction %void None %77
+ %80 = OpLabel
+ %82 = OpLoad %v2float %vUV_1
+ %81 = OpFunctionCall %v4float %main_inner %82
+ OpStore %value %81
+ OpReturn
+ OpFunctionEnd
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
new file mode 100644
index 0000000..6728e4e
--- /dev/null
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+[[group(0), binding(0)]] var Sampler : sampler;
+
+[[group(0), binding(1)]] var randomTexture : texture_2d<f32>;
+
+[[group(0), binding(2)]] var depthTexture : texture_2d<f32>;
+
+[[stage(fragment)]]
+fn main([[location(0)]] vUV : vec2<f32>) -> [[location(0)]] vec4<f32> {
+ let random : vec3<f32> = textureSample(randomTexture, Sampler, vUV).rgb;
+ var i = 0;
+ loop {
+ if ((i < 1)) {
+ } else {
+ break;
+ }
+ let offset : vec3<f32> = vec3<f32>(random.x);
+ if (((((offset.x < 0.0) || (offset.y < 0.0)) || (offset.x > 1.0)) || (offset.y > 1.0))) {
+ i = (i + 1);
+ continue;
+ }
+ let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r;
+ i = (i + 1);
+ }
+ return vec4<f32>(1.0);
+}