Reland "Reland: [skslc] Generate .hlsl test output files"
Reland with fixed gni_exporter.go
Bug: skia:12691, skia:12352
Description of original change:
> This is a reland of a change originally reviewed on
> https://skia-review.googlesource.com/c/skia/+/482778.
>
> - The build now generates HLSL output when `skia_compile_sksl_tests` is
> enabled.
> - The "blend" and "shared" tests have been enabled for HLSL with the
> exception of 6 tests that exercise intrinsic inverse hyperbolic
> functions, which don't have HLSL equivalents.
>
> Bug: skia:12691, skia:12352
> Change-Id: I7188b75dcdec5edffe60004b283ba84e3ac16fc1
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/609218
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Arman Uguray <armansito@google.com>
Change-Id: I8b0b59a7d85303fee5bf5488b4e552af635473e0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/609698
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Arman Uguray <armansito@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 02fd884..f37264b 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -916,6 +916,12 @@
lang = "--metal"
settings = "--settings"
}
+ compile_sksl("hlsl_tests") {
+ sources = sksl_hlsl_tests_sources
+ outExtensions = [ ".hlsl" ]
+ lang = "--hlsl"
+ settings = "--settings"
+ }
compile_sksl("skvm_tests") {
sources = sksl_skvm_tests_sources
outExtensions = [ ".skvm" ]
@@ -947,6 +953,8 @@
}
group("compile_sksl_metal_tests") {
}
+ group("compile_sksl_hlsl_tests") {
+ }
group("compile_sksl_skvm_tests") {
}
group("compile_sksl_spirv_tests") {
diff --git a/bazel/exporter/gni_exporter.go b/bazel/exporter/gni_exporter.go
index 1238c0b..9d7dcb5 100644
--- a/bazel/exporter/gni_exporter.go
+++ b/bazel/exporter/gni_exporter.go
@@ -84,17 +84,22 @@
// The footer written to gn/sksl_tests.gni.
const skslTestsFooter = `sksl_glsl_tests_sources =
sksl_error_tests + sksl_glsl_tests + sksl_inliner_tests +
- sksl_folding_tests + sksl_shared_tests
+ sksl_folding_tests + sksl_shared_tests +
+ sksl_inverse_hyperbolic_intrinsics_tests
sksl_glsl_settings_tests_sources = sksl_blend_tests + sksl_settings_tests
sksl_metal_tests_sources =
- sksl_metal_tests + sksl_blend_tests + sksl_shared_tests
+ sksl_metal_tests + sksl_blend_tests + sksl_shared_tests +
+ sksl_inverse_hyperbolic_intrinsics_tests
+
+sksl_hlsl_tests_sources = sksl_blend_tests + sksl_shared_tests
sksl_wgsl_tests_sources = sksl_wgsl_tests
sksl_spirv_tests_sources =
- sksl_blend_tests + sksl_shared_tests + sksl_spirv_tests
+ sksl_blend_tests + sksl_shared_tests +
+ sksl_inverse_hyperbolic_intrinsics_tests + sksl_spirv_tests
sksl_skvm_tests_sources = sksl_rte_tests + sksl_rte_error_tests
diff --git a/bazel/exporter_tool/main.go b/bazel/exporter_tool/main.go
index 83aa508..a64f916 100644
--- a/bazel/exporter_tool/main.go
+++ b/bazel/exporter_tool/main.go
@@ -142,6 +142,8 @@
{Var: "sksl_metal_tests", Rules: []string{"//resources/sksl:sksl_metal_tests"}},
{Var: "sksl_spirv_tests", Rules: []string{"//resources/sksl:sksl_spirv_tests"}},
{Var: "sksl_wgsl_tests", Rules: []string{"//resources/sksl:sksl_wgsl_tests"}},
+ {Var: "sksl_inverse_hyperbolic_intrinsics_tests",
+ Rules: []string{"//resources/sksl:sksl_inverse_hyperbolic_intrinsics_tests"}},
{Var: "sksl_shared_tests", Rules: []string{"//resources/sksl:sksl_shared_tests"}},
{Var: "sksl_folding_tests", Rules: []string{"//resources/sksl:sksl_folding_tests"}},
{Var: "sksl_inliner_tests", Rules: []string{"//resources/sksl:sksl_inliner_tests"}},
diff --git a/gn/compile_sksl_tests.py b/gn/compile_sksl_tests.py
index 72f6ea8..be8573d 100755
--- a/gn/compile_sksl_tests.py
+++ b/gn/compile_sksl_tests.py
@@ -71,6 +71,10 @@
worklist.write(input + "\n")
worklist.write(target + ".metal\n")
worklist.write(settings + "\n\n")
+ elif lang == "--hlsl":
+ worklist.write(input + "\n")
+ worklist.write(target + ".hlsl\n")
+ worklist.write(settings + "\n\n")
elif lang == "--spirv":
worklist.write(input + "\n")
worklist.write(target + ".asm" + extensionForSpirvAsm(ext) + "\n")
@@ -88,7 +92,7 @@
worklist.write(target + ".wgsl\n")
worklist.write(settings + "\n\n")
else:
- sys.exit("### Expected one of: --glsl --metal --spirv --wgsl --skvm --stage --dsl, got " + lang)
+ sys.exit("### Expected one of: --glsl --metal --hlsl --spirv --wgsl --skvm --stage --dsl, got " + lang)
# Compile items one at a time.
if not batchCompile:
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index 7f91960..6fc8198 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -377,17 +377,20 @@
"wgsl/VertexPositionOutputIsAlwaysDeclared.vert",
]
+sksl_inverse_hyperbolic_intrinsics_tests = [
+ "intrinsics/Acosh.sksl",
+ "intrinsics/Asinh.sksl",
+ "intrinsics/Atanh.sksl",
+]
+
sksl_shared_tests = [
"intrinsics/AbsFloat.sksl",
"intrinsics/AbsInt.sksl",
"intrinsics/Acos.sksl",
- "intrinsics/Acosh.sksl",
"intrinsics/All.sksl",
"intrinsics/Any.sksl",
"intrinsics/Asin.sksl",
- "intrinsics/Asinh.sksl",
"intrinsics/Atan.sksl",
- "intrinsics/Atanh.sksl",
"intrinsics/BitCount.sksl",
"intrinsics/Ceil.sksl",
"intrinsics/ClampFloat.sksl",
@@ -838,17 +841,22 @@
sksl_glsl_tests_sources =
sksl_error_tests + sksl_glsl_tests + sksl_inliner_tests +
- sksl_folding_tests + sksl_shared_tests
+ sksl_folding_tests + sksl_shared_tests +
+ sksl_inverse_hyperbolic_intrinsics_tests
sksl_glsl_settings_tests_sources = sksl_blend_tests + sksl_settings_tests
sksl_metal_tests_sources =
- sksl_metal_tests + sksl_blend_tests + sksl_shared_tests
+ sksl_metal_tests + sksl_blend_tests + sksl_shared_tests +
+ sksl_inverse_hyperbolic_intrinsics_tests
+
+sksl_hlsl_tests_sources = sksl_blend_tests + sksl_shared_tests
sksl_wgsl_tests_sources = sksl_wgsl_tests
sksl_spirv_tests_sources =
- sksl_blend_tests + sksl_shared_tests + sksl_spirv_tests
+ sksl_blend_tests + sksl_shared_tests +
+ sksl_inverse_hyperbolic_intrinsics_tests + sksl_spirv_tests
sksl_skvm_tests_sources = sksl_rte_tests + sksl_rte_error_tests
diff --git a/resources/sksl/BUILD.bazel b/resources/sksl/BUILD.bazel
index 66467b5..8246984 100644
--- a/resources/sksl/BUILD.bazel
+++ b/resources/sksl/BUILD.bazel
@@ -20,6 +20,7 @@
":sksl_folding_tests",
":sksl_glsl_tests",
":sksl_inliner_tests",
+ ":sksl_inverse_hyperbolic_intrinsics_tests",
":sksl_shared_tests",
],
visibility = ["//tools/skslc:__pkg__"],
@@ -42,6 +43,7 @@
name = "sksl_metal_tests_sources",
srcs = [
":sksl_blend_tests",
+ ":sksl_inverse_hyperbolic_intrinsics_tests",
":sksl_metal_tests",
":sksl_shared_tests",
],
@@ -75,12 +77,24 @@
name = "sksl_spirv_tests_sources",
srcs = [
":sksl_blend_tests",
+ ":sksl_inverse_hyperbolic_intrinsics_tests",
":sksl_shared_tests",
":sksl_spirv_tests",
],
visibility = ["//tools/skslc:__pkg__"],
)
+# Tests in sksl_hlsl_tests_sources will be compiled with --settings on, and are expected to
+# generate a .hlsl output file.
+skia_filegroup(
+ name = "sksl_hlsl_tests_sources",
+ srcs = [
+ ":sksl_blend_tests",
+ ":sksl_shared_tests",
+ ],
+ visibility = ["//tools/skslc:__pkg__"],
+)
+
# Tests in sksl_wgsl_tests_sources will be compiled with --settings on, and are expected to generate
# a .wgsl output file.
# TODO(skia:13092): WGSL support is WIP and the test sources added here are copies of a subset of
@@ -670,19 +684,27 @@
],
)
+# TODO(skia:12352): HLSL doesn't support inverse hyperbolic functions as intrinsics. These tests are
+# grouped separately for HLSL tests until there is a reasonable workaround in place.
+skia_filegroup(
+ name = "sksl_inverse_hyperbolic_intrinsics_tests",
+ srcs = [
+ "intrinsics/Acosh.sksl",
+ "intrinsics/Asinh.sksl",
+ "intrinsics/Atanh.sksl",
+ ],
+)
+
skia_filegroup(
name = "sksl_shared_tests",
srcs = [
"intrinsics/AbsFloat.sksl",
"intrinsics/AbsInt.sksl",
"intrinsics/Acos.sksl",
- "intrinsics/Acosh.sksl",
"intrinsics/All.sksl",
"intrinsics/Any.sksl",
"intrinsics/Asin.sksl",
- "intrinsics/Asinh.sksl",
"intrinsics/Atan.sksl",
- "intrinsics/Atanh.sksl",
"intrinsics/BitCount.sksl",
"intrinsics/Ceil.sksl",
"intrinsics/ClampFloat.sksl",
diff --git a/tests/sksl/blend/BlendClear.hlsl b/tests/sksl/blend/BlendClear.hlsl
new file mode 100644
index 0000000..a412270
--- /dev/null
+++ b/tests/sksl/blend/BlendClear.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = 0.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendColor.hlsl b/tests/sksl/blend/BlendColor.hlsl
new file mode 100644
index 0000000..bdc90ad
--- /dev/null
+++ b/tests/sksl/blend/BlendColor.hlsl
@@ -0,0 +1,126 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _18_src : packoffset(c0);
+ float4 _18_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float blend_color_saturation_Qhh3(float3 _24)
+{
+ return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
+}
+
+float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
+{
+ float _57 = _49.w * _48.w;
+ float alpha = _57;
+ float3 _63 = _48.xyz * _49.w;
+ float3 sda = _63;
+ float3 _69 = _49.xyz * _48.w;
+ float3 dsa = _69;
+ float3 _74 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _74 = _69;
+ }
+ else
+ {
+ _74 = _63;
+ }
+ float3 l = _74;
+ float3 _83 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _83 = _63;
+ }
+ else
+ {
+ _83 = _69;
+ }
+ float3 r = _83;
+ if (_47.y != 0.0f)
+ {
+ float _94 = min(min(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
+ float _100 = max(max(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
+ float3 _103 = 0.0f.xxx;
+ if (_100 > _94)
+ {
+ float3 _109 = _83;
+ _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
+ }
+ else
+ {
+ _103 = 0.0f.xxx;
+ }
+ l = _103;
+ r = _69;
+ }
+ float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
+ float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
+ float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
+ float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
+ float _135 = _131.x;
+ float _136 = _131.y;
+ float _137 = _131.z;
+ float _133 = min(min(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
+ float _139 = max(max(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
+ bool _145 = false;
+ if (_133 < 0.0f)
+ {
+ _145 = _119 != _133;
+ }
+ else
+ {
+ _145 = false;
+ }
+ if (_145)
+ {
+ float3 _148 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
+ }
+ bool _160 = false;
+ if (_139 > _57)
+ {
+ _160 = _139 != _119;
+ }
+ else
+ {
+ _160 = false;
+ }
+ if (_160)
+ {
+ float3 _164 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
+ }
+ return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float2 _197 = 0.0f.xx;
+ float4 _203 = _18_src;
+ float4 _207 = _18_dst;
+ sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendColorBurn.hlsl b/tests/sksl/blend/BlendColorBurn.hlsl
new file mode 100644
index 0000000..4c09abf
--- /dev/null
+++ b/tests/sksl/blend/BlendColorBurn.hlsl
@@ -0,0 +1,56 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _17_src : packoffset(c0);
+ float4 _17_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float color_burn_component_Qhh2h2(float2 _23, float2 _24)
+{
+ if (_24.y == _24.x)
+ {
+ return ((_23.y * _24.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
+ }
+ else
+ {
+ if (_23.x == 0.0f)
+ {
+ return _24.x * (1.0f - _23.y);
+ }
+ else
+ {
+ float _68 = max(0.0f, _24.y - (((_24.y - _24.x) * _23.y) / (_23.x + _kGuardedDivideEpsilon)));
+ float delta = _68;
+ return ((_68 * _23.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
+ }
+ }
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float2 _111 = _17_src.xw;
+ float2 _116 = _17_dst.xw;
+ float2 _121 = _17_src.yw;
+ float2 _125 = _17_dst.yw;
+ float2 _130 = _17_src.zw;
+ float2 _134 = _17_dst.zw;
+ sk_FragColor = float4(color_burn_component_Qhh2h2(_111, _116), color_burn_component_Qhh2h2(_121, _125), color_burn_component_Qhh2h2(_130, _134), _17_src.w + ((1.0f - _17_src.w) * _17_dst.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendColorDodge.hlsl b/tests/sksl/blend/BlendColorDodge.hlsl
new file mode 100644
index 0000000..b2e25e5
--- /dev/null
+++ b/tests/sksl/blend/BlendColorDodge.hlsl
@@ -0,0 +1,58 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _17_src : packoffset(c0);
+ float4 _17_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float color_dodge_component_Qhh2h2(float2 _23, float2 _24)
+{
+ if (_24.x == 0.0f)
+ {
+ return _23.x * (1.0f - _24.y);
+ }
+ else
+ {
+ float _45 = _23.y - _23.x;
+ float delta = _45;
+ if (_45 == 0.0f)
+ {
+ return ((_23.y * _24.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
+ }
+ else
+ {
+ float _69 = min(_24.y, (_24.x * _23.y) / (_45 + _kGuardedDivideEpsilon));
+ delta = _69;
+ return ((_69 * _23.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
+ }
+ }
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float2 _106 = _17_src.xw;
+ float2 _111 = _17_dst.xw;
+ float2 _116 = _17_src.yw;
+ float2 _120 = _17_dst.yw;
+ float2 _125 = _17_src.zw;
+ float2 _129 = _17_dst.zw;
+ sk_FragColor = float4(color_dodge_component_Qhh2h2(_106, _111), color_dodge_component_Qhh2h2(_116, _120), color_dodge_component_Qhh2h2(_125, _129), _17_src.w + ((1.0f - _17_src.w) * _17_dst.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDarken.hlsl b/tests/sksl/blend/BlendDarken.hlsl
new file mode 100644
index 0000000..09ab9aa
--- /dev/null
+++ b/tests/sksl/blend/BlendDarken.hlsl
@@ -0,0 +1,34 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _32 = _10_src + (_10_dst * (1.0f - _10_src.w));
+ float4 _RESERVED_IDENTIFIER_FIXUP_0_a = _32;
+ float3 _47 = (_10_src.xyz * (1.0f - _10_dst.w)) + _10_dst.xyz;
+ float3 _RESERVED_IDENTIFIER_FIXUP_1_b = _47;
+ float3 _48 = min(_32.xyz, _47);
+ float4 _50 = _RESERVED_IDENTIFIER_FIXUP_0_a;
+ float4 _51 = float4(_48.x, _48.y, _48.z, _50.w);
+ _RESERVED_IDENTIFIER_FIXUP_0_a = _51;
+ sk_FragColor = _51;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDifference.hlsl b/tests/sksl/blend/BlendDifference.hlsl
new file mode 100644
index 0000000..c2296ec
--- /dev/null
+++ b/tests/sksl/blend/BlendDifference.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float4((_10_src.xyz + _10_dst.xyz) - (min(_10_src.xyz * _10_dst.w, _10_dst.xyz * _10_src.w) * 2.0f), _10_src.w + ((1.0f - _10_src.w) * _10_dst.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDst.hlsl b/tests/sksl/blend/BlendDst.hlsl
new file mode 100644
index 0000000..8f4b8a9
--- /dev/null
+++ b/tests/sksl/blend/BlendDst.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_dst;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDstAtop.hlsl b/tests/sksl/blend/BlendDstAtop.hlsl
new file mode 100644
index 0000000..733e26d
--- /dev/null
+++ b/tests/sksl/blend/BlendDstAtop.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = (_10_src * _10_dst.w) + (_10_dst * (1.0f - _10_src.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDstIn.hlsl b/tests/sksl/blend/BlendDstIn.hlsl
new file mode 100644
index 0000000..931b9db
--- /dev/null
+++ b/tests/sksl/blend/BlendDstIn.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_dst * _10_src.w;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDstOut.hlsl b/tests/sksl/blend/BlendDstOut.hlsl
new file mode 100644
index 0000000..6fba931
--- /dev/null
+++ b/tests/sksl/blend/BlendDstOut.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_dst * (1.0f - _10_src.w);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendDstOver.hlsl b/tests/sksl/blend/BlendDstOver.hlsl
new file mode 100644
index 0000000..614462b
--- /dev/null
+++ b/tests/sksl/blend/BlendDstOver.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = (_10_src * (1.0f - _10_dst.w)) + _10_dst;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendExclusion.hlsl b/tests/sksl/blend/BlendExclusion.hlsl
new file mode 100644
index 0000000..693850b
--- /dev/null
+++ b/tests/sksl/blend/BlendExclusion.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float4((_10_dst.xyz + _10_src.xyz) - ((_10_dst.xyz * 2.0f) * _10_src.xyz), _10_src.w + ((1.0f - _10_src.w) * _10_dst.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendHardLight.hlsl b/tests/sksl/blend/BlendHardLight.hlsl
new file mode 100644
index 0000000..00a9284
--- /dev/null
+++ b/tests/sksl/blend/BlendHardLight.hlsl
@@ -0,0 +1,59 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_src : packoffset(c0);
+ float4 _12_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float blend_overlay_component_Qhh2h2(float2 _18, float2 _19)
+{
+ float _28 = 0.0f;
+ if ((2.0f * _19.x) <= _19.y)
+ {
+ _28 = (2.0f * _18.x) * _19.x;
+ }
+ else
+ {
+ _28 = (_18.y * _19.y) - ((2.0f * (_19.y - _19.x)) * (_18.y - _18.x));
+ }
+ return _28;
+}
+
+float4 blend_overlay_h4h4h4(float4 _60, float4 _61)
+{
+ float2 _66 = _60.xw;
+ float2 _69 = _61.xw;
+ float2 _73 = _60.yw;
+ float2 _76 = _61.yw;
+ float2 _80 = _60.zw;
+ float2 _83 = _61.zw;
+ float4 result = float4(blend_overlay_component_Qhh2h2(_66, _69), blend_overlay_component_Qhh2h2(_73, _76), blend_overlay_component_Qhh2h2(_80, _83), _60.w + ((1.0f - _60.w) * _61.w));
+ float4 _96 = result;
+ float3 _112 = _96.xyz + ((_61.xyz * (1.0f - _60.w)) + (_60.xyz * (1.0f - _61.w)));
+ float4 _113 = result;
+ float4 _114 = float4(_112.x, _112.y, _112.z, _113.w);
+ result = _114;
+ return _114;
+}
+
+void frag_main()
+{
+ float4 _123 = _12_dst;
+ float4 _127 = _12_src;
+ sk_FragColor = blend_overlay_h4h4h4(_123, _127);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendHue.hlsl b/tests/sksl/blend/BlendHue.hlsl
new file mode 100644
index 0000000..67c4afd
--- /dev/null
+++ b/tests/sksl/blend/BlendHue.hlsl
@@ -0,0 +1,126 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _18_src : packoffset(c0);
+ float4 _18_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float blend_color_saturation_Qhh3(float3 _24)
+{
+ return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
+}
+
+float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
+{
+ float _57 = _49.w * _48.w;
+ float alpha = _57;
+ float3 _63 = _48.xyz * _49.w;
+ float3 sda = _63;
+ float3 _69 = _49.xyz * _48.w;
+ float3 dsa = _69;
+ float3 _74 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _74 = _69;
+ }
+ else
+ {
+ _74 = _63;
+ }
+ float3 l = _74;
+ float3 _83 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _83 = _63;
+ }
+ else
+ {
+ _83 = _69;
+ }
+ float3 r = _83;
+ if (_47.y != 0.0f)
+ {
+ float _94 = min(min(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
+ float _100 = max(max(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
+ float3 _103 = 0.0f.xxx;
+ if (_100 > _94)
+ {
+ float3 _109 = _83;
+ _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
+ }
+ else
+ {
+ _103 = 0.0f.xxx;
+ }
+ l = _103;
+ r = _69;
+ }
+ float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
+ float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
+ float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
+ float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
+ float _135 = _131.x;
+ float _136 = _131.y;
+ float _137 = _131.z;
+ float _133 = min(min(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
+ float _139 = max(max(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
+ bool _145 = false;
+ if (_133 < 0.0f)
+ {
+ _145 = _119 != _133;
+ }
+ else
+ {
+ _145 = false;
+ }
+ if (_145)
+ {
+ float3 _148 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
+ }
+ bool _160 = false;
+ if (_139 > _57)
+ {
+ _160 = _139 != _119;
+ }
+ else
+ {
+ _160 = false;
+ }
+ if (_160)
+ {
+ float3 _164 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
+ }
+ return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float2 _197 = float2(0.0f, 1.0f);
+ float4 _203 = _18_src;
+ float4 _207 = _18_dst;
+ sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendLighten.hlsl b/tests/sksl/blend/BlendLighten.hlsl
new file mode 100644
index 0000000..b6028f9
--- /dev/null
+++ b/tests/sksl/blend/BlendLighten.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _32 = _10_src + (_10_dst * (1.0f - _10_src.w));
+ float4 _RESERVED_IDENTIFIER_FIXUP_0_result = _32;
+ float3 _33 = max(_32.xyz, (_10_src.xyz * (1.0f - _10_dst.w)) + _10_dst.xyz);
+ float4 _48 = _RESERVED_IDENTIFIER_FIXUP_0_result;
+ float4 _49 = float4(_33.x, _33.y, _33.z, _48.w);
+ _RESERVED_IDENTIFIER_FIXUP_0_result = _49;
+ sk_FragColor = _49;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendLuminosity.hlsl b/tests/sksl/blend/BlendLuminosity.hlsl
new file mode 100644
index 0000000..f275e8e
--- /dev/null
+++ b/tests/sksl/blend/BlendLuminosity.hlsl
@@ -0,0 +1,126 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _18_src : packoffset(c0);
+ float4 _18_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float blend_color_saturation_Qhh3(float3 _24)
+{
+ return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
+}
+
+float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
+{
+ float _57 = _49.w * _48.w;
+ float alpha = _57;
+ float3 _63 = _48.xyz * _49.w;
+ float3 sda = _63;
+ float3 _69 = _49.xyz * _48.w;
+ float3 dsa = _69;
+ float3 _74 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _74 = _69;
+ }
+ else
+ {
+ _74 = _63;
+ }
+ float3 l = _74;
+ float3 _83 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _83 = _63;
+ }
+ else
+ {
+ _83 = _69;
+ }
+ float3 r = _83;
+ if (_47.y != 0.0f)
+ {
+ float _94 = min(min(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
+ float _100 = max(max(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
+ float3 _103 = 0.0f.xxx;
+ if (_100 > _94)
+ {
+ float3 _109 = _83;
+ _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
+ }
+ else
+ {
+ _103 = 0.0f.xxx;
+ }
+ l = _103;
+ r = _69;
+ }
+ float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
+ float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
+ float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
+ float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
+ float _135 = _131.x;
+ float _136 = _131.y;
+ float _137 = _131.z;
+ float _133 = min(min(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
+ float _139 = max(max(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
+ bool _145 = false;
+ if (_133 < 0.0f)
+ {
+ _145 = _119 != _133;
+ }
+ else
+ {
+ _145 = false;
+ }
+ if (_145)
+ {
+ float3 _148 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
+ }
+ bool _160 = false;
+ if (_139 > _57)
+ {
+ _160 = _139 != _119;
+ }
+ else
+ {
+ _160 = false;
+ }
+ if (_160)
+ {
+ float3 _164 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
+ }
+ return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float2 _197 = float2(1.0f, 0.0f);
+ float4 _203 = _18_src;
+ float4 _207 = _18_dst;
+ sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendModulate.hlsl b/tests/sksl/blend/BlendModulate.hlsl
new file mode 100644
index 0000000..e6c30f8
--- /dev/null
+++ b/tests/sksl/blend/BlendModulate.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_src * _10_dst;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendMultiply.hlsl b/tests/sksl/blend/BlendMultiply.hlsl
new file mode 100644
index 0000000..aa9116e
--- /dev/null
+++ b/tests/sksl/blend/BlendMultiply.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float4(((_10_dst.xyz * (1.0f - _10_src.w)) + (_10_src.xyz * (1.0f - _10_dst.w))) + (_10_src.xyz * _10_dst.xyz), _10_src.w + ((1.0f - _10_src.w) * _10_dst.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendOverlay.hlsl b/tests/sksl/blend/BlendOverlay.hlsl
new file mode 100644
index 0000000..982e987
--- /dev/null
+++ b/tests/sksl/blend/BlendOverlay.hlsl
@@ -0,0 +1,52 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_src : packoffset(c0);
+ float4 _11_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float blend_overlay_component_Qhh2h2(float2 _17, float2 _18)
+{
+ float _27 = 0.0f;
+ if ((2.0f * _18.x) <= _18.y)
+ {
+ _27 = (2.0f * _17.x) * _18.x;
+ }
+ else
+ {
+ _27 = (_17.y * _18.y) - ((2.0f * (_18.y - _18.x)) * (_17.y - _17.x));
+ }
+ return _27;
+}
+
+void frag_main()
+{
+ float2 _68 = _11_src.xw;
+ float2 _73 = _11_dst.xw;
+ float2 _78 = _11_src.yw;
+ float2 _82 = _11_dst.yw;
+ float2 _87 = _11_src.zw;
+ float2 _91 = _11_dst.zw;
+ float4 _RESERVED_IDENTIFIER_FIXUP_0_result = float4(blend_overlay_component_Qhh2h2(_68, _73), blend_overlay_component_Qhh2h2(_78, _82), blend_overlay_component_Qhh2h2(_87, _91), _11_src.w + ((1.0f - _11_src.w) * _11_dst.w));
+ float4 _107 = _RESERVED_IDENTIFIER_FIXUP_0_result;
+ float3 _127 = _107.xyz + ((_11_dst.xyz * (1.0f - _11_src.w)) + (_11_src.xyz * (1.0f - _11_dst.w)));
+ float4 _128 = _RESERVED_IDENTIFIER_FIXUP_0_result;
+ float4 _129 = float4(_127.x, _127.y, _127.z, _128.w);
+ _RESERVED_IDENTIFIER_FIXUP_0_result = _129;
+ sk_FragColor = _129;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendPlus.hlsl b/tests/sksl/blend/BlendPlus.hlsl
new file mode 100644
index 0000000..6cbdb71
--- /dev/null
+++ b/tests/sksl/blend/BlendPlus.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = min(_10_src + _10_dst, 1.0f.xxxx);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSaturation.hlsl b/tests/sksl/blend/BlendSaturation.hlsl
new file mode 100644
index 0000000..6cdaeae
--- /dev/null
+++ b/tests/sksl/blend/BlendSaturation.hlsl
@@ -0,0 +1,126 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _18_src : packoffset(c0);
+ float4 _18_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float blend_color_saturation_Qhh3(float3 _24)
+{
+ return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
+}
+
+float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
+{
+ float _57 = _49.w * _48.w;
+ float alpha = _57;
+ float3 _63 = _48.xyz * _49.w;
+ float3 sda = _63;
+ float3 _69 = _49.xyz * _48.w;
+ float3 dsa = _69;
+ float3 _74 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _74 = _69;
+ }
+ else
+ {
+ _74 = _63;
+ }
+ float3 l = _74;
+ float3 _83 = 0.0f.xxx;
+ if (_47.x != 0.0f)
+ {
+ _83 = _63;
+ }
+ else
+ {
+ _83 = _69;
+ }
+ float3 r = _83;
+ if (_47.y != 0.0f)
+ {
+ float _94 = min(min(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
+ float _100 = max(max(_74.x, _74.y), _74.z);
+ float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
+ float3 _103 = 0.0f.xxx;
+ if (_100 > _94)
+ {
+ float3 _109 = _83;
+ _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
+ }
+ else
+ {
+ _103 = 0.0f.xxx;
+ }
+ l = _103;
+ r = _69;
+ }
+ float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
+ float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
+ float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
+ float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
+ float _135 = _131.x;
+ float _136 = _131.y;
+ float _137 = _131.z;
+ float _133 = min(min(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
+ float _139 = max(max(_135, _136), _137);
+ float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
+ bool _145 = false;
+ if (_133 < 0.0f)
+ {
+ _145 = _119 != _133;
+ }
+ else
+ {
+ _145 = false;
+ }
+ if (_145)
+ {
+ float3 _148 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
+ }
+ bool _160 = false;
+ if (_139 > _57)
+ {
+ _160 = _139 != _119;
+ }
+ else
+ {
+ _160 = false;
+ }
+ if (_160)
+ {
+ float3 _164 = _119.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
+ }
+ return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float2 _197 = 1.0f.xx;
+ float4 _203 = _18_src;
+ float4 _207 = _18_dst;
+ sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendScreen.hlsl b/tests/sksl/blend/BlendScreen.hlsl
new file mode 100644
index 0000000..a27811c
--- /dev/null
+++ b/tests/sksl/blend/BlendScreen.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_src + ((1.0f.xxxx - _10_src) * _10_dst);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSoftLight.hlsl b/tests/sksl/blend/BlendSoftLight.hlsl
new file mode 100644
index 0000000..2d227cf
--- /dev/null
+++ b/tests/sksl/blend/BlendSoftLight.hlsl
@@ -0,0 +1,71 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _17_src : packoffset(c0);
+ float4 _17_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float _kGuardedDivideEpsilon = 0.0f;
+
+float soft_light_component_Qhh2h2(float2 _23, float2 _24)
+{
+ if ((2.0f * _23.x) <= _23.y)
+ {
+ return ((((_24.x * _24.x) * (_23.y - (2.0f * _23.x))) / (_24.y + _kGuardedDivideEpsilon)) + ((1.0f - _24.y) * _23.x)) + (_24.x * (((-_23.y) + (2.0f * _23.x)) + 1.0f));
+ }
+ else
+ {
+ if ((4.0f * _24.x) <= _24.y)
+ {
+ float _89 = _24.x * _24.x;
+ float DSqd = _89;
+ float _93 = _89 * _24.x;
+ float DCub = _93;
+ float _99 = _24.y * _24.y;
+ float DaSqd = _99;
+ float _103 = _99 * _24.y;
+ float DaCub = _103;
+ return ((((_99 * (_23.x - (_24.x * (((3.0f * _23.y) - (6.0f * _23.x)) - 1.0f)))) + (((12.0f * _24.y) * _89) * (_23.y - (2.0f * _23.x)))) - ((16.0f * _93) * (_23.y - (2.0f * _23.x)))) - (_103 * _23.x)) / (_99 + _kGuardedDivideEpsilon);
+ }
+ else
+ {
+ return (((_24.x * ((_23.y - (2.0f * _23.x)) + 1.0f)) + _23.x) - (sqrt(_24.y * _24.x) * (_23.y - (2.0f * _23.x)))) - (_24.y * _23.x);
+ }
+ }
+}
+
+void frag_main()
+{
+ _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
+ float4 _194 = 0.0f.xxxx;
+ if (_17_dst.w == 0.0f)
+ {
+ _194 = _17_src;
+ }
+ else
+ {
+ float2 _205 = _17_src.xw;
+ float2 _209 = _17_dst.xw;
+ float2 _214 = _17_src.yw;
+ float2 _218 = _17_dst.yw;
+ float2 _223 = _17_src.zw;
+ float2 _227 = _17_dst.zw;
+ _194 = float4(soft_light_component_Qhh2h2(_205, _209), soft_light_component_Qhh2h2(_214, _218), soft_light_component_Qhh2h2(_223, _227), _17_src.w + ((1.0f - _17_src.w) * _17_dst.w));
+ }
+ sk_FragColor = _194;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSrc.hlsl b/tests/sksl/blend/BlendSrc.hlsl
new file mode 100644
index 0000000..46b767c
--- /dev/null
+++ b/tests/sksl/blend/BlendSrc.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_src;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSrcAtop.hlsl b/tests/sksl/blend/BlendSrcAtop.hlsl
new file mode 100644
index 0000000..733e26d
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcAtop.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = (_10_src * _10_dst.w) + (_10_dst * (1.0f - _10_src.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSrcIn.hlsl b/tests/sksl/blend/BlendSrcIn.hlsl
new file mode 100644
index 0000000..d1f16bb
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcIn.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_src * _10_dst.w;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSrcOut.hlsl b/tests/sksl/blend/BlendSrcOut.hlsl
new file mode 100644
index 0000000..27894a8
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcOut.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_src * (1.0f - _10_dst.w);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendSrcOver.hlsl b/tests/sksl/blend/BlendSrcOver.hlsl
new file mode 100644
index 0000000..4ed9ba5
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcOver.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _10_src + (_10_dst * (1.0f - _10_src.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/blend/BlendXor.hlsl b/tests/sksl/blend/BlendXor.hlsl
new file mode 100644
index 0000000..37a93a5
--- /dev/null
+++ b/tests/sksl/blend/BlendXor.hlsl
@@ -0,0 +1,26 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_src : packoffset(c0);
+ float4 _10_dst : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = (_10_src * (1.0f - _10_dst.w)) + (_10_dst * (1.0f - _10_src.w));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/AbsFloat.hlsl b/tests/sksl/intrinsics/AbsFloat.hlsl
new file mode 100644
index 0000000..5de06af
--- /dev/null
+++ b/tests/sksl/intrinsics/AbsFloat.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(1.25f, 0.0f, 0.75f, 2.25f);
+ bool _51 = false;
+ if (abs(_10_testInputs.x) == 1.25f)
+ {
+ float2 _43 = abs(_10_testInputs.xy);
+ _51 = all(bool2(_43.x == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.x, _43.y == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _63 = false;
+ if (_51)
+ {
+ float3 _54 = abs(_10_testInputs.xyz);
+ _63 = all(bool3(_54.x == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.x, _54.y == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.y, _54.z == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _63 = false;
+ }
+ bool _72 = false;
+ if (_63)
+ {
+ float4 _66 = abs(_10_testInputs);
+ _72 = all(bool4(_66.x == float4(1.25f, 0.0f, 0.75f, 2.25f).x, _66.y == float4(1.25f, 0.0f, 0.75f, 2.25f).y, _66.z == float4(1.25f, 0.0f, 0.75f, 2.25f).z, _66.w == float4(1.25f, 0.0f, 0.75f, 2.25f).w));
+ }
+ else
+ {
+ _72 = false;
+ }
+ bool _76 = false;
+ if (_72)
+ {
+ _76 = true;
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = all(bool2(float2(1.25f, 0.0f).x == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.x, float2(1.25f, 0.0f).y == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.y));
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _90 = false;
+ if (_83)
+ {
+ _90 = all(bool3(float3(1.25f, 0.0f, 0.75f).x == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.x, float3(1.25f, 0.0f, 0.75f).y == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.y, float3(1.25f, 0.0f, 0.75f).z == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _90 = false;
+ }
+ bool _93 = false;
+ if (_90)
+ {
+ _93 = true;
+ }
+ else
+ {
+ _93 = false;
+ }
+ float4 _94 = 0.0f.xxxx;
+ if (_93)
+ {
+ _94 = _10_colorGreen;
+ }
+ else
+ {
+ _94 = _10_colorRed;
+ }
+ return _94;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/AbsInt.hlsl b/tests/sksl/intrinsics/AbsInt.hlsl
new file mode 100644
index 0000000..5ec6c91
--- /dev/null
+++ b/tests/sksl/intrinsics/AbsInt.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int4 expected = int4(1, 0, 0, 2);
+ bool _58 = false;
+ if (abs(int(_10_testInputs.x)) == 1)
+ {
+ int2 _44 = abs(int2(int(_10_testInputs.xy.x), int(_10_testInputs.xy.y)));
+ _58 = all(bool2(_44.x == int4(1, 0, 0, 2).xy.x, _44.y == int4(1, 0, 0, 2).xy.y));
+ }
+ else
+ {
+ _58 = false;
+ }
+ bool _78 = false;
+ if (_58)
+ {
+ int3 _61 = abs(int3(int(_10_testInputs.xyz.x), int(_10_testInputs.xyz.y), int(_10_testInputs.xyz.z)));
+ _78 = all(bool3(_61.x == int4(1, 0, 0, 2).xyz.x, _61.y == int4(1, 0, 0, 2).xyz.y, _61.z == int4(1, 0, 0, 2).xyz.z));
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _96 = false;
+ if (_78)
+ {
+ int4 _81 = abs(int4(int(_10_testInputs.x), int(_10_testInputs.y), int(_10_testInputs.z), int(_10_testInputs.w)));
+ _96 = all(bool4(_81.x == int4(1, 0, 0, 2).x, _81.y == int4(1, 0, 0, 2).y, _81.z == int4(1, 0, 0, 2).z, _81.w == int4(1, 0, 0, 2).w));
+ }
+ else
+ {
+ _96 = false;
+ }
+ bool _100 = false;
+ if (_96)
+ {
+ _100 = true;
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _107 = false;
+ if (_100)
+ {
+ _107 = all(bool2(int2(1, 0).x == int4(1, 0, 0, 2).xy.x, int2(1, 0).y == int4(1, 0, 0, 2).xy.y));
+ }
+ else
+ {
+ _107 = false;
+ }
+ bool _114 = false;
+ if (_107)
+ {
+ _114 = all(bool3(int3(1, 0, 0).x == int4(1, 0, 0, 2).xyz.x, int3(1, 0, 0).y == int4(1, 0, 0, 2).xyz.y, int3(1, 0, 0).z == int4(1, 0, 0, 2).xyz.z));
+ }
+ else
+ {
+ _114 = false;
+ }
+ bool _117 = false;
+ if (_114)
+ {
+ _117 = true;
+ }
+ else
+ {
+ _117 = false;
+ }
+ float4 _118 = 0.0f.xxxx;
+ if (_117)
+ {
+ _118 = _10_colorGreen;
+ }
+ else
+ {
+ _118 = _10_colorRed;
+ }
+ return _118;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Acos.hlsl b/tests/sksl/intrinsics/Acos.hlsl
new file mode 100644
index 0000000..b6a773a
--- /dev/null
+++ b/tests/sksl/intrinsics/Acos.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (acos(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = acos(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = acos(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = acos(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/All.hlsl b/tests/sksl/intrinsics/All.hlsl
new file mode 100644
index 0000000..d70cfa7
--- /dev/null
+++ b/tests/sksl/intrinsics/All.hlsl
@@ -0,0 +1,93 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputH4 : packoffset(c0);
+ float4 _10_expectedH4 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool4 _42 = bool4(_10_inputH4.x != 0.0f, _10_inputH4.y != 0.0f, _10_inputH4.z != 0.0f, _10_inputH4.w != 0.0f);
+ bool4 inputVal = _42;
+ bool4 _55 = bool4(_10_expectedH4.x != 0.0f, _10_expectedH4.y != 0.0f, _10_expectedH4.z != 0.0f, _10_expectedH4.w != 0.0f);
+ bool4 expected = _55;
+ bool _60 = _55.x;
+ bool _69 = false;
+ if (all(_42.xy) == _60)
+ {
+ _69 = all(_42.xyz) == _55.y;
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _75 = false;
+ if (_69)
+ {
+ _75 = all(_42) == _55.z;
+ }
+ else
+ {
+ _75 = false;
+ }
+ bool _78 = false;
+ if (_75)
+ {
+ _78 = _60;
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _83 = false;
+ if (_78)
+ {
+ _83 = false == _55.y;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _88 = false;
+ if (_83)
+ {
+ _88 = false == _55.z;
+ }
+ else
+ {
+ _88 = false;
+ }
+ float4 _89 = 0.0f.xxxx;
+ if (_88)
+ {
+ _89 = _10_colorGreen;
+ }
+ else
+ {
+ _89 = _10_colorRed;
+ }
+ return _89;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Any.hlsl b/tests/sksl/intrinsics/Any.hlsl
new file mode 100644
index 0000000..528a98d
--- /dev/null
+++ b/tests/sksl/intrinsics/Any.hlsl
@@ -0,0 +1,93 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputH4 : packoffset(c0);
+ float4 _10_expectedH4 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool4 _42 = bool4(_10_inputH4.x != 0.0f, _10_inputH4.y != 0.0f, _10_inputH4.z != 0.0f, _10_inputH4.w != 0.0f);
+ bool4 inputVal = _42;
+ bool4 _55 = bool4(_10_expectedH4.x != 0.0f, _10_expectedH4.y != 0.0f, _10_expectedH4.z != 0.0f, _10_expectedH4.w != 0.0f);
+ bool4 expected = _55;
+ bool _60 = _55.x;
+ bool _69 = false;
+ if (any(_42.xy) == _60)
+ {
+ _69 = any(_42.xyz) == _55.y;
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _75 = false;
+ if (_69)
+ {
+ _75 = any(_42) == _55.z;
+ }
+ else
+ {
+ _75 = false;
+ }
+ bool _79 = false;
+ if (_75)
+ {
+ _79 = false == _60;
+ }
+ else
+ {
+ _79 = false;
+ }
+ bool _83 = false;
+ if (_79)
+ {
+ _83 = _55.y;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _87 = false;
+ if (_83)
+ {
+ _87 = _55.z;
+ }
+ else
+ {
+ _87 = false;
+ }
+ float4 _88 = 0.0f.xxxx;
+ if (_87)
+ {
+ _88 = _10_colorGreen;
+ }
+ else
+ {
+ _88 = _10_colorRed;
+ }
+ return _88;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Asin.hlsl b/tests/sksl/intrinsics/Asin.hlsl
new file mode 100644
index 0000000..d2c89f8
--- /dev/null
+++ b/tests/sksl/intrinsics/Asin.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (asin(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = asin(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = asin(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = asin(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Atan.hlsl b/tests/sksl/intrinsics/Atan.hlsl
new file mode 100644
index 0000000..380448c
--- /dev/null
+++ b/tests/sksl/intrinsics/Atan.hlsl
@@ -0,0 +1,184 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (atan(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = atan(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = atan(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = atan(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ bool _120 = false;
+ if (_108)
+ {
+ _120 = atan2(_10_inputVal.x, 1.0f) == _10_expected.x;
+ }
+ else
+ {
+ _120 = false;
+ }
+ bool _133 = false;
+ if (_120)
+ {
+ float2 _123 = atan2(_10_inputVal.xy, 1.0f.xx);
+ _133 = all(bool2(_123.x == _10_expected.xy.x, _123.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _133 = false;
+ }
+ bool _146 = false;
+ if (_133)
+ {
+ float3 _136 = atan2(_10_inputVal.xyz, 1.0f.xxx);
+ _146 = all(bool3(_136.x == _10_expected.xyz.x, _136.y == _10_expected.xyz.y, _136.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _146 = false;
+ }
+ bool _157 = false;
+ if (_146)
+ {
+ float4 _149 = atan2(_10_inputVal, 1.0f.xxxx);
+ _157 = all(bool4(_149.x == _10_expected.x, _149.y == _10_expected.y, _149.z == _10_expected.z, _149.w == _10_expected.w));
+ }
+ else
+ {
+ _157 = false;
+ }
+ bool _164 = false;
+ if (_157)
+ {
+ _164 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _164 = false;
+ }
+ bool _172 = false;
+ if (_164)
+ {
+ _172 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _172 = false;
+ }
+ bool _180 = false;
+ if (_172)
+ {
+ _180 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _180 = false;
+ }
+ bool _187 = false;
+ if (_180)
+ {
+ _187 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _187 = false;
+ }
+ float4 _188 = 0.0f.xxxx;
+ if (_187)
+ {
+ _188 = _10_colorGreen;
+ }
+ else
+ {
+ _188 = _10_colorRed;
+ }
+ return _188;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/BitCount.hlsl b/tests/sksl/intrinsics/BitCount.hlsl
new file mode 100644
index 0000000..f23ca4e
--- /dev/null
+++ b/tests/sksl/intrinsics/BitCount.hlsl
@@ -0,0 +1,27 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ int _10_a : packoffset(c0);
+ uint _10_b : packoffset(c0.y);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor.x = float(countbits(_10_a));
+ sk_FragColor.y = float(int(countbits(_10_b)));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Ceil.hlsl b/tests/sksl/intrinsics/Ceil.hlsl
new file mode 100644
index 0000000..2a6f3ce
--- /dev/null
+++ b/tests/sksl/intrinsics/Ceil.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(-1.0f, 0.0f, 1.0f, 3.0f);
+ bool _51 = false;
+ if (ceil(_10_testInputs.x) == (-1.0f))
+ {
+ float2 _43 = ceil(_10_testInputs.xy);
+ _51 = all(bool2(_43.x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.x, _43.y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _63 = false;
+ if (_51)
+ {
+ float3 _54 = ceil(_10_testInputs.xyz);
+ _63 = all(bool3(_54.x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.x, _54.y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.y, _54.z == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.z));
+ }
+ else
+ {
+ _63 = false;
+ }
+ bool _72 = false;
+ if (_63)
+ {
+ float4 _66 = ceil(_10_testInputs);
+ _72 = all(bool4(_66.x == float4(-1.0f, 0.0f, 1.0f, 3.0f).x, _66.y == float4(-1.0f, 0.0f, 1.0f, 3.0f).y, _66.z == float4(-1.0f, 0.0f, 1.0f, 3.0f).z, _66.w == float4(-1.0f, 0.0f, 1.0f, 3.0f).w));
+ }
+ else
+ {
+ _72 = false;
+ }
+ bool _76 = false;
+ if (_72)
+ {
+ _76 = true;
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.y));
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _90 = false;
+ if (_83)
+ {
+ _90 = all(bool3(float3(-1.0f, 0.0f, 1.0f).x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.x, float3(-1.0f, 0.0f, 1.0f).y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.y, float3(-1.0f, 0.0f, 1.0f).z == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.z));
+ }
+ else
+ {
+ _90 = false;
+ }
+ bool _93 = false;
+ if (_90)
+ {
+ _93 = true;
+ }
+ else
+ {
+ _93 = false;
+ }
+ float4 _94 = 0.0f.xxxx;
+ if (_93)
+ {
+ _94 = _10_colorGreen;
+ }
+ else
+ {
+ _94 = _10_colorRed;
+ }
+ return _94;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/ClampFloat.hlsl b/tests/sksl/intrinsics/ClampFloat.hlsl
new file mode 100644
index 0000000..356b721
--- /dev/null
+++ b/tests/sksl/intrinsics/ClampFloat.hlsl
@@ -0,0 +1,185 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedA = float4(-1.0f, 0.0f, 0.75f, 1.0f);
+ float4 expectedB = float4(-1.0f, 0.0f, 0.5f, 2.25f);
+ bool _57 = false;
+ if (clamp(_10_testInputs.x, -1.0f, 1.0f) == (-1.0f))
+ {
+ float2 _47 = clamp(_10_testInputs.xy, (-1.0f).xx, 1.0f.xx);
+ _57 = all(bool2(_47.x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.x, _47.y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.y));
+ }
+ else
+ {
+ _57 = false;
+ }
+ bool _71 = false;
+ if (_57)
+ {
+ float3 _60 = clamp(_10_testInputs.xyz, (-1.0f).xxx, 1.0f.xxx);
+ _71 = all(bool3(_60.x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.x, _60.y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.y, _60.z == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _82 = false;
+ if (_71)
+ {
+ float4 _74 = clamp(_10_testInputs, (-1.0f).xxxx, 1.0f.xxxx);
+ _82 = all(bool4(_74.x == float4(-1.0f, 0.0f, 0.75f, 1.0f).x, _74.y == float4(-1.0f, 0.0f, 0.75f, 1.0f).y, _74.z == float4(-1.0f, 0.0f, 0.75f, 1.0f).z, _74.w == float4(-1.0f, 0.0f, 0.75f, 1.0f).w));
+ }
+ else
+ {
+ _82 = false;
+ }
+ bool _90 = false;
+ if (_82)
+ {
+ _90 = clamp(_10_testInputs.x, -1.0f, 1.0f) == (-1.0f);
+ }
+ else
+ {
+ _90 = false;
+ }
+ bool _104 = false;
+ if (_90)
+ {
+ float2 _93 = clamp(_10_testInputs.xy, float2(-1.0f, -2.0f), float2(1.0f, 2.0f));
+ _104 = all(bool2(_93.x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.x, _93.y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.y));
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _116 = false;
+ if (_104)
+ {
+ float3 _107 = clamp(_10_testInputs.xyz, float3(-1.0f, -2.0f, -2.0f), float3(1.0f, 2.0f, 0.5f));
+ _116 = all(bool3(_107.x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.x, _107.y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.y, _107.z == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _116 = false;
+ }
+ bool _127 = false;
+ if (_116)
+ {
+ float4 _119 = clamp(_10_testInputs, float4(-1.0f, -2.0f, -2.0f, 1.0f), float4(1.0f, 2.0f, 0.5f, 3.0f));
+ _127 = all(bool4(_119.x == float4(-1.0f, 0.0f, 0.5f, 2.25f).x, _119.y == float4(-1.0f, 0.0f, 0.5f, 2.25f).y, _119.z == float4(-1.0f, 0.0f, 0.5f, 2.25f).z, _119.w == float4(-1.0f, 0.0f, 0.5f, 2.25f).w));
+ }
+ else
+ {
+ _127 = false;
+ }
+ bool _131 = false;
+ if (_127)
+ {
+ _131 = true;
+ }
+ else
+ {
+ _131 = false;
+ }
+ bool _138 = false;
+ if (_131)
+ {
+ _138 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.y));
+ }
+ else
+ {
+ _138 = false;
+ }
+ bool _145 = false;
+ if (_138)
+ {
+ _145 = all(bool3(float3(-1.0f, 0.0f, 0.75f).x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.x, float3(-1.0f, 0.0f, 0.75f).y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.y, float3(-1.0f, 0.0f, 0.75f).z == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _145 = false;
+ }
+ bool _148 = false;
+ if (_145)
+ {
+ _148 = true;
+ }
+ else
+ {
+ _148 = false;
+ }
+ bool _151 = false;
+ if (_148)
+ {
+ _151 = true;
+ }
+ else
+ {
+ _151 = false;
+ }
+ bool _157 = false;
+ if (_151)
+ {
+ _157 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.y));
+ }
+ else
+ {
+ _157 = false;
+ }
+ bool _164 = false;
+ if (_157)
+ {
+ _164 = all(bool3(float3(-1.0f, 0.0f, 0.5f).x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.x, float3(-1.0f, 0.0f, 0.5f).y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.y, float3(-1.0f, 0.0f, 0.5f).z == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _164 = false;
+ }
+ bool _167 = false;
+ if (_164)
+ {
+ _167 = true;
+ }
+ else
+ {
+ _167 = false;
+ }
+ float4 _168 = 0.0f.xxxx;
+ if (_167)
+ {
+ _168 = _10_colorGreen;
+ }
+ else
+ {
+ _168 = _10_colorRed;
+ }
+ return _168;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/ClampInt.hlsl b/tests/sksl/intrinsics/ClampInt.hlsl
new file mode 100644
index 0000000..a771d42
--- /dev/null
+++ b/tests/sksl/intrinsics/ClampInt.hlsl
@@ -0,0 +1,189 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _35 = _10_testInputs * 100.0f;
+ int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
+ int4 intValues = _44;
+ int4 expectedA = int4(-100, 0, 75, 100);
+ int4 expectedB = int4(-100, 0, 50, 225);
+ int _56 = _44.x;
+ bool _69 = false;
+ if (clamp(_56, -100, 100) == (-100))
+ {
+ int2 _60 = clamp(_44.xy, int2(-100, -100), int2(100, 100));
+ _69 = all(bool2(_60.x == int4(-100, 0, 75, 100).xy.x, _60.y == int4(-100, 0, 75, 100).xy.y));
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _81 = false;
+ if (_69)
+ {
+ int3 _72 = clamp(_44.xyz, int3(-100, -100, -100), int3(100, 100, 100));
+ _81 = all(bool3(_72.x == int4(-100, 0, 75, 100).xyz.x, _72.y == int4(-100, 0, 75, 100).xyz.y, _72.z == int4(-100, 0, 75, 100).xyz.z));
+ }
+ else
+ {
+ _81 = false;
+ }
+ bool _90 = false;
+ if (_81)
+ {
+ int4 _84 = clamp(_44, int4(-100, -100, -100, -100), int4(100, 100, 100, 100));
+ _90 = all(bool4(_84.x == int4(-100, 0, 75, 100).x, _84.y == int4(-100, 0, 75, 100).y, _84.z == int4(-100, 0, 75, 100).z, _84.w == int4(-100, 0, 75, 100).w));
+ }
+ else
+ {
+ _90 = false;
+ }
+ bool _94 = false;
+ if (_90)
+ {
+ _94 = true;
+ }
+ else
+ {
+ _94 = false;
+ }
+ bool _101 = false;
+ if (_94)
+ {
+ _101 = all(bool2(int2(-100, 0).x == int4(-100, 0, 75, 100).xy.x, int2(-100, 0).y == int4(-100, 0, 75, 100).xy.y));
+ }
+ else
+ {
+ _101 = false;
+ }
+ bool _108 = false;
+ if (_101)
+ {
+ _108 = all(bool3(int3(-100, 0, 75).x == int4(-100, 0, 75, 100).xyz.x, int3(-100, 0, 75).y == int4(-100, 0, 75, 100).xyz.y, int3(-100, 0, 75).z == int4(-100, 0, 75, 100).xyz.z));
+ }
+ else
+ {
+ _108 = false;
+ }
+ bool _111 = false;
+ if (_108)
+ {
+ _111 = true;
+ }
+ else
+ {
+ _111 = false;
+ }
+ bool _116 = false;
+ if (_111)
+ {
+ _116 = clamp(_56, -100, 100) == (-100);
+ }
+ else
+ {
+ _116 = false;
+ }
+ bool _128 = false;
+ if (_116)
+ {
+ int2 _119 = clamp(_44.xy, int2(-100, -200), int2(100, 200));
+ _128 = all(bool2(_119.x == int4(-100, 0, 50, 225).xy.x, _119.y == int4(-100, 0, 50, 225).xy.y));
+ }
+ else
+ {
+ _128 = false;
+ }
+ bool _138 = false;
+ if (_128)
+ {
+ int3 _131 = clamp(_44.xyz, int3(-100, -200, -200), int3(100, 200, 50));
+ _138 = all(bool3(_131.x == int4(-100, 0, 50, 225).xyz.x, _131.y == int4(-100, 0, 50, 225).xyz.y, _131.z == int4(-100, 0, 50, 225).xyz.z));
+ }
+ else
+ {
+ _138 = false;
+ }
+ bool _147 = false;
+ if (_138)
+ {
+ int4 _141 = clamp(_44, int4(-100, -200, -200, 100), int4(100, 200, 50, 300));
+ _147 = all(bool4(_141.x == int4(-100, 0, 50, 225).x, _141.y == int4(-100, 0, 50, 225).y, _141.z == int4(-100, 0, 50, 225).z, _141.w == int4(-100, 0, 50, 225).w));
+ }
+ else
+ {
+ _147 = false;
+ }
+ bool _150 = false;
+ if (_147)
+ {
+ _150 = true;
+ }
+ else
+ {
+ _150 = false;
+ }
+ bool _156 = false;
+ if (_150)
+ {
+ _156 = all(bool2(int2(-100, 0).x == int4(-100, 0, 50, 225).xy.x, int2(-100, 0).y == int4(-100, 0, 50, 225).xy.y));
+ }
+ else
+ {
+ _156 = false;
+ }
+ bool _163 = false;
+ if (_156)
+ {
+ _163 = all(bool3(int3(-100, 0, 50).x == int4(-100, 0, 50, 225).xyz.x, int3(-100, 0, 50).y == int4(-100, 0, 50, 225).xyz.y, int3(-100, 0, 50).z == int4(-100, 0, 50, 225).xyz.z));
+ }
+ else
+ {
+ _163 = false;
+ }
+ bool _166 = false;
+ if (_163)
+ {
+ _166 = true;
+ }
+ else
+ {
+ _166 = false;
+ }
+ float4 _167 = 0.0f.xxxx;
+ if (_166)
+ {
+ _167 = _10_colorGreen;
+ }
+ else
+ {
+ _167 = _10_colorRed;
+ }
+ return _167;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/ClampUInt.hlsl b/tests/sksl/intrinsics/ClampUInt.hlsl
new file mode 100644
index 0000000..5cdf90b
--- /dev/null
+++ b/tests/sksl/intrinsics/ClampUInt.hlsl
@@ -0,0 +1,189 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _39 = (_10_testInputs * 100.0f) + 200.0f.xxxx;
+ uint4 _48 = uint4(uint(_39.x), uint(_39.y), uint(_39.z), uint(_39.w));
+ uint4 uintValues = _48;
+ uint4 expectedA = uint4(100u, 200u, 275u, 300u);
+ uint4 expectedB = uint4(100u, 200u, 250u, 425u);
+ uint _61 = _48.x;
+ bool _74 = false;
+ if (clamp(_61, 100u, 300u) == 100u)
+ {
+ uint2 _65 = clamp(_48.xy, uint2(100u, 100u), uint2(300u, 300u));
+ _74 = all(bool2(_65.x == uint4(100u, 200u, 275u, 300u).xy.x, _65.y == uint4(100u, 200u, 275u, 300u).xy.y));
+ }
+ else
+ {
+ _74 = false;
+ }
+ bool _86 = false;
+ if (_74)
+ {
+ uint3 _77 = clamp(_48.xyz, uint3(100u, 100u, 100u), uint3(300u, 300u, 300u));
+ _86 = all(bool3(_77.x == uint4(100u, 200u, 275u, 300u).xyz.x, _77.y == uint4(100u, 200u, 275u, 300u).xyz.y, _77.z == uint4(100u, 200u, 275u, 300u).xyz.z));
+ }
+ else
+ {
+ _86 = false;
+ }
+ bool _95 = false;
+ if (_86)
+ {
+ uint4 _89 = clamp(_48, uint4(100u, 100u, 100u, 100u), uint4(300u, 300u, 300u, 300u));
+ _95 = all(bool4(_89.x == uint4(100u, 200u, 275u, 300u).x, _89.y == uint4(100u, 200u, 275u, 300u).y, _89.z == uint4(100u, 200u, 275u, 300u).z, _89.w == uint4(100u, 200u, 275u, 300u).w));
+ }
+ else
+ {
+ _95 = false;
+ }
+ bool _99 = false;
+ if (_95)
+ {
+ _99 = true;
+ }
+ else
+ {
+ _99 = false;
+ }
+ bool _106 = false;
+ if (_99)
+ {
+ _106 = all(bool2(uint2(100u, 200u).x == uint4(100u, 200u, 275u, 300u).xy.x, uint2(100u, 200u).y == uint4(100u, 200u, 275u, 300u).xy.y));
+ }
+ else
+ {
+ _106 = false;
+ }
+ bool _113 = false;
+ if (_106)
+ {
+ _113 = all(bool3(uint3(100u, 200u, 275u).x == uint4(100u, 200u, 275u, 300u).xyz.x, uint3(100u, 200u, 275u).y == uint4(100u, 200u, 275u, 300u).xyz.y, uint3(100u, 200u, 275u).z == uint4(100u, 200u, 275u, 300u).xyz.z));
+ }
+ else
+ {
+ _113 = false;
+ }
+ bool _116 = false;
+ if (_113)
+ {
+ _116 = true;
+ }
+ else
+ {
+ _116 = false;
+ }
+ bool _121 = false;
+ if (_116)
+ {
+ _121 = clamp(_61, 100u, 300u) == 100u;
+ }
+ else
+ {
+ _121 = false;
+ }
+ bool _133 = false;
+ if (_121)
+ {
+ uint2 _124 = clamp(_48.xy, uint2(100u, 0u), uint2(300u, 400u));
+ _133 = all(bool2(_124.x == uint4(100u, 200u, 250u, 425u).xy.x, _124.y == uint4(100u, 200u, 250u, 425u).xy.y));
+ }
+ else
+ {
+ _133 = false;
+ }
+ bool _143 = false;
+ if (_133)
+ {
+ uint3 _136 = clamp(_48.xyz, uint3(100u, 0u, 0u), uint3(300u, 400u, 250u));
+ _143 = all(bool3(_136.x == uint4(100u, 200u, 250u, 425u).xyz.x, _136.y == uint4(100u, 200u, 250u, 425u).xyz.y, _136.z == uint4(100u, 200u, 250u, 425u).xyz.z));
+ }
+ else
+ {
+ _143 = false;
+ }
+ bool _152 = false;
+ if (_143)
+ {
+ uint4 _146 = clamp(_48, uint4(100u, 0u, 0u, 300u), uint4(300u, 400u, 250u, 500u));
+ _152 = all(bool4(_146.x == uint4(100u, 200u, 250u, 425u).x, _146.y == uint4(100u, 200u, 250u, 425u).y, _146.z == uint4(100u, 200u, 250u, 425u).z, _146.w == uint4(100u, 200u, 250u, 425u).w));
+ }
+ else
+ {
+ _152 = false;
+ }
+ bool _155 = false;
+ if (_152)
+ {
+ _155 = true;
+ }
+ else
+ {
+ _155 = false;
+ }
+ bool _161 = false;
+ if (_155)
+ {
+ _161 = all(bool2(uint2(100u, 200u).x == uint4(100u, 200u, 250u, 425u).xy.x, uint2(100u, 200u).y == uint4(100u, 200u, 250u, 425u).xy.y));
+ }
+ else
+ {
+ _161 = false;
+ }
+ bool _168 = false;
+ if (_161)
+ {
+ _168 = all(bool3(uint3(100u, 200u, 250u).x == uint4(100u, 200u, 250u, 425u).xyz.x, uint3(100u, 200u, 250u).y == uint4(100u, 200u, 250u, 425u).xyz.y, uint3(100u, 200u, 250u).z == uint4(100u, 200u, 250u, 425u).xyz.z));
+ }
+ else
+ {
+ _168 = false;
+ }
+ bool _171 = false;
+ if (_168)
+ {
+ _171 = true;
+ }
+ else
+ {
+ _171 = false;
+ }
+ float4 _172 = 0.0f.xxxx;
+ if (_171)
+ {
+ _172 = _10_colorGreen;
+ }
+ else
+ {
+ _172 = _10_colorRed;
+ }
+ return _172;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Cos.hlsl b/tests/sksl/intrinsics/Cos.hlsl
new file mode 100644
index 0000000..dd74512
--- /dev/null
+++ b/tests/sksl/intrinsics/Cos.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (cos(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = cos(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = cos(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = cos(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 1.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _93 = false;
+ if (_84)
+ {
+ _93 = all(bool2(1.0f.xx.x == _10_expected.xy.x, 1.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _102 = false;
+ if (_93)
+ {
+ _102 = all(bool3(1.0f.xxx.x == _10_expected.xyz.x, 1.0f.xxx.y == _10_expected.xyz.y, 1.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _102 = false;
+ }
+ bool _110 = false;
+ if (_102)
+ {
+ _110 = all(bool4(1.0f.xxxx.x == _10_expected.x, 1.0f.xxxx.y == _10_expected.y, 1.0f.xxxx.z == _10_expected.z, 1.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _110 = false;
+ }
+ float4 _111 = 0.0f.xxxx;
+ if (_110)
+ {
+ _111 = _10_colorGreen;
+ }
+ else
+ {
+ _111 = _10_colorRed;
+ }
+ return _111;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Cosh.hlsl b/tests/sksl/intrinsics/Cosh.hlsl
new file mode 100644
index 0000000..69c9582
--- /dev/null
+++ b/tests/sksl/intrinsics/Cosh.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (cosh(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = cosh(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = cosh(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = cosh(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 1.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _93 = false;
+ if (_84)
+ {
+ _93 = all(bool2(1.0f.xx.x == _10_expected.xy.x, 1.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _102 = false;
+ if (_93)
+ {
+ _102 = all(bool3(1.0f.xxx.x == _10_expected.xyz.x, 1.0f.xxx.y == _10_expected.xyz.y, 1.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _102 = false;
+ }
+ bool _110 = false;
+ if (_102)
+ {
+ _110 = all(bool4(1.0f.xxxx.x == _10_expected.x, 1.0f.xxxx.y == _10_expected.y, 1.0f.xxxx.z == _10_expected.z, 1.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _110 = false;
+ }
+ float4 _111 = 0.0f.xxxx;
+ if (_110)
+ {
+ _111 = _10_colorGreen;
+ }
+ else
+ {
+ _111 = _10_colorRed;
+ }
+ return _111;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Cross.hlsl b/tests/sksl/intrinsics/Cross.hlsl
new file mode 100644
index 0000000..7689c2c
--- /dev/null
+++ b/tests/sksl/intrinsics/Cross.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float2 _10_ah : packoffset(c0);
+ float2 _10_bh : packoffset(c0.z);
+ float2 _10_af : packoffset(c1);
+ float2 _10_bf : packoffset(c1.z);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor.x = determinant(float2x2(_10_ah, _10_bh));
+ sk_FragColor.y = determinant(float2x2(_10_af, _10_bf));
+ sk_FragColor.z = 12.0f;
+ sk_FragColor = float4(float3(-8.0f, -8.0f, 12.0f).x, float3(-8.0f, -8.0f, 12.0f).y, float3(-8.0f, -8.0f, 12.0f).z, sk_FragColor.w);
+ sk_FragColor = float4(sk_FragColor.x, float3(9.0f, -18.0f, -9.0f).x, float3(9.0f, -18.0f, -9.0f).y, float3(9.0f, -18.0f, -9.0f).z);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/CrossNoInline.hlsl b/tests/sksl/intrinsics/CrossNoInline.hlsl
new file mode 100644
index 0000000..28a039b
--- /dev/null
+++ b/tests/sksl/intrinsics/CrossNoInline.hlsl
@@ -0,0 +1,43 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float2 _12_ah : packoffset(c0);
+ float2 _12_bh : packoffset(c0.z);
+ float2 _12_af : packoffset(c1);
+ float2 _12_bf : packoffset(c1.z);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float cross_length_2d_hh2h2(float2 _26, float2 _27)
+{
+ return determinant(float2x2(_26, _27));
+}
+
+float cross_length_2d_ff2f2(float2 _18, float2 _19)
+{
+ return determinant(float2x2(_18, _19));
+}
+
+void frag_main()
+{
+ float2 _41 = _12_ah;
+ float2 _45 = _12_bh;
+ sk_FragColor.x = cross_length_2d_hh2h2(_41, _45);
+ float2 _52 = _12_af;
+ float2 _56 = _12_bf;
+ sk_FragColor.y = cross_length_2d_ff2f2(_52, _56);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/DFdx.hlsl b/tests/sksl/intrinsics/DFdx.hlsl
new file mode 100644
index 0000000..3e6169b
--- /dev/null
+++ b/tests/sksl/intrinsics/DFdx.hlsl
@@ -0,0 +1,103 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = 0.0f.xxxx;
+ bool _48 = false;
+ if (ddx(_10_testInputs.x) == 0.0f)
+ {
+ float2 _40 = ddx(_10_testInputs.xy);
+ _48 = all(bool2(_40.x == 0.0f.xxxx.xy.x, _40.y == 0.0f.xxxx.xy.y));
+ }
+ else
+ {
+ _48 = false;
+ }
+ bool _60 = false;
+ if (_48)
+ {
+ float3 _51 = ddx(_10_testInputs.xyz);
+ _60 = all(bool3(_51.x == 0.0f.xxxx.xyz.x, _51.y == 0.0f.xxxx.xyz.y, _51.z == 0.0f.xxxx.xyz.z));
+ }
+ else
+ {
+ _60 = false;
+ }
+ bool _69 = false;
+ if (_60)
+ {
+ float4 _63 = ddx(_10_testInputs);
+ _69 = all(bool4(_63.x == 0.0f.xxxx.x, _63.y == 0.0f.xxxx.y, _63.z == 0.0f.xxxx.z, _63.w == 0.0f.xxxx.w));
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _80 = false;
+ if (_69)
+ {
+ float2 _72 = sign(ddx(_24.xx));
+ _80 = all(bool2(_72.x == 1.0f.xx.x, _72.y == 1.0f.xx.y));
+ }
+ else
+ {
+ _80 = false;
+ }
+ bool _89 = false;
+ if (_80)
+ {
+ float2 _83 = sign(ddx(_24.yy));
+ _89 = all(bool2(_83.x == 0.0f.xx.x, _83.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _89 = false;
+ }
+ bool _98 = false;
+ if (_89)
+ {
+ float2 _92 = sign(ddx(_24));
+ _98 = all(bool2(_92.x == float2(1.0f, 0.0f).x, _92.y == float2(1.0f, 0.0f).y));
+ }
+ else
+ {
+ _98 = false;
+ }
+ float4 _99 = 0.0f.xxxx;
+ if (_98)
+ {
+ _99 = _10_colorGreen;
+ }
+ else
+ {
+ _99 = _10_colorRed;
+ }
+ return _99;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/DFdy.hlsl b/tests/sksl/intrinsics/DFdy.hlsl
new file mode 100644
index 0000000..b436642
--- /dev/null
+++ b/tests/sksl/intrinsics/DFdy.hlsl
@@ -0,0 +1,104 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_testInputs : packoffset(c0);
+ float4 _11_colorGreen : packoffset(c1);
+ float4 _11_colorRed : packoffset(c2);
+ float2 _11_u_skRTFlip : packoffset(c1024);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 expected = 0.0f.xxxx;
+ bool _60 = false;
+ if ((ddy(_11_testInputs.x) * _11_u_skRTFlip.y) == 0.0f)
+ {
+ float2 _55 = ddy(_11_testInputs.xy) * _11_u_skRTFlip.y.xx;
+ _60 = all(bool2(_55.x == 0.0f.xxxx.xy.x, _55.y == 0.0f.xxxx.xy.y));
+ }
+ else
+ {
+ _60 = false;
+ }
+ bool _77 = false;
+ if (_60)
+ {
+ float3 _72 = ddy(_11_testInputs.xyz) * _11_u_skRTFlip.y.xxx;
+ _77 = all(bool3(_72.x == 0.0f.xxxx.xyz.x, _72.y == 0.0f.xxxx.xyz.y, _72.z == 0.0f.xxxx.xyz.z));
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _91 = false;
+ if (_77)
+ {
+ float4 _87 = ddy(_11_testInputs) * _11_u_skRTFlip.y.xxxx;
+ _91 = all(bool4(_87.x == 0.0f.xxxx.x, _87.y == 0.0f.xxxx.y, _87.z == 0.0f.xxxx.z, _87.w == 0.0f.xxxx.w));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _105 = false;
+ if (_91)
+ {
+ float2 _94 = sign(ddy(_25.xx) * _11_u_skRTFlip.y.xx);
+ _105 = all(bool2(_94.x == 0.0f.xx.x, _94.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _105 = false;
+ }
+ bool _121 = false;
+ if (_105)
+ {
+ float2 _108 = sign(ddy(_25.yy) * _11_u_skRTFlip.y.xx);
+ _121 = all(bool2(_108.x == 1.0f.xx.x, _108.y == 1.0f.xx.y));
+ }
+ else
+ {
+ _121 = false;
+ }
+ bool _135 = false;
+ if (_121)
+ {
+ float2 _124 = sign(ddy(_25) * _11_u_skRTFlip.y.xx);
+ _135 = all(bool2(_124.x == float2(0.0f, 1.0f).x, _124.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _135 = false;
+ }
+ float4 _136 = 0.0f.xxxx;
+ if (_135)
+ {
+ _136 = _11_colorGreen;
+ }
+ else
+ {
+ _136 = _11_colorRed;
+ }
+ return _136;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl b/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl
new file mode 100644
index 0000000..05ad24b
--- /dev/null
+++ b/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl
@@ -0,0 +1,103 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = 0.0f.xxxx;
+ bool _48 = false;
+ if (ddy(_10_testInputs.x) == 0.0f)
+ {
+ float2 _40 = ddy(_10_testInputs.xy);
+ _48 = all(bool2(_40.x == 0.0f.xxxx.xy.x, _40.y == 0.0f.xxxx.xy.y));
+ }
+ else
+ {
+ _48 = false;
+ }
+ bool _60 = false;
+ if (_48)
+ {
+ float3 _51 = ddy(_10_testInputs.xyz);
+ _60 = all(bool3(_51.x == 0.0f.xxxx.xyz.x, _51.y == 0.0f.xxxx.xyz.y, _51.z == 0.0f.xxxx.xyz.z));
+ }
+ else
+ {
+ _60 = false;
+ }
+ bool _69 = false;
+ if (_60)
+ {
+ float4 _63 = ddy(_10_testInputs);
+ _69 = all(bool4(_63.x == 0.0f.xxxx.x, _63.y == 0.0f.xxxx.y, _63.z == 0.0f.xxxx.z, _63.w == 0.0f.xxxx.w));
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _78 = false;
+ if (_69)
+ {
+ float2 _72 = sign(ddy(_24.xx));
+ _78 = all(bool2(_72.x == 0.0f.xx.x, _72.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _89 = false;
+ if (_78)
+ {
+ float2 _81 = sign(ddy(_24.yy));
+ _89 = all(bool2(_81.x == 1.0f.xx.x, _81.y == 1.0f.xx.y));
+ }
+ else
+ {
+ _89 = false;
+ }
+ bool _98 = false;
+ if (_89)
+ {
+ float2 _92 = sign(ddy(_24));
+ _98 = all(bool2(_92.x == float2(0.0f, 1.0f).x, _92.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _98 = false;
+ }
+ float4 _99 = 0.0f.xxxx;
+ if (_98)
+ {
+ _99 = _10_colorGreen;
+ }
+ else
+ {
+ _99 = _10_colorRed;
+ }
+ return _99;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Degrees.hlsl b/tests/sksl/intrinsics/Degrees.hlsl
new file mode 100644
index 0000000..b99be45
--- /dev/null
+++ b/tests/sksl/intrinsics/Degrees.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (degrees(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = degrees(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = degrees(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = degrees(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 90.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _94 = false;
+ if (_84)
+ {
+ _94 = all(bool2(float2(90.0f, 180.0f).x == _10_expected.xy.x, float2(90.0f, 180.0f).y == _10_expected.xy.y));
+ }
+ else
+ {
+ _94 = false;
+ }
+ bool _104 = false;
+ if (_94)
+ {
+ _104 = all(bool3(float3(90.0f, 180.0f, 270.0f).x == _10_expected.xyz.x, float3(90.0f, 180.0f, 270.0f).y == _10_expected.xyz.y, float3(90.0f, 180.0f, 270.0f).z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _113 = false;
+ if (_104)
+ {
+ _113 = all(bool4(float4(90.0f, 180.0f, 270.0f, 360.0f).x == _10_expected.x, float4(90.0f, 180.0f, 270.0f, 360.0f).y == _10_expected.y, float4(90.0f, 180.0f, 270.0f, 360.0f).z == _10_expected.z, float4(90.0f, 180.0f, 270.0f, 360.0f).w == _10_expected.w));
+ }
+ else
+ {
+ _113 = false;
+ }
+ float4 _114 = 0.0f.xxxx;
+ if (_113)
+ {
+ _114 = _10_colorGreen;
+ }
+ else
+ {
+ _114 = _10_colorRed;
+ }
+ return _114;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Determinant.hlsl b/tests/sksl/intrinsics/Determinant.hlsl
new file mode 100644
index 0000000..2f7be95
--- /dev/null
+++ b/tests/sksl/intrinsics/Determinant.hlsl
@@ -0,0 +1,42 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _35 = 0.0f.xxxx;
+ if (determinant(_10_testMatrix2x2) == (-2.0f))
+ {
+ _35 = _10_colorGreen;
+ }
+ else
+ {
+ _35 = _10_colorRed;
+ }
+ return _35;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Distance.hlsl b/tests/sksl/intrinsics/Distance.hlsl
new file mode 100644
index 0000000..e1af17e
--- /dev/null
+++ b/tests/sksl/intrinsics/Distance.hlsl
@@ -0,0 +1,107 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_pos1 : packoffset(c0);
+ float4 _10_pos2 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(3.0f, 3.0f, 5.0f, 13.0f);
+ bool _55 = false;
+ if (distance(_10_pos1.x, _10_pos2.x) == 3.0f)
+ {
+ _55 = distance(_10_pos1.xy, _10_pos2.xy) == 3.0f;
+ }
+ else
+ {
+ _55 = false;
+ }
+ bool _67 = false;
+ if (_55)
+ {
+ _67 = distance(_10_pos1.xyz, _10_pos2.xyz) == 5.0f;
+ }
+ else
+ {
+ _67 = false;
+ }
+ bool _76 = false;
+ if (_67)
+ {
+ _76 = distance(_10_pos1, _10_pos2) == 13.0f;
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _80 = false;
+ if (_76)
+ {
+ _80 = true;
+ }
+ else
+ {
+ _80 = false;
+ }
+ bool _83 = false;
+ if (_80)
+ {
+ _83 = true;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _86 = false;
+ if (_83)
+ {
+ _86 = true;
+ }
+ else
+ {
+ _86 = false;
+ }
+ bool _89 = false;
+ if (_86)
+ {
+ _89 = true;
+ }
+ else
+ {
+ _89 = false;
+ }
+ float4 _90 = 0.0f.xxxx;
+ if (_89)
+ {
+ _90 = _10_colorGreen;
+ }
+ else
+ {
+ _90 = _10_colorRed;
+ }
+ return _90;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Dot.hlsl b/tests/sksl/intrinsics/Dot.hlsl
new file mode 100644
index 0000000..ba03ea2
--- /dev/null
+++ b/tests/sksl/intrinsics/Dot.hlsl
@@ -0,0 +1,107 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputA : packoffset(c0);
+ float4 _10_inputB : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(5.0f, 17.0f, 38.0f, 70.0f);
+ bool _56 = false;
+ if ((_10_inputA.x * _10_inputB.x) == 5.0f)
+ {
+ _56 = dot(_10_inputA.xy, _10_inputB.xy) == 17.0f;
+ }
+ else
+ {
+ _56 = false;
+ }
+ bool _68 = false;
+ if (_56)
+ {
+ _68 = dot(_10_inputA.xyz, _10_inputB.xyz) == 38.0f;
+ }
+ else
+ {
+ _68 = false;
+ }
+ bool _77 = false;
+ if (_68)
+ {
+ _77 = dot(_10_inputA, _10_inputB) == 70.0f;
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _81 = false;
+ if (_77)
+ {
+ _81 = true;
+ }
+ else
+ {
+ _81 = false;
+ }
+ bool _84 = false;
+ if (_81)
+ {
+ _84 = true;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _87 = false;
+ if (_84)
+ {
+ _87 = true;
+ }
+ else
+ {
+ _87 = false;
+ }
+ bool _90 = false;
+ if (_87)
+ {
+ _90 = true;
+ }
+ else
+ {
+ _90 = false;
+ }
+ float4 _91 = 0.0f.xxxx;
+ if (_90)
+ {
+ _91 = _10_colorGreen;
+ }
+ else
+ {
+ _91 = _10_colorRed;
+ }
+ return _91;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Equal.hlsl b/tests/sksl/intrinsics/Equal.hlsl
new file mode 100644
index 0000000..0ff6659
--- /dev/null
+++ b/tests/sksl/intrinsics/Equal.hlsl
@@ -0,0 +1,54 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+ uint2 _10_c : packoffset(c2);
+ uint2 _10_d : packoffset(c2.z);
+ int3 _10_e : packoffset(c3);
+ int3 _10_f : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool4 expectTTFF = bool4(true, true, false, false);
+ bool4 expectFFTT = bool4(false, false, true, true);
+ bool4 expectTTTT = bool4(true, true, true, true);
+ sk_FragColor.x = float(int(bool4(_10_a.x == _10_b.x, _10_a.y == _10_b.y, _10_a.z == _10_b.z, _10_a.w == _10_b.w).x));
+ sk_FragColor.y = float(int(bool2(_10_c.x == _10_d.x, _10_c.y == _10_d.y).y));
+ sk_FragColor.z = float(int(bool3(_10_e.x == _10_f.x, _10_e.y == _10_f.y, _10_e.z == _10_f.z).z));
+ bool _75 = false;
+ if (any(expectTTFF))
+ {
+ _75 = true;
+ }
+ else
+ {
+ _75 = any(expectFFTT);
+ }
+ bool _80 = false;
+ if (_75)
+ {
+ _80 = true;
+ }
+ else
+ {
+ _80 = any(expectTTTT);
+ }
+ sk_FragColor.w = float(int(_80));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Exp.hlsl b/tests/sksl/intrinsics/Exp.hlsl
new file mode 100644
index 0000000..b6deea2
--- /dev/null
+++ b/tests/sksl/intrinsics/Exp.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (exp(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = exp(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = exp(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = exp(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 1.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _93 = false;
+ if (_84)
+ {
+ _93 = all(bool2(1.0f.xx.x == _10_expected.xy.x, 1.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _102 = false;
+ if (_93)
+ {
+ _102 = all(bool3(1.0f.xxx.x == _10_expected.xyz.x, 1.0f.xxx.y == _10_expected.xyz.y, 1.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _102 = false;
+ }
+ bool _110 = false;
+ if (_102)
+ {
+ _110 = all(bool4(1.0f.xxxx.x == _10_expected.x, 1.0f.xxxx.y == _10_expected.y, 1.0f.xxxx.z == _10_expected.z, 1.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _110 = false;
+ }
+ float4 _111 = 0.0f.xxxx;
+ if (_110)
+ {
+ _111 = _10_colorGreen;
+ }
+ else
+ {
+ _111 = _10_colorRed;
+ }
+ return _111;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Exp2.hlsl b/tests/sksl/intrinsics/Exp2.hlsl
new file mode 100644
index 0000000..f577435
--- /dev/null
+++ b/tests/sksl/intrinsics/Exp2.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (exp2(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = exp2(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = exp2(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = exp2(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 1.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _94 = false;
+ if (_84)
+ {
+ _94 = all(bool2(float2(1.0f, 2.0f).x == _10_expected.xy.x, float2(1.0f, 2.0f).y == _10_expected.xy.y));
+ }
+ else
+ {
+ _94 = false;
+ }
+ bool _104 = false;
+ if (_94)
+ {
+ _104 = all(bool3(float3(1.0f, 2.0f, 4.0f).x == _10_expected.xyz.x, float3(1.0f, 2.0f, 4.0f).y == _10_expected.xyz.y, float3(1.0f, 2.0f, 4.0f).z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _113 = false;
+ if (_104)
+ {
+ _113 = all(bool4(float4(1.0f, 2.0f, 4.0f, 8.0f).x == _10_expected.x, float4(1.0f, 2.0f, 4.0f, 8.0f).y == _10_expected.y, float4(1.0f, 2.0f, 4.0f, 8.0f).z == _10_expected.z, float4(1.0f, 2.0f, 4.0f, 8.0f).w == _10_expected.w));
+ }
+ else
+ {
+ _113 = false;
+ }
+ float4 _114 = 0.0f.xxxx;
+ if (_113)
+ {
+ _114 = _10_colorGreen;
+ }
+ else
+ {
+ _114 = _10_colorRed;
+ }
+ return _114;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/FaceForward.hlsl b/tests/sksl/intrinsics/FaceForward.hlsl
new file mode 100644
index 0000000..9c71cf3
--- /dev/null
+++ b/tests/sksl/intrinsics/FaceForward.hlsl
@@ -0,0 +1,117 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_N : packoffset(c0);
+ float4 _10_I : packoffset(c1);
+ float4 _10_NRef : packoffset(c2);
+ float4 _10_colorGreen : packoffset(c3);
+ float4 _10_colorRed : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float spvFaceForward(float n, float i, float nref)
+{
+ return i * nref < 0.0 ? n : -n;
+}
+
+float4 main(float2 _24)
+{
+ float4 expectedPos = float4(1.0f, 2.0f, 3.0f, 4.0f);
+ float4 expectedNeg = float4(-1.0f, -2.0f, -3.0f, -4.0f);
+ bool _72 = false;
+ if (spvFaceForward(_10_N.x, _10_I.x, _10_NRef.x) == (-1.0f))
+ {
+ float2 _58 = faceforward(_10_N.xy, _10_I.xy, _10_NRef.xy);
+ _72 = all(bool2(_58.x == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.x, _58.y == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.y));
+ }
+ else
+ {
+ _72 = false;
+ }
+ bool _90 = false;
+ if (_72)
+ {
+ float3 _75 = faceforward(_10_N.xyz, _10_I.xyz, _10_NRef.xyz);
+ _90 = all(bool3(_75.x == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.x, _75.y == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.y, _75.z == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.z));
+ }
+ else
+ {
+ _90 = false;
+ }
+ bool _103 = false;
+ if (_90)
+ {
+ float4 _93 = faceforward(_10_N, _10_I, _10_NRef);
+ _103 = all(bool4(_93.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _93.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _93.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _93.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _107 = false;
+ if (_103)
+ {
+ _107 = true;
+ }
+ else
+ {
+ _107 = false;
+ }
+ bool _114 = false;
+ if (_107)
+ {
+ _114 = all(bool2(float2(-1.0f, -2.0f).x == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.x, float2(-1.0f, -2.0f).y == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.y));
+ }
+ else
+ {
+ _114 = false;
+ }
+ bool _121 = false;
+ if (_114)
+ {
+ _121 = all(bool3(float3(1.0f, 2.0f, 3.0f).x == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.x, float3(1.0f, 2.0f, 3.0f).y == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.y, float3(1.0f, 2.0f, 3.0f).z == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.z));
+ }
+ else
+ {
+ _121 = false;
+ }
+ bool _124 = false;
+ if (_121)
+ {
+ _124 = true;
+ }
+ else
+ {
+ _124 = false;
+ }
+ float4 _125 = 0.0f.xxxx;
+ if (_124)
+ {
+ _125 = _10_colorGreen;
+ }
+ else
+ {
+ _125 = _10_colorRed;
+ }
+ return _125;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/FindLSB.hlsl b/tests/sksl/intrinsics/FindLSB.hlsl
new file mode 100644
index 0000000..6517685
--- /dev/null
+++ b/tests/sksl/intrinsics/FindLSB.hlsl
@@ -0,0 +1,27 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ int _10_a : packoffset(c0);
+ uint _10_b : packoffset(c0.y);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor.x = float(firstbitlow(_10_a));
+ sk_FragColor.y = float(int(firstbitlow(_10_b)));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/FindMSB.hlsl b/tests/sksl/intrinsics/FindMSB.hlsl
new file mode 100644
index 0000000..30ea09e
--- /dev/null
+++ b/tests/sksl/intrinsics/FindMSB.hlsl
@@ -0,0 +1,27 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ int _10_a : packoffset(c0);
+ uint _10_b : packoffset(c0.y);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor.x = float(firstbithigh(_10_a));
+ sk_FragColor.y = float(int(firstbithigh(_10_b)));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/FloatBitsToInt.hlsl b/tests/sksl/intrinsics/FloatBitsToInt.hlsl
new file mode 100644
index 0000000..c9687fa
--- /dev/null
+++ b/tests/sksl/intrinsics/FloatBitsToInt.hlsl
@@ -0,0 +1,75 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_testInput : packoffset(c0);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c3);
+ float4 _10_colorRed : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
+ float4 inputVal = _42;
+ bool _58 = false;
+ if (asint(_42.x) == 1065353216)
+ {
+ int2 _50 = asint(_42.xy);
+ _58 = all(bool2(_50.x == int2(1065353216, 1073741824).x, _50.y == int2(1065353216, 1073741824).y));
+ }
+ else
+ {
+ _58 = false;
+ }
+ bool _70 = false;
+ if (_58)
+ {
+ int3 _61 = asint(_42.xyz);
+ _70 = all(bool3(_61.x == int3(1065353216, 1073741824, -1069547520).x, _61.y == int3(1065353216, 1073741824, -1069547520).y, _61.z == int3(1065353216, 1073741824, -1069547520).z));
+ }
+ else
+ {
+ _70 = false;
+ }
+ bool _80 = false;
+ if (_70)
+ {
+ int4 _73 = asint(_42);
+ _80 = all(bool4(_73.x == int4(1065353216, 1073741824, -1069547520, -1065353216).x, _73.y == int4(1065353216, 1073741824, -1069547520, -1065353216).y, _73.z == int4(1065353216, 1073741824, -1069547520, -1065353216).z, _73.w == int4(1065353216, 1073741824, -1069547520, -1065353216).w));
+ }
+ else
+ {
+ _80 = false;
+ }
+ float4 _81 = 0.0f.xxxx;
+ if (_80)
+ {
+ _81 = _10_colorGreen;
+ }
+ else
+ {
+ _81 = _10_colorRed;
+ }
+ return _81;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/FloatBitsToUint.hlsl b/tests/sksl/intrinsics/FloatBitsToUint.hlsl
new file mode 100644
index 0000000..f8eff1c
--- /dev/null
+++ b/tests/sksl/intrinsics/FloatBitsToUint.hlsl
@@ -0,0 +1,75 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_testInput : packoffset(c0);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c3);
+ float4 _10_colorRed : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
+ float4 inputVal = _42;
+ bool _59 = false;
+ if (asuint(_42.x) == 1065353216u)
+ {
+ uint2 _51 = asuint(_42.xy);
+ _59 = all(bool2(_51.x == uint2(1065353216u, 1073741824u).x, _51.y == uint2(1065353216u, 1073741824u).y));
+ }
+ else
+ {
+ _59 = false;
+ }
+ bool _71 = false;
+ if (_59)
+ {
+ uint3 _62 = asuint(_42.xyz);
+ _71 = all(bool3(_62.x == uint3(1065353216u, 1073741824u, 3225419776u).x, _62.y == uint3(1065353216u, 1073741824u, 3225419776u).y, _62.z == uint3(1065353216u, 1073741824u, 3225419776u).z));
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _81 = false;
+ if (_71)
+ {
+ uint4 _74 = asuint(_42);
+ _81 = all(bool4(_74.x == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).x, _74.y == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).y, _74.z == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).z, _74.w == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).w));
+ }
+ else
+ {
+ _81 = false;
+ }
+ float4 _82 = 0.0f.xxxx;
+ if (_81)
+ {
+ _82 = _10_colorGreen;
+ }
+ else
+ {
+ _82 = _10_colorRed;
+ }
+ return _82;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Floor.hlsl b/tests/sksl/intrinsics/Floor.hlsl
new file mode 100644
index 0000000..54dac70
--- /dev/null
+++ b/tests/sksl/intrinsics/Floor.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(-2.0f, 0.0f, 0.0f, 2.0f);
+ bool _50 = false;
+ if (floor(_10_testInputs.x) == (-2.0f))
+ {
+ float2 _42 = floor(_10_testInputs.xy);
+ _50 = all(bool2(_42.x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.x, _42.y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.y));
+ }
+ else
+ {
+ _50 = false;
+ }
+ bool _62 = false;
+ if (_50)
+ {
+ float3 _53 = floor(_10_testInputs.xyz);
+ _62 = all(bool3(_53.x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.x, _53.y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.y, _53.z == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.z));
+ }
+ else
+ {
+ _62 = false;
+ }
+ bool _71 = false;
+ if (_62)
+ {
+ float4 _65 = floor(_10_testInputs);
+ _71 = all(bool4(_65.x == float4(-2.0f, 0.0f, 0.0f, 2.0f).x, _65.y == float4(-2.0f, 0.0f, 0.0f, 2.0f).y, _65.z == float4(-2.0f, 0.0f, 0.0f, 2.0f).z, _65.w == float4(-2.0f, 0.0f, 0.0f, 2.0f).w));
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _75 = false;
+ if (_71)
+ {
+ _75 = true;
+ }
+ else
+ {
+ _75 = false;
+ }
+ bool _82 = false;
+ if (_75)
+ {
+ _82 = all(bool2(float2(-2.0f, 0.0f).x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.x, float2(-2.0f, 0.0f).y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.y));
+ }
+ else
+ {
+ _82 = false;
+ }
+ bool _89 = false;
+ if (_82)
+ {
+ _89 = all(bool3(float3(-2.0f, 0.0f, 0.0f).x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.x, float3(-2.0f, 0.0f, 0.0f).y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.y, float3(-2.0f, 0.0f, 0.0f).z == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.z));
+ }
+ else
+ {
+ _89 = false;
+ }
+ bool _92 = false;
+ if (_89)
+ {
+ _92 = true;
+ }
+ else
+ {
+ _92 = false;
+ }
+ float4 _93 = 0.0f.xxxx;
+ if (_92)
+ {
+ _93 = _10_colorGreen;
+ }
+ else
+ {
+ _93 = _10_colorRed;
+ }
+ return _93;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Fma.hlsl b/tests/sksl/intrinsics/Fma.hlsl
new file mode 100644
index 0000000..d1a84b8
--- /dev/null
+++ b/tests/sksl/intrinsics/Fma.hlsl
@@ -0,0 +1,56 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float _10_testArray[5] : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ float one = _10_testArray[0];
+ float two = _10_testArray[1];
+ float three = _10_testArray[2];
+ float four = _10_testArray[3];
+ float five = _10_testArray[4];
+ bool _66 = false;
+ if (mad(_10_testArray[0], _10_testArray[1], _10_testArray[2]) == 5.0f)
+ {
+ _66 = mad(_10_testArray[2], _10_testArray[3], _10_testArray[4]) == 17.0f;
+ }
+ else
+ {
+ _66 = false;
+ }
+ float4 _67 = 0.0f.xxxx;
+ if (_66)
+ {
+ _67 = _10_colorGreen;
+ }
+ else
+ {
+ _67 = _10_colorRed;
+ }
+ return _67;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Fract.hlsl b/tests/sksl/intrinsics/Fract.hlsl
new file mode 100644
index 0000000..f91ad22
--- /dev/null
+++ b/tests/sksl/intrinsics/Fract.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (frac(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = frac(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = frac(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = frac(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _93 = false;
+ if (_83)
+ {
+ _93 = all(bool2(float2(0.0f, 0.25f).x == _10_expected.xy.x, float2(0.0f, 0.25f).y == _10_expected.xy.y));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _103 = false;
+ if (_93)
+ {
+ _103 = all(bool3(float3(0.0f, 0.25f, 0.5f).x == _10_expected.xyz.x, float3(0.0f, 0.25f, 0.5f).y == _10_expected.xyz.y, float3(0.0f, 0.25f, 0.5f).z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _112 = false;
+ if (_103)
+ {
+ _112 = all(bool4(float4(0.0f, 0.25f, 0.5f, 0.75f).x == _10_expected.x, float4(0.0f, 0.25f, 0.5f, 0.75f).y == _10_expected.y, float4(0.0f, 0.25f, 0.5f, 0.75f).z == _10_expected.z, float4(0.0f, 0.25f, 0.5f, 0.75f).w == _10_expected.w));
+ }
+ else
+ {
+ _112 = false;
+ }
+ float4 _113 = 0.0f.xxxx;
+ if (_112)
+ {
+ _113 = _10_colorGreen;
+ }
+ else
+ {
+ _113 = _10_colorRed;
+ }
+ return _113;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Frexp.hlsl b/tests/sksl/intrinsics/Frexp.hlsl
new file mode 100644
index 0000000..11be8a4
--- /dev/null
+++ b/tests/sksl/intrinsics/Frexp.hlsl
@@ -0,0 +1,106 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _35 = _10_colorGreen.yyyy * 6.0f;
+ float4 value = _35;
+ int4 _exp = int4(0, 0, 0, 0);
+ int _47 = 0;
+ float _43 = frexp(_35.x, _47);
+ _exp.x = _47;
+ float4 result = 0.0f.xxxx;
+ result.x = _43;
+ bool _62 = false;
+ if (result.x == 0.75f)
+ {
+ _62 = _exp.x == 3;
+ }
+ else
+ {
+ _62 = false;
+ }
+ bool4 ok = bool4(false, false, false, false);
+ ok.x = _62;
+ int2 _68 = int2(0, 0);
+ float2 _65 = frexp(value.xy, _68);
+ int4 _72 = _exp;
+ _exp = int4(_68.x, _68.y, _72.z, _72.w);
+ float4 _74 = result;
+ result = float4(_65.x, _65.y, _74.z, _74.w);
+ bool _82 = false;
+ if (float4(_65.x, _65.y, _74.z, _74.w).y == 0.75f)
+ {
+ _82 = int4(_68.x, _68.y, _72.z, _72.w).y == 3;
+ }
+ else
+ {
+ _82 = false;
+ }
+ ok.y = _82;
+ int3 _89 = int3(0, 0, 0);
+ float3 _85 = frexp(value.xyz, _89);
+ int4 _93 = _exp;
+ _exp = int4(_89.x, _89.y, _89.z, _93.w);
+ float4 _95 = result;
+ result = float4(_85.x, _85.y, _85.z, _95.w);
+ bool _103 = false;
+ if (float4(_85.x, _85.y, _85.z, _95.w).z == 0.75f)
+ {
+ _103 = int4(_89.x, _89.y, _89.z, _93.w).z == 3;
+ }
+ else
+ {
+ _103 = false;
+ }
+ ok.z = _103;
+ int4 _108 = int4(0, 0, 0, 0);
+ float4 _106 = frexp(value, _108);
+ _exp = _108;
+ result = _106;
+ bool _116 = false;
+ if (_106.w == 0.75f)
+ {
+ _116 = _108.w == 3;
+ }
+ else
+ {
+ _116 = false;
+ }
+ ok.w = _116;
+ float4 _120 = 0.0f.xxxx;
+ if (all(ok))
+ {
+ _120 = _10_colorGreen;
+ }
+ else
+ {
+ _120 = _10_colorRed;
+ }
+ return _120;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Fwidth.hlsl b/tests/sksl/intrinsics/Fwidth.hlsl
new file mode 100644
index 0000000..3f140fd
--- /dev/null
+++ b/tests/sksl/intrinsics/Fwidth.hlsl
@@ -0,0 +1,123 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = 0.0f.xxxx;
+ bool _48 = false;
+ if (ddx(_10_testInputs.x) == 0.0f)
+ {
+ float2 _40 = ddx(_10_testInputs.xy);
+ _48 = all(bool2(_40.x == 0.0f.xxxx.xy.x, _40.y == 0.0f.xxxx.xy.y));
+ }
+ else
+ {
+ _48 = false;
+ }
+ bool _60 = false;
+ if (_48)
+ {
+ float3 _51 = ddx(_10_testInputs.xyz);
+ _60 = all(bool3(_51.x == 0.0f.xxxx.xyz.x, _51.y == 0.0f.xxxx.xyz.y, _51.z == 0.0f.xxxx.xyz.z));
+ }
+ else
+ {
+ _60 = false;
+ }
+ bool _69 = false;
+ if (_60)
+ {
+ float4 _63 = ddx(_10_testInputs);
+ _69 = all(bool4(_63.x == 0.0f.xxxx.x, _63.y == 0.0f.xxxx.y, _63.z == 0.0f.xxxx.z, _63.w == 0.0f.xxxx.w));
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _80 = false;
+ if (_69)
+ {
+ float2 _72 = sign(fwidth(_24.xx));
+ _80 = all(bool2(_72.x == 1.0f.xx.x, _72.y == 1.0f.xx.y));
+ }
+ else
+ {
+ _80 = false;
+ }
+ bool _91 = false;
+ if (_80)
+ {
+ float2 _83 = sign(fwidth(float2(_24.x, 1.0f)));
+ _91 = all(bool2(_83.x == float2(1.0f, 0.0f).x, _83.y == float2(1.0f, 0.0f).y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ float2 _94 = sign(fwidth(_24.yy));
+ _100 = all(bool2(_94.x == 1.0f.xx.x, _94.y == 1.0f.xx.y));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _111 = false;
+ if (_100)
+ {
+ float2 _103 = sign(fwidth(float2(0.0f, _24.y)));
+ _111 = all(bool2(_103.x == float2(0.0f, 1.0f).x, _103.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _111 = false;
+ }
+ bool _119 = false;
+ if (_111)
+ {
+ float2 _114 = sign(fwidth(_24));
+ _119 = all(bool2(_114.x == 1.0f.xx.x, _114.y == 1.0f.xx.y));
+ }
+ else
+ {
+ _119 = false;
+ }
+ float4 _120 = 0.0f.xxxx;
+ if (_119)
+ {
+ _120 = _10_colorGreen;
+ }
+ else
+ {
+ _120 = _10_colorRed;
+ }
+ return _120;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/GreaterThan.hlsl b/tests/sksl/intrinsics/GreaterThan.hlsl
new file mode 100644
index 0000000..1ef3875
--- /dev/null
+++ b/tests/sksl/intrinsics/GreaterThan.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+ uint2 _10_c : packoffset(c2);
+ uint2 _10_d : packoffset(c2.z);
+ int3 _10_e : packoffset(c3);
+ int3 _10_f : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool4 expectFFTT = bool4(false, false, true, true);
+ bool4 expectTTFF = bool4(true, true, false, false);
+ sk_FragColor.x = float(int(bool4(_10_a.x > _10_b.x, _10_a.y > _10_b.y, _10_a.z > _10_b.z, _10_a.w > _10_b.w).x));
+ sk_FragColor.y = float(int(bool2(_10_c.x > _10_d.x, _10_c.y > _10_d.y).y));
+ sk_FragColor.z = float(int(bool3(_10_e.x > _10_f.x, _10_e.y > _10_f.y, _10_e.z > _10_f.z).z));
+ bool _73 = false;
+ if (any(expectTTFF))
+ {
+ _73 = true;
+ }
+ else
+ {
+ _73 = any(expectFFTT);
+ }
+ sk_FragColor.w = float(int(_73));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/GreaterThanEqual.hlsl b/tests/sksl/intrinsics/GreaterThanEqual.hlsl
new file mode 100644
index 0000000..9b42fce
--- /dev/null
+++ b/tests/sksl/intrinsics/GreaterThanEqual.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+ uint2 _10_c : packoffset(c2);
+ uint2 _10_d : packoffset(c2.z);
+ int3 _10_e : packoffset(c3);
+ int3 _10_f : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool4 expectFFTT = bool4(false, false, true, true);
+ bool4 expectTTFF = bool4(true, true, false, false);
+ sk_FragColor.x = float(int(bool4(_10_a.x >= _10_b.x, _10_a.y >= _10_b.y, _10_a.z >= _10_b.z, _10_a.w >= _10_b.w).x));
+ sk_FragColor.y = float(int(bool2(_10_c.x >= _10_d.x, _10_c.y >= _10_d.y).y));
+ sk_FragColor.z = float(int(bool3(_10_e.x >= _10_f.x, _10_e.y >= _10_f.y, _10_e.z >= _10_f.z).z));
+ bool _73 = false;
+ if (any(expectTTFF))
+ {
+ _73 = true;
+ }
+ else
+ {
+ _73 = any(expectFFTT);
+ }
+ sk_FragColor.w = float(int(_73));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/IntBitsToFloat.hlsl b/tests/sksl/intrinsics/IntBitsToFloat.hlsl
new file mode 100644
index 0000000..2e91e35
--- /dev/null
+++ b/tests/sksl/intrinsics/IntBitsToFloat.hlsl
@@ -0,0 +1,78 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_testInput : packoffset(c0);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c3);
+ float4 _10_colorRed : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
+ float4 inputVal = _42;
+ int4 expectedB = int4(1065353216, 1073741824, -1069547520, -1065353216);
+ bool _64 = false;
+ if (_42.x == asfloat(1065353216))
+ {
+ float2 _57 = _42.xy;
+ float2 _58 = asfloat(int4(1065353216, 1073741824, -1069547520, -1065353216).xy);
+ _64 = all(bool2(_57.x == _58.x, _57.y == _58.y));
+ }
+ else
+ {
+ _64 = false;
+ }
+ bool _75 = false;
+ if (_64)
+ {
+ float3 _67 = _42.xyz;
+ float3 _69 = asfloat(int4(1065353216, 1073741824, -1069547520, -1065353216).xyz);
+ _75 = all(bool3(_67.x == _69.x, _67.y == _69.y, _67.z == _69.z));
+ }
+ else
+ {
+ _75 = false;
+ }
+ bool _82 = false;
+ if (_75)
+ {
+ float4 _78 = asfloat(int4(1065353216, 1073741824, -1069547520, -1065353216));
+ _82 = all(bool4(_42.x == _78.x, _42.y == _78.y, _42.z == _78.z, _42.w == _78.w));
+ }
+ else
+ {
+ _82 = false;
+ }
+ float4 _83 = 0.0f.xxxx;
+ if (_82)
+ {
+ _83 = _10_colorGreen;
+ }
+ else
+ {
+ _83 = _10_colorRed;
+ }
+ return _83;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Inverse.hlsl b/tests/sksl/intrinsics/Inverse.hlsl
new file mode 100644
index 0000000..f8cd0da
--- /dev/null
+++ b/tests/sksl/intrinsics/Inverse.hlsl
@@ -0,0 +1,108 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+// Returns the determinant of a 2x2 matrix.
+float spvDet2x2(float a1, float a2, float b1, float b2)
+{
+ return a1 * b2 - b1 * a2;
+}
+
+// Returns the inverse of a matrix, by using the algorithm of calculating the classical
+// adjoint and dividing by the determinant. The contents of the matrix are changed.
+float3x3 spvInverse(float3x3 m)
+{
+ float3x3 adj; // The adjoint matrix (inverse after dividing by determinant)
+
+ // Create the transpose of the cofactors, as the classical adjoint of the matrix.
+ adj[0][0] = spvDet2x2(m[1][1], m[1][2], m[2][1], m[2][2]);
+ adj[0][1] = -spvDet2x2(m[0][1], m[0][2], m[2][1], m[2][2]);
+ adj[0][2] = spvDet2x2(m[0][1], m[0][2], m[1][1], m[1][2]);
+
+ adj[1][0] = -spvDet2x2(m[1][0], m[1][2], m[2][0], m[2][2]);
+ adj[1][1] = spvDet2x2(m[0][0], m[0][2], m[2][0], m[2][2]);
+ adj[1][2] = -spvDet2x2(m[0][0], m[0][2], m[1][0], m[1][2]);
+
+ adj[2][0] = spvDet2x2(m[1][0], m[1][1], m[2][0], m[2][1]);
+ adj[2][1] = -spvDet2x2(m[0][0], m[0][1], m[2][0], m[2][1]);
+ adj[2][2] = spvDet2x2(m[0][0], m[0][1], m[1][0], m[1][1]);
+
+ // Calculate the determinant as a combination of the cofactors of the first row.
+ float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]);
+
+ // Divide the classical adjoint matrix by the determinant.
+ // If determinant is zero, matrix is not invertable, so leave it unchanged.
+ return (det != 0.0f) ? (adj * (1.0f / det)) : m;
+}
+
+float4 main(float2 _24)
+{
+ float2x2 inv2x2 = float2x2(float2(-2.0f, 1.0f), float2(1.5f, -0.5f));
+ float3x3 inv3x3 = float3x3(float3(-24.0f, 18.0f, 5.0f), float3(20.0f, -15.0f, -4.0f), float3(-5.0f, 4.0f, 1.0f));
+ float4x4 inv4x4 = float4x4(float4(-2.0f, -0.5f, 1.0f, 0.5f), float4(1.0f, 0.5f, 0.0f, -0.5f), float4(-8.0f, -1.0f, 2.0f, 2.0f), float4(3.0f, 0.5f, -1.0f, -0.5f));
+ bool _83 = false;
+ if (all(bool2(float2(-2.0f, 1.0f).x == float2(-2.0f, 1.0f).x, float2(-2.0f, 1.0f).y == float2(-2.0f, 1.0f).y)) && all(bool2(float2(1.5f, -0.5f).x == float2(1.5f, -0.5f).x, float2(1.5f, -0.5f).y == float2(1.5f, -0.5f).y)))
+ {
+ _83 = (all(bool3(float3(-24.0f, 18.0f, 5.0f).x == float3(-24.0f, 18.0f, 5.0f).x, float3(-24.0f, 18.0f, 5.0f).y == float3(-24.0f, 18.0f, 5.0f).y, float3(-24.0f, 18.0f, 5.0f).z == float3(-24.0f, 18.0f, 5.0f).z)) && all(bool3(float3(20.0f, -15.0f, -4.0f).x == float3(20.0f, -15.0f, -4.0f).x, float3(20.0f, -15.0f, -4.0f).y == float3(20.0f, -15.0f, -4.0f).y, float3(20.0f, -15.0f, -4.0f).z == float3(20.0f, -15.0f, -4.0f).z))) && all(bool3(float3(-5.0f, 4.0f, 1.0f).x == float3(-5.0f, 4.0f, 1.0f).x, float3(-5.0f, 4.0f, 1.0f).y == float3(-5.0f, 4.0f, 1.0f).y, float3(-5.0f, 4.0f, 1.0f).z == float3(-5.0f, 4.0f, 1.0f).z));
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _98 = false;
+ if (_83)
+ {
+ _98 = ((all(bool4(float4(-2.0f, -0.5f, 1.0f, 0.5f).x == float4(-2.0f, -0.5f, 1.0f, 0.5f).x, float4(-2.0f, -0.5f, 1.0f, 0.5f).y == float4(-2.0f, -0.5f, 1.0f, 0.5f).y, float4(-2.0f, -0.5f, 1.0f, 0.5f).z == float4(-2.0f, -0.5f, 1.0f, 0.5f).z, float4(-2.0f, -0.5f, 1.0f, 0.5f).w == float4(-2.0f, -0.5f, 1.0f, 0.5f).w)) && all(bool4(float4(1.0f, 0.5f, 0.0f, -0.5f).x == float4(1.0f, 0.5f, 0.0f, -0.5f).x, float4(1.0f, 0.5f, 0.0f, -0.5f).y == float4(1.0f, 0.5f, 0.0f, -0.5f).y, float4(1.0f, 0.5f, 0.0f, -0.5f).z == float4(1.0f, 0.5f, 0.0f, -0.5f).z, float4(1.0f, 0.5f, 0.0f, -0.5f).w == float4(1.0f, 0.5f, 0.0f, -0.5f).w))) && all(bool4(float4(-8.0f, -1.0f, 2.0f, 2.0f).x == float4(-8.0f, -1.0f, 2.0f, 2.0f).x, float4(-8.0f, -1.0f, 2.0f, 2.0f).y == float4(-8.0f, -1.0f, 2.0f, 2.0f).y, float4(-8.0f, -1.0f, 2.0f, 2.0f).z == float4(-8.0f, -1.0f, 2.0f, 2.0f).z, float4(-8.0f, -1.0f, 2.0f, 2.0f).w == float4(-8.0f, -1.0f, 2.0f, 2.0f).w))) && all(bool4(float4(3.0f, 0.5f, -1.0f, -0.5f).x == float4(3.0f, 0.5f, -1.0f, -0.5f).x, float4(3.0f, 0.5f, -1.0f, -0.5f).y == float4(3.0f, 0.5f, -1.0f, -0.5f).y, float4(3.0f, 0.5f, -1.0f, -0.5f).z == float4(3.0f, 0.5f, -1.0f, -0.5f).z, float4(3.0f, 0.5f, -1.0f, -0.5f).w == float4(3.0f, 0.5f, -1.0f, -0.5f).w));
+ }
+ else
+ {
+ _98 = false;
+ }
+ bool _121 = false;
+ if (_98)
+ {
+ float3x3 _101 = spvInverse(float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)));
+ float3 _110 = _101[0];
+ float3 _113 = _101[1];
+ float3 _117 = _101[2];
+ _121 = (any(bool3(_110.x != float3(-24.0f, 18.0f, 5.0f).x, _110.y != float3(-24.0f, 18.0f, 5.0f).y, _110.z != float3(-24.0f, 18.0f, 5.0f).z)) || any(bool3(_113.x != float3(20.0f, -15.0f, -4.0f).x, _113.y != float3(20.0f, -15.0f, -4.0f).y, _113.z != float3(20.0f, -15.0f, -4.0f).z))) || any(bool3(_117.x != float3(-5.0f, 4.0f, 1.0f).x, _117.y != float3(-5.0f, 4.0f, 1.0f).y, _117.z != float3(-5.0f, 4.0f, 1.0f).z));
+ }
+ else
+ {
+ _121 = false;
+ }
+ float4 _122 = 0.0f.xxxx;
+ if (_121)
+ {
+ _122 = _10_colorGreen;
+ }
+ else
+ {
+ _122 = _10_colorRed;
+ }
+ return _122;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Inversesqrt.hlsl b/tests/sksl/intrinsics/Inversesqrt.hlsl
new file mode 100644
index 0000000..1f6a12d
--- /dev/null
+++ b/tests/sksl/intrinsics/Inversesqrt.hlsl
@@ -0,0 +1,148 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (rsqrt(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = rsqrt(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = rsqrt(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = rsqrt(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 1.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _94 = false;
+ if (_84)
+ {
+ _94 = all(bool2(float2(1.0f, 0.5f).x == _10_expected.xy.x, float2(1.0f, 0.5f).y == _10_expected.xy.y));
+ }
+ else
+ {
+ _94 = false;
+ }
+ bool _104 = false;
+ if (_94)
+ {
+ _104 = all(bool3(float3(1.0f, 0.5f, 0.25f).x == _10_expected.xyz.x, float3(1.0f, 0.5f, 0.25f).y == _10_expected.xyz.y, float3(1.0f, 0.5f, 0.25f).z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _113 = false;
+ if (_104)
+ {
+ _113 = all(bool4(float4(1.0f, 0.5f, 0.25f, 0.125f).x == _10_expected.x, float4(1.0f, 0.5f, 0.25f, 0.125f).y == _10_expected.y, float4(1.0f, 0.5f, 0.25f, 0.125f).z == _10_expected.z, float4(1.0f, 0.5f, 0.25f, 0.125f).w == _10_expected.w));
+ }
+ else
+ {
+ _113 = false;
+ }
+ bool _122 = false;
+ if (_113)
+ {
+ _122 = rsqrt(-1.0f) == _10_expected.x;
+ }
+ else
+ {
+ _122 = false;
+ }
+ bool _133 = false;
+ if (_122)
+ {
+ float2 _125 = rsqrt(float2(-1.0f, -4.0f));
+ _133 = all(bool2(_125.x == _10_expected.xy.x, _125.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _133 = false;
+ }
+ bool _144 = false;
+ if (_133)
+ {
+ float3 _136 = rsqrt(float3(-1.0f, -4.0f, -16.0f));
+ _144 = all(bool3(_136.x == _10_expected.xyz.x, _136.y == _10_expected.xyz.y, _136.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _144 = false;
+ }
+ bool _154 = false;
+ if (_144)
+ {
+ float4 _147 = rsqrt(float4(-1.0f, -4.0f, -16.0f, -64.0f));
+ _154 = all(bool4(_147.x == _10_expected.x, _147.y == _10_expected.y, _147.z == _10_expected.z, _147.w == _10_expected.w));
+ }
+ else
+ {
+ _154 = false;
+ }
+ float4 _155 = 0.0f.xxxx;
+ if (_154)
+ {
+ _155 = _10_colorGreen;
+ }
+ else
+ {
+ _155 = _10_colorRed;
+ }
+ return _155;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/IsInf.hlsl b/tests/sksl/intrinsics/IsInf.hlsl
new file mode 100644
index 0000000..5c4bce1
--- /dev/null
+++ b/tests/sksl/intrinsics/IsInf.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _46 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * (1.0f / _10_colorGreen.x);
+ float4 infiniteValue = _46;
+ float4 _59 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * (1.0f / _10_colorGreen.y);
+ float4 finiteValue = _59;
+ bool _69 = false;
+ if (isinf(_46.x))
+ {
+ _69 = all(isinf(_46.xy));
+ }
+ else
+ {
+ _69 = false;
+ }
+ bool _77 = false;
+ if (_69)
+ {
+ _77 = all(isinf(_46.xyz));
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _83 = false;
+ if (_77)
+ {
+ _83 = all(isinf(_46));
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _89 = false;
+ if (_83)
+ {
+ _89 = !isinf(_59.x);
+ }
+ else
+ {
+ _89 = false;
+ }
+ bool _96 = false;
+ if (_89)
+ {
+ _96 = !any(isinf(_59.xy));
+ }
+ else
+ {
+ _96 = false;
+ }
+ bool _103 = false;
+ if (_96)
+ {
+ _103 = !any(isinf(_59.xyz));
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _109 = false;
+ if (_103)
+ {
+ _109 = !any(isinf(_59));
+ }
+ else
+ {
+ _109 = false;
+ }
+ float4 _110 = 0.0f.xxxx;
+ if (_109)
+ {
+ _110 = _10_colorGreen;
+ }
+ else
+ {
+ _110 = _10_colorRed;
+ }
+ return _110;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/IsNan.hlsl b/tests/sksl/intrinsics/IsNan.hlsl
new file mode 100644
index 0000000..4a16b54
--- /dev/null
+++ b/tests/sksl/intrinsics/IsNan.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _35 = 0.0f.xxxx / _10_testInputs.yyyy;
+ float4 valueIsNaN = _35;
+ float4 _41 = 1.0f.xxxx / _10_testInputs;
+ float4 valueIsNumber = _41;
+ bool _51 = false;
+ if (isnan(_35.x))
+ {
+ _51 = all(isnan(_35.xy));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _59 = false;
+ if (_51)
+ {
+ _59 = all(isnan(_35.xyz));
+ }
+ else
+ {
+ _59 = false;
+ }
+ bool _65 = false;
+ if (_59)
+ {
+ _65 = all(isnan(_35));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _71 = false;
+ if (_65)
+ {
+ _71 = !isnan(_41.x);
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _78 = false;
+ if (_71)
+ {
+ _78 = !any(isnan(_41.xy));
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _85 = false;
+ if (_78)
+ {
+ _85 = !any(isnan(_41.xyz));
+ }
+ else
+ {
+ _85 = false;
+ }
+ bool _91 = false;
+ if (_85)
+ {
+ _91 = !any(isnan(_41));
+ }
+ else
+ {
+ _91 = false;
+ }
+ float4 _92 = 0.0f.xxxx;
+ if (_91)
+ {
+ _92 = _10_colorGreen;
+ }
+ else
+ {
+ _92 = _10_colorRed;
+ }
+ return _92;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Ldexp.hlsl b/tests/sksl/intrinsics/Ldexp.hlsl
new file mode 100644
index 0000000..c99d8a2
--- /dev/null
+++ b/tests/sksl/intrinsics/Ldexp.hlsl
@@ -0,0 +1,27 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _13_a : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static int b = 0;
+
+void frag_main()
+{
+ sk_FragColor.x = ldexp(_13_a, b);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Length.hlsl b/tests/sksl/intrinsics/Length.hlsl
new file mode 100644
index 0000000..dc0397f
--- /dev/null
+++ b/tests/sksl/intrinsics/Length.hlsl
@@ -0,0 +1,106 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(3.0f, 3.0f, 5.0f, 13.0f);
+ bool _48 = false;
+ if (length(_10_inputVal.x) == 3.0f)
+ {
+ _48 = length(_10_inputVal.xy) == 3.0f;
+ }
+ else
+ {
+ _48 = false;
+ }
+ bool _57 = false;
+ if (_48)
+ {
+ _57 = length(_10_inputVal.xyz) == 5.0f;
+ }
+ else
+ {
+ _57 = false;
+ }
+ bool _64 = false;
+ if (_57)
+ {
+ _64 = length(_10_inputVal) == 13.0f;
+ }
+ else
+ {
+ _64 = false;
+ }
+ bool _68 = false;
+ if (_64)
+ {
+ _68 = true;
+ }
+ else
+ {
+ _68 = false;
+ }
+ bool _71 = false;
+ if (_68)
+ {
+ _71 = true;
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _74 = false;
+ if (_71)
+ {
+ _74 = true;
+ }
+ else
+ {
+ _74 = false;
+ }
+ bool _77 = false;
+ if (_74)
+ {
+ _77 = true;
+ }
+ else
+ {
+ _77 = false;
+ }
+ float4 _78 = 0.0f.xxxx;
+ if (_77)
+ {
+ _78 = _10_colorGreen;
+ }
+ else
+ {
+ _78 = _10_colorRed;
+ }
+ return _78;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/LessThan.hlsl b/tests/sksl/intrinsics/LessThan.hlsl
new file mode 100644
index 0000000..1c83bf1
--- /dev/null
+++ b/tests/sksl/intrinsics/LessThan.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+ uint2 _10_c : packoffset(c2);
+ uint2 _10_d : packoffset(c2.z);
+ int3 _10_e : packoffset(c3);
+ int3 _10_f : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool4 expectTTFF = bool4(true, true, false, false);
+ bool4 expectFFTT = bool4(false, false, true, true);
+ sk_FragColor.x = float(int(bool4(_10_a.x < _10_b.x, _10_a.y < _10_b.y, _10_a.z < _10_b.z, _10_a.w < _10_b.w).x));
+ sk_FragColor.y = float(int(bool2(_10_c.x < _10_d.x, _10_c.y < _10_d.y).y));
+ sk_FragColor.z = float(int(bool3(_10_e.x < _10_f.x, _10_e.y < _10_f.y, _10_e.z < _10_f.z).z));
+ bool _73 = false;
+ if (any(expectTTFF))
+ {
+ _73 = true;
+ }
+ else
+ {
+ _73 = any(expectFFTT);
+ }
+ sk_FragColor.w = float(int(_73));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/LessThanEqual.hlsl b/tests/sksl/intrinsics/LessThanEqual.hlsl
new file mode 100644
index 0000000..5d921dd
--- /dev/null
+++ b/tests/sksl/intrinsics/LessThanEqual.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+ uint2 _10_c : packoffset(c2);
+ uint2 _10_d : packoffset(c2.z);
+ int3 _10_e : packoffset(c3);
+ int3 _10_f : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool4 expectTTFF = bool4(true, true, false, false);
+ bool4 expectFFTT = bool4(false, false, true, true);
+ sk_FragColor.x = float(int(bool4(_10_a.x <= _10_b.x, _10_a.y <= _10_b.y, _10_a.z <= _10_b.z, _10_a.w <= _10_b.w).x));
+ sk_FragColor.y = float(int(bool2(_10_c.x <= _10_d.x, _10_c.y <= _10_d.y).y));
+ sk_FragColor.z = float(int(bool3(_10_e.x <= _10_f.x, _10_e.y <= _10_f.y, _10_e.z <= _10_f.z).z));
+ bool _73 = false;
+ if (any(expectTTFF))
+ {
+ _73 = true;
+ }
+ else
+ {
+ _73 = any(expectFFTT);
+ }
+ sk_FragColor.w = float(int(_73));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Log.hlsl b/tests/sksl/intrinsics/Log.hlsl
new file mode 100644
index 0000000..a0dba64
--- /dev/null
+++ b/tests/sksl/intrinsics/Log.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (log(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = log(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = log(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = log(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Log2.hlsl b/tests/sksl/intrinsics/Log2.hlsl
new file mode 100644
index 0000000..14bad78
--- /dev/null
+++ b/tests/sksl/intrinsics/Log2.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (log2(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = log2(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = log2(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = log2(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _93 = false;
+ if (_83)
+ {
+ _93 = all(bool2(float2(0.0f, 1.0f).x == _10_expected.xy.x, float2(0.0f, 1.0f).y == _10_expected.xy.y));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _103 = false;
+ if (_93)
+ {
+ _103 = all(bool3(float3(0.0f, 1.0f, 2.0f).x == _10_expected.xyz.x, float3(0.0f, 1.0f, 2.0f).y == _10_expected.xyz.y, float3(0.0f, 1.0f, 2.0f).z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _112 = false;
+ if (_103)
+ {
+ _112 = all(bool4(float4(0.0f, 1.0f, 2.0f, 3.0f).x == _10_expected.x, float4(0.0f, 1.0f, 2.0f, 3.0f).y == _10_expected.y, float4(0.0f, 1.0f, 2.0f, 3.0f).z == _10_expected.z, float4(0.0f, 1.0f, 2.0f, 3.0f).w == _10_expected.w));
+ }
+ else
+ {
+ _112 = false;
+ }
+ float4 _113 = 0.0f.xxxx;
+ if (_112)
+ {
+ _113 = _10_colorGreen;
+ }
+ else
+ {
+ _113 = _10_colorRed;
+ }
+ return _113;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MatrixCompMultES2.hlsl b/tests/sksl/intrinsics/MatrixCompMultES2.hlsl
new file mode 100644
index 0000000..0689052
--- /dev/null
+++ b/tests/sksl/intrinsics/MatrixCompMultES2.hlsl
@@ -0,0 +1,69 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
+ row_major float3x3 _10_testMatrix3x3 : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ float2x2 h22 = float2x2(float2(0.0f, 5.0f), float2(10.0f, 15.0f));
+ float2 _49 = _10_testMatrix2x2[0] * float2(1.0f, 0.0f);
+ float2 _51 = _10_testMatrix2x2[1] * float2(0.0f, 1.0f);
+ float2x2 f22 = float2x2(_49, _51);
+ float3 _64 = _10_testMatrix3x3[0] * 2.0f.xxx;
+ float3 _66 = _10_testMatrix3x3[1] * 2.0f.xxx;
+ float3 _68 = _10_testMatrix3x3[2] * 2.0f.xxx;
+ float3x3 h33 = float3x3(_64, _66, _68);
+ bool _87 = false;
+ if (all(bool2(float2(0.0f, 5.0f).x == float2(0.0f, 5.0f).x, float2(0.0f, 5.0f).y == float2(0.0f, 5.0f).y)) && all(bool2(float2(10.0f, 15.0f).x == float2(10.0f, 15.0f).x, float2(10.0f, 15.0f).y == float2(10.0f, 15.0f).y)))
+ {
+ _87 = all(bool2(_49.x == float2(1.0f, 0.0f).x, _49.y == float2(1.0f, 0.0f).y)) && all(bool2(_51.x == float2(0.0f, 4.0f).x, _51.y == float2(0.0f, 4.0f).y));
+ }
+ else
+ {
+ _87 = false;
+ }
+ bool _109 = false;
+ if (_87)
+ {
+ _109 = (all(bool3(_64.x == float3(2.0f, 4.0f, 6.0f).x, _64.y == float3(2.0f, 4.0f, 6.0f).y, _64.z == float3(2.0f, 4.0f, 6.0f).z)) && all(bool3(_66.x == float3(8.0f, 10.0f, 12.0f).x, _66.y == float3(8.0f, 10.0f, 12.0f).y, _66.z == float3(8.0f, 10.0f, 12.0f).z))) && all(bool3(_68.x == float3(14.0f, 16.0f, 18.0f).x, _68.y == float3(14.0f, 16.0f, 18.0f).y, _68.z == float3(14.0f, 16.0f, 18.0f).z));
+ }
+ else
+ {
+ _109 = false;
+ }
+ float4 _110 = 0.0f.xxxx;
+ if (_109)
+ {
+ _110 = _10_colorGreen;
+ }
+ else
+ {
+ _110 = _10_colorRed;
+ }
+ return _110;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MatrixCompMultES3.hlsl b/tests/sksl/intrinsics/MatrixCompMultES3.hlsl
new file mode 100644
index 0000000..a52b88c0
--- /dev/null
+++ b/tests/sksl/intrinsics/MatrixCompMultES3.hlsl
@@ -0,0 +1,72 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _42 = 9.0f.xxxx * _10_colorRed;
+ float4 _43 = 9.0f.xxxx * _10_colorGreen;
+ float2x4 h24 = float2x4(_42, _43);
+ float2 _68 = float2(_10_colorRed.xy);
+ float2 _71 = float2(_10_colorRed.zw);
+ float2 _74 = float2(_10_colorGreen.xy);
+ float2 _77 = float2(_10_colorGreen.zw);
+ float2 _79 = float2(1.0f, 2.0f) * _68;
+ float2 _80 = float2(3.0f, 4.0f) * _71;
+ float2 _81 = float2(5.0f, 6.0f) * _74;
+ float2 _82 = float2(7.0f, 8.0f) * _77;
+ float4x2 h42 = float4x2(_79, _80, _81, _82);
+ float4x3 f43 = float4x3(float3(12.0f, 22.0f, 30.0f), float3(36.0f, 40.0f, 42.0f), float3(42.0f, 40.0f, 36.0f), float3(30.0f, 22.0f, 12.0f));
+ bool _128 = false;
+ if (all(bool4(_42.x == float4(9.0f, 0.0f, 0.0f, 9.0f).x, _42.y == float4(9.0f, 0.0f, 0.0f, 9.0f).y, _42.z == float4(9.0f, 0.0f, 0.0f, 9.0f).z, _42.w == float4(9.0f, 0.0f, 0.0f, 9.0f).w)) && all(bool4(_43.x == float4(0.0f, 9.0f, 0.0f, 9.0f).x, _43.y == float4(0.0f, 9.0f, 0.0f, 9.0f).y, _43.z == float4(0.0f, 9.0f, 0.0f, 9.0f).z, _43.w == float4(0.0f, 9.0f, 0.0f, 9.0f).w)))
+ {
+ _128 = ((all(bool2(_79.x == float2(1.0f, 0.0f).x, _79.y == float2(1.0f, 0.0f).y)) && all(bool2(_80.x == float2(0.0f, 4.0f).x, _80.y == float2(0.0f, 4.0f).y))) && all(bool2(_81.x == float2(0.0f, 6.0f).x, _81.y == float2(0.0f, 6.0f).y))) && all(bool2(_82.x == float2(0.0f, 8.0f).x, _82.y == float2(0.0f, 8.0f).y));
+ }
+ else
+ {
+ _128 = false;
+ }
+ bool _143 = false;
+ if (_128)
+ {
+ _143 = ((all(bool3(float3(12.0f, 22.0f, 30.0f).x == float3(12.0f, 22.0f, 30.0f).x, float3(12.0f, 22.0f, 30.0f).y == float3(12.0f, 22.0f, 30.0f).y, float3(12.0f, 22.0f, 30.0f).z == float3(12.0f, 22.0f, 30.0f).z)) && all(bool3(float3(36.0f, 40.0f, 42.0f).x == float3(36.0f, 40.0f, 42.0f).x, float3(36.0f, 40.0f, 42.0f).y == float3(36.0f, 40.0f, 42.0f).y, float3(36.0f, 40.0f, 42.0f).z == float3(36.0f, 40.0f, 42.0f).z))) && all(bool3(float3(42.0f, 40.0f, 36.0f).x == float3(42.0f, 40.0f, 36.0f).x, float3(42.0f, 40.0f, 36.0f).y == float3(42.0f, 40.0f, 36.0f).y, float3(42.0f, 40.0f, 36.0f).z == float3(42.0f, 40.0f, 36.0f).z))) && all(bool3(float3(30.0f, 22.0f, 12.0f).x == float3(30.0f, 22.0f, 12.0f).x, float3(30.0f, 22.0f, 12.0f).y == float3(30.0f, 22.0f, 12.0f).y, float3(30.0f, 22.0f, 12.0f).z == float3(30.0f, 22.0f, 12.0f).z));
+ }
+ else
+ {
+ _143 = false;
+ }
+ float4 _144 = 0.0f.xxxx;
+ if (_143)
+ {
+ _144 = _10_colorGreen;
+ }
+ else
+ {
+ _144 = _10_colorRed;
+ }
+ return _144;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MaxFloat.hlsl b/tests/sksl/intrinsics/MaxFloat.hlsl
new file mode 100644
index 0000000..533ad33
--- /dev/null
+++ b/tests/sksl/intrinsics/MaxFloat.hlsl
@@ -0,0 +1,185 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedA = float4(0.5f, 0.5f, 0.75f, 2.25f);
+ float4 expectedB = float4(0.0f, 1.0f, 0.75f, 2.25f);
+ bool _55 = false;
+ if (max(_10_testInputs.x, 0.5f) == 0.5f)
+ {
+ float2 _46 = max(_10_testInputs.xy, 0.5f.xx);
+ _55 = all(bool2(_46.x == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.x, _46.y == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.y));
+ }
+ else
+ {
+ _55 = false;
+ }
+ bool _68 = false;
+ if (_55)
+ {
+ float3 _58 = max(_10_testInputs.xyz, 0.5f.xxx);
+ _68 = all(bool3(_58.x == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.x, _58.y == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.y, _58.z == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _68 = false;
+ }
+ bool _78 = false;
+ if (_68)
+ {
+ float4 _71 = max(_10_testInputs, 0.5f.xxxx);
+ _78 = all(bool4(_71.x == float4(0.5f, 0.5f, 0.75f, 2.25f).x, _71.y == float4(0.5f, 0.5f, 0.75f, 2.25f).y, _71.z == float4(0.5f, 0.5f, 0.75f, 2.25f).z, _71.w == float4(0.5f, 0.5f, 0.75f, 2.25f).w));
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _82 = false;
+ if (_78)
+ {
+ _82 = true;
+ }
+ else
+ {
+ _82 = false;
+ }
+ bool _88 = false;
+ if (_82)
+ {
+ _88 = all(bool2(0.5f.xx.x == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.x, 0.5f.xx.y == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.y));
+ }
+ else
+ {
+ _88 = false;
+ }
+ bool _95 = false;
+ if (_88)
+ {
+ _95 = all(bool3(float3(0.5f, 0.5f, 0.75f).x == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.x, float3(0.5f, 0.5f, 0.75f).y == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.y, float3(0.5f, 0.5f, 0.75f).z == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _95 = false;
+ }
+ bool _98 = false;
+ if (_95)
+ {
+ _98 = true;
+ }
+ else
+ {
+ _98 = false;
+ }
+ bool _110 = false;
+ if (_98)
+ {
+ _110 = max(_10_testInputs.x, _10_colorGreen.x) == 0.0f;
+ }
+ else
+ {
+ _110 = false;
+ }
+ bool _123 = false;
+ if (_110)
+ {
+ float2 _113 = max(_10_testInputs.xy, _10_colorGreen.xy);
+ _123 = all(bool2(_113.x == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.x, _113.y == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.y));
+ }
+ else
+ {
+ _123 = false;
+ }
+ bool _136 = false;
+ if (_123)
+ {
+ float3 _126 = max(_10_testInputs.xyz, _10_colorGreen.xyz);
+ _136 = all(bool3(_126.x == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.x, _126.y == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.y, _126.z == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _136 = false;
+ }
+ bool _146 = false;
+ if (_136)
+ {
+ float4 _139 = max(_10_testInputs, _10_colorGreen);
+ _146 = all(bool4(_139.x == float4(0.0f, 1.0f, 0.75f, 2.25f).x, _139.y == float4(0.0f, 1.0f, 0.75f, 2.25f).y, _139.z == float4(0.0f, 1.0f, 0.75f, 2.25f).z, _139.w == float4(0.0f, 1.0f, 0.75f, 2.25f).w));
+ }
+ else
+ {
+ _146 = false;
+ }
+ bool _149 = false;
+ if (_146)
+ {
+ _149 = true;
+ }
+ else
+ {
+ _149 = false;
+ }
+ bool _156 = false;
+ if (_149)
+ {
+ _156 = all(bool2(float2(0.0f, 1.0f).x == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.x, float2(0.0f, 1.0f).y == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.y));
+ }
+ else
+ {
+ _156 = false;
+ }
+ bool _163 = false;
+ if (_156)
+ {
+ _163 = all(bool3(float3(0.0f, 1.0f, 0.75f).x == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.x, float3(0.0f, 1.0f, 0.75f).y == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.y, float3(0.0f, 1.0f, 0.75f).z == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _163 = false;
+ }
+ bool _166 = false;
+ if (_163)
+ {
+ _166 = true;
+ }
+ else
+ {
+ _166 = false;
+ }
+ float4 _167 = 0.0f.xxxx;
+ if (_166)
+ {
+ _167 = _10_colorGreen;
+ }
+ else
+ {
+ _167 = _10_colorRed;
+ }
+ return _167;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MaxInt.hlsl b/tests/sksl/intrinsics/MaxInt.hlsl
new file mode 100644
index 0000000..aca4bc2
--- /dev/null
+++ b/tests/sksl/intrinsics/MaxInt.hlsl
@@ -0,0 +1,192 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _35 = _10_testInputs * 100.0f;
+ int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
+ int4 intValues = _44;
+ float4 _49 = _10_colorGreen * 100.0f;
+ int4 _58 = int4(int(_49.x), int(_49.y), int(_49.z), int(_49.w));
+ int4 intGreen = _58;
+ int4 expectedA = int4(50, 50, 75, 225);
+ int4 expectedB = int4(0, 100, 75, 225);
+ int _69 = _44.x;
+ bool _81 = false;
+ if (max(_69, 50) == 50)
+ {
+ int2 _73 = max(_44.xy, int2(50, 50));
+ _81 = all(bool2(_73.x == int4(50, 50, 75, 225).xy.x, _73.y == int4(50, 50, 75, 225).xy.y));
+ }
+ else
+ {
+ _81 = false;
+ }
+ bool _92 = false;
+ if (_81)
+ {
+ int3 _84 = max(_44.xyz, int3(50, 50, 50));
+ _92 = all(bool3(_84.x == int4(50, 50, 75, 225).xyz.x, _84.y == int4(50, 50, 75, 225).xyz.y, _84.z == int4(50, 50, 75, 225).xyz.z));
+ }
+ else
+ {
+ _92 = false;
+ }
+ bool _100 = false;
+ if (_92)
+ {
+ int4 _95 = max(_44, int4(50, 50, 50, 50));
+ _100 = all(bool4(_95.x == int4(50, 50, 75, 225).x, _95.y == int4(50, 50, 75, 225).y, _95.z == int4(50, 50, 75, 225).z, _95.w == int4(50, 50, 75, 225).w));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _104 = false;
+ if (_100)
+ {
+ _104 = true;
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _110 = false;
+ if (_104)
+ {
+ _110 = all(bool2(int2(50, 50).x == int4(50, 50, 75, 225).xy.x, int2(50, 50).y == int4(50, 50, 75, 225).xy.y));
+ }
+ else
+ {
+ _110 = false;
+ }
+ bool _117 = false;
+ if (_110)
+ {
+ _117 = all(bool3(int3(50, 50, 75).x == int4(50, 50, 75, 225).xyz.x, int3(50, 50, 75).y == int4(50, 50, 75, 225).xyz.y, int3(50, 50, 75).z == int4(50, 50, 75, 225).xyz.z));
+ }
+ else
+ {
+ _117 = false;
+ }
+ bool _120 = false;
+ if (_117)
+ {
+ _120 = true;
+ }
+ else
+ {
+ _120 = false;
+ }
+ bool _126 = false;
+ if (_120)
+ {
+ _126 = max(_69, _58.x) == 0;
+ }
+ else
+ {
+ _126 = false;
+ }
+ bool _135 = false;
+ if (_126)
+ {
+ int2 _129 = max(_44.xy, _58.xy);
+ _135 = all(bool2(_129.x == int4(0, 100, 75, 225).xy.x, _129.y == int4(0, 100, 75, 225).xy.y));
+ }
+ else
+ {
+ _135 = false;
+ }
+ bool _144 = false;
+ if (_135)
+ {
+ int3 _138 = max(_44.xyz, _58.xyz);
+ _144 = all(bool3(_138.x == int4(0, 100, 75, 225).xyz.x, _138.y == int4(0, 100, 75, 225).xyz.y, _138.z == int4(0, 100, 75, 225).xyz.z));
+ }
+ else
+ {
+ _144 = false;
+ }
+ bool _150 = false;
+ if (_144)
+ {
+ int4 _147 = max(_44, _58);
+ _150 = all(bool4(_147.x == int4(0, 100, 75, 225).x, _147.y == int4(0, 100, 75, 225).y, _147.z == int4(0, 100, 75, 225).z, _147.w == int4(0, 100, 75, 225).w));
+ }
+ else
+ {
+ _150 = false;
+ }
+ bool _153 = false;
+ if (_150)
+ {
+ _153 = true;
+ }
+ else
+ {
+ _153 = false;
+ }
+ bool _160 = false;
+ if (_153)
+ {
+ _160 = all(bool2(int2(0, 100).x == int4(0, 100, 75, 225).xy.x, int2(0, 100).y == int4(0, 100, 75, 225).xy.y));
+ }
+ else
+ {
+ _160 = false;
+ }
+ bool _167 = false;
+ if (_160)
+ {
+ _167 = all(bool3(int3(0, 100, 75).x == int4(0, 100, 75, 225).xyz.x, int3(0, 100, 75).y == int4(0, 100, 75, 225).xyz.y, int3(0, 100, 75).z == int4(0, 100, 75, 225).xyz.z));
+ }
+ else
+ {
+ _167 = false;
+ }
+ bool _170 = false;
+ if (_167)
+ {
+ _170 = true;
+ }
+ else
+ {
+ _170 = false;
+ }
+ float4 _171 = 0.0f.xxxx;
+ if (_170)
+ {
+ _171 = _10_colorGreen;
+ }
+ else
+ {
+ _171 = _10_colorRed;
+ }
+ return _171;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MinFloat.hlsl b/tests/sksl/intrinsics/MinFloat.hlsl
new file mode 100644
index 0000000..ec4668c
--- /dev/null
+++ b/tests/sksl/intrinsics/MinFloat.hlsl
@@ -0,0 +1,185 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedA = float4(-1.25f, 0.0f, 0.5f, 0.5f);
+ float4 expectedB = float4(-1.25f, 0.0f, 0.0f, 1.0f);
+ bool _54 = false;
+ if (min(_10_testInputs.x, 0.5f) == (-1.25f))
+ {
+ float2 _45 = min(_10_testInputs.xy, 0.5f.xx);
+ _54 = all(bool2(_45.x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.x, _45.y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.y));
+ }
+ else
+ {
+ _54 = false;
+ }
+ bool _67 = false;
+ if (_54)
+ {
+ float3 _57 = min(_10_testInputs.xyz, 0.5f.xxx);
+ _67 = all(bool3(_57.x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.x, _57.y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.y, _57.z == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.z));
+ }
+ else
+ {
+ _67 = false;
+ }
+ bool _77 = false;
+ if (_67)
+ {
+ float4 _70 = min(_10_testInputs, 0.5f.xxxx);
+ _77 = all(bool4(_70.x == float4(-1.25f, 0.0f, 0.5f, 0.5f).x, _70.y == float4(-1.25f, 0.0f, 0.5f, 0.5f).y, _70.z == float4(-1.25f, 0.0f, 0.5f, 0.5f).z, _70.w == float4(-1.25f, 0.0f, 0.5f, 0.5f).w));
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _81 = false;
+ if (_77)
+ {
+ _81 = true;
+ }
+ else
+ {
+ _81 = false;
+ }
+ bool _88 = false;
+ if (_81)
+ {
+ _88 = all(bool2(float2(-1.25f, 0.0f).x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.x, float2(-1.25f, 0.0f).y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.y));
+ }
+ else
+ {
+ _88 = false;
+ }
+ bool _95 = false;
+ if (_88)
+ {
+ _95 = all(bool3(float3(-1.25f, 0.0f, 0.5f).x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.x, float3(-1.25f, 0.0f, 0.5f).y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.y, float3(-1.25f, 0.0f, 0.5f).z == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.z));
+ }
+ else
+ {
+ _95 = false;
+ }
+ bool _98 = false;
+ if (_95)
+ {
+ _98 = true;
+ }
+ else
+ {
+ _98 = false;
+ }
+ bool _110 = false;
+ if (_98)
+ {
+ _110 = min(_10_testInputs.x, _10_colorGreen.x) == (-1.25f);
+ }
+ else
+ {
+ _110 = false;
+ }
+ bool _123 = false;
+ if (_110)
+ {
+ float2 _113 = min(_10_testInputs.xy, _10_colorGreen.xy);
+ _123 = all(bool2(_113.x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.x, _113.y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _123 = false;
+ }
+ bool _136 = false;
+ if (_123)
+ {
+ float3 _126 = min(_10_testInputs.xyz, _10_colorGreen.xyz);
+ _136 = all(bool3(_126.x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.x, _126.y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.y, _126.z == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _136 = false;
+ }
+ bool _146 = false;
+ if (_136)
+ {
+ float4 _139 = min(_10_testInputs, _10_colorGreen);
+ _146 = all(bool4(_139.x == float4(-1.25f, 0.0f, 0.0f, 1.0f).x, _139.y == float4(-1.25f, 0.0f, 0.0f, 1.0f).y, _139.z == float4(-1.25f, 0.0f, 0.0f, 1.0f).z, _139.w == float4(-1.25f, 0.0f, 0.0f, 1.0f).w));
+ }
+ else
+ {
+ _146 = false;
+ }
+ bool _149 = false;
+ if (_146)
+ {
+ _149 = true;
+ }
+ else
+ {
+ _149 = false;
+ }
+ bool _155 = false;
+ if (_149)
+ {
+ _155 = all(bool2(float2(-1.25f, 0.0f).x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.x, float2(-1.25f, 0.0f).y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _155 = false;
+ }
+ bool _162 = false;
+ if (_155)
+ {
+ _162 = all(bool3(float3(-1.25f, 0.0f, 0.0f).x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.x, float3(-1.25f, 0.0f, 0.0f).y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.y, float3(-1.25f, 0.0f, 0.0f).z == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _162 = false;
+ }
+ bool _165 = false;
+ if (_162)
+ {
+ _165 = true;
+ }
+ else
+ {
+ _165 = false;
+ }
+ float4 _166 = 0.0f.xxxx;
+ if (_165)
+ {
+ _166 = _10_colorGreen;
+ }
+ else
+ {
+ _166 = _10_colorRed;
+ }
+ return _166;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MinInt.hlsl b/tests/sksl/intrinsics/MinInt.hlsl
new file mode 100644
index 0000000..c95a6e2
--- /dev/null
+++ b/tests/sksl/intrinsics/MinInt.hlsl
@@ -0,0 +1,192 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _35 = _10_testInputs * 100.0f;
+ int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
+ int4 intValues = _44;
+ float4 _49 = _10_colorGreen * 100.0f;
+ int4 _58 = int4(int(_49.x), int(_49.y), int(_49.z), int(_49.w));
+ int4 intGreen = _58;
+ int4 expectedA = int4(-125, 0, 50, 50);
+ int4 expectedB = int4(-125, 0, 0, 100);
+ int _68 = _44.x;
+ bool _80 = false;
+ if (min(_68, 50) == (-125))
+ {
+ int2 _72 = min(_44.xy, int2(50, 50));
+ _80 = all(bool2(_72.x == int4(-125, 0, 50, 50).xy.x, _72.y == int4(-125, 0, 50, 50).xy.y));
+ }
+ else
+ {
+ _80 = false;
+ }
+ bool _91 = false;
+ if (_80)
+ {
+ int3 _83 = min(_44.xyz, int3(50, 50, 50));
+ _91 = all(bool3(_83.x == int4(-125, 0, 50, 50).xyz.x, _83.y == int4(-125, 0, 50, 50).xyz.y, _83.z == int4(-125, 0, 50, 50).xyz.z));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _99 = false;
+ if (_91)
+ {
+ int4 _94 = min(_44, int4(50, 50, 50, 50));
+ _99 = all(bool4(_94.x == int4(-125, 0, 50, 50).x, _94.y == int4(-125, 0, 50, 50).y, _94.z == int4(-125, 0, 50, 50).z, _94.w == int4(-125, 0, 50, 50).w));
+ }
+ else
+ {
+ _99 = false;
+ }
+ bool _103 = false;
+ if (_99)
+ {
+ _103 = true;
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _110 = false;
+ if (_103)
+ {
+ _110 = all(bool2(int2(-125, 0).x == int4(-125, 0, 50, 50).xy.x, int2(-125, 0).y == int4(-125, 0, 50, 50).xy.y));
+ }
+ else
+ {
+ _110 = false;
+ }
+ bool _117 = false;
+ if (_110)
+ {
+ _117 = all(bool3(int3(-125, 0, 50).x == int4(-125, 0, 50, 50).xyz.x, int3(-125, 0, 50).y == int4(-125, 0, 50, 50).xyz.y, int3(-125, 0, 50).z == int4(-125, 0, 50, 50).xyz.z));
+ }
+ else
+ {
+ _117 = false;
+ }
+ bool _120 = false;
+ if (_117)
+ {
+ _120 = true;
+ }
+ else
+ {
+ _120 = false;
+ }
+ bool _126 = false;
+ if (_120)
+ {
+ _126 = min(_68, _58.x) == (-125);
+ }
+ else
+ {
+ _126 = false;
+ }
+ bool _135 = false;
+ if (_126)
+ {
+ int2 _129 = min(_44.xy, _58.xy);
+ _135 = all(bool2(_129.x == int4(-125, 0, 0, 100).xy.x, _129.y == int4(-125, 0, 0, 100).xy.y));
+ }
+ else
+ {
+ _135 = false;
+ }
+ bool _144 = false;
+ if (_135)
+ {
+ int3 _138 = min(_44.xyz, _58.xyz);
+ _144 = all(bool3(_138.x == int4(-125, 0, 0, 100).xyz.x, _138.y == int4(-125, 0, 0, 100).xyz.y, _138.z == int4(-125, 0, 0, 100).xyz.z));
+ }
+ else
+ {
+ _144 = false;
+ }
+ bool _150 = false;
+ if (_144)
+ {
+ int4 _147 = min(_44, _58);
+ _150 = all(bool4(_147.x == int4(-125, 0, 0, 100).x, _147.y == int4(-125, 0, 0, 100).y, _147.z == int4(-125, 0, 0, 100).z, _147.w == int4(-125, 0, 0, 100).w));
+ }
+ else
+ {
+ _150 = false;
+ }
+ bool _153 = false;
+ if (_150)
+ {
+ _153 = true;
+ }
+ else
+ {
+ _153 = false;
+ }
+ bool _159 = false;
+ if (_153)
+ {
+ _159 = all(bool2(int2(-125, 0).x == int4(-125, 0, 0, 100).xy.x, int2(-125, 0).y == int4(-125, 0, 0, 100).xy.y));
+ }
+ else
+ {
+ _159 = false;
+ }
+ bool _166 = false;
+ if (_159)
+ {
+ _166 = all(bool3(int3(-125, 0, 0).x == int4(-125, 0, 0, 100).xyz.x, int3(-125, 0, 0).y == int4(-125, 0, 0, 100).xyz.y, int3(-125, 0, 0).z == int4(-125, 0, 0, 100).xyz.z));
+ }
+ else
+ {
+ _166 = false;
+ }
+ bool _169 = false;
+ if (_166)
+ {
+ _169 = true;
+ }
+ else
+ {
+ _169 = false;
+ }
+ float4 _170 = 0.0f.xxxx;
+ if (_169)
+ {
+ _170 = _10_colorGreen;
+ }
+ else
+ {
+ _170 = _10_colorRed;
+ }
+ return _170;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MixBool.hlsl b/tests/sksl/intrinsics/MixBool.hlsl
new file mode 100644
index 0000000..e6886c1
--- /dev/null
+++ b/tests/sksl/intrinsics/MixBool.hlsl
@@ -0,0 +1,359 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float4 _10_colorBlack : packoffset(c2);
+ float4 _10_colorWhite : packoffset(c3);
+ float4 _10_testInputs : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _35 = _10_colorGreen * 100.0f;
+ int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
+ int4 intGreen = _44;
+ float4 _49 = _10_colorRed * 100.0f;
+ int4 _58 = int4(int(_49.x), int(_49.y), int(_49.z), int(_49.w));
+ int4 intRed = _58;
+ int _61 = _44.x;
+ int _62 = _58.x;
+ bool _77 = false;
+ if ((false ? _62 : _61) == _61)
+ {
+ int2 _72 = _44.xy;
+ int2 _73 = _58.xy;
+ int2 _66 = int2(bool2(false, false).x ? _73.x : _72.x, bool2(false, false).y ? _73.y : _72.y);
+ int2 _74 = _44.xy;
+ _77 = all(bool2(_66.x == _74.x, _66.y == _74.y));
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _91 = false;
+ if (_77)
+ {
+ int3 _86 = _44.xyz;
+ int3 _87 = _58.xyz;
+ int3 _80 = int3(bool3(false, false, false).x ? _87.x : _86.x, bool3(false, false, false).y ? _87.y : _86.y, bool3(false, false, false).z ? _87.z : _86.z);
+ int3 _88 = _44.xyz;
+ _91 = all(bool3(_80.x == _88.x, _80.y == _88.y, _80.z == _88.z));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _99 = false;
+ if (_91)
+ {
+ int4 _94 = int4(bool4(false, false, false, false).x ? _58.x : _44.x, bool4(false, false, false, false).y ? _58.y : _44.y, bool4(false, false, false, false).z ? _58.z : _44.z, bool4(false, false, false, false).w ? _58.w : _44.w);
+ _99 = all(bool4(_94.x == _44.x, _94.y == _44.y, _94.z == _44.z, _94.w == _44.w));
+ }
+ else
+ {
+ _99 = false;
+ }
+ bool _105 = false;
+ if (_99)
+ {
+ _105 = (true ? _62 : _61) == _62;
+ }
+ else
+ {
+ _105 = false;
+ }
+ bool _117 = false;
+ if (_105)
+ {
+ int2 _112 = _44.xy;
+ int2 _113 = _58.xy;
+ int2 _108 = int2(bool2(true, true).x ? _113.x : _112.x, bool2(true, true).y ? _113.y : _112.y);
+ int2 _114 = _58.xy;
+ _117 = all(bool2(_108.x == _114.x, _108.y == _114.y));
+ }
+ else
+ {
+ _117 = false;
+ }
+ bool _129 = false;
+ if (_117)
+ {
+ int3 _124 = _44.xyz;
+ int3 _125 = _58.xyz;
+ int3 _120 = int3(bool3(true, true, true).x ? _125.x : _124.x, bool3(true, true, true).y ? _125.y : _124.y, bool3(true, true, true).z ? _125.z : _124.z);
+ int3 _126 = _58.xyz;
+ _129 = all(bool3(_120.x == _126.x, _120.y == _126.y, _120.z == _126.z));
+ }
+ else
+ {
+ _129 = false;
+ }
+ bool _136 = false;
+ if (_129)
+ {
+ int4 _132 = int4(bool4(true, true, true, true).x ? _58.x : _44.x, bool4(true, true, true, true).y ? _58.y : _44.y, bool4(true, true, true, true).z ? _58.z : _44.z, bool4(true, true, true, true).w ? _58.w : _44.w);
+ _136 = all(bool4(_132.x == _58.x, _132.y == _58.y, _132.z == _58.z, _132.w == _58.w));
+ }
+ else
+ {
+ _136 = false;
+ }
+ bool _140 = false;
+ if (_136)
+ {
+ _140 = 0 == _61;
+ }
+ else
+ {
+ _140 = false;
+ }
+ bool _148 = false;
+ if (_140)
+ {
+ int2 _145 = _44.xy;
+ _148 = all(bool2(int2(0, 100).x == _145.x, int2(0, 100).y == _145.y));
+ }
+ else
+ {
+ _148 = false;
+ }
+ bool _155 = false;
+ if (_148)
+ {
+ int3 _152 = _44.xyz;
+ _155 = all(bool3(int3(0, 100, 0).x == _152.x, int3(0, 100, 0).y == _152.y, int3(0, 100, 0).z == _152.z));
+ }
+ else
+ {
+ _155 = false;
+ }
+ bool _161 = false;
+ if (_155)
+ {
+ _161 = all(bool4(int4(0, 100, 0, 100).x == _44.x, int4(0, 100, 0, 100).y == _44.y, int4(0, 100, 0, 100).z == _44.z, int4(0, 100, 0, 100).w == _44.w));
+ }
+ else
+ {
+ _161 = false;
+ }
+ bool _165 = false;
+ if (_161)
+ {
+ _165 = 100 == _62;
+ }
+ else
+ {
+ _165 = false;
+ }
+ bool _172 = false;
+ if (_165)
+ {
+ int2 _169 = _58.xy;
+ _172 = all(bool2(int2(100, 0).x == _169.x, int2(100, 0).y == _169.y));
+ }
+ else
+ {
+ _172 = false;
+ }
+ bool _179 = false;
+ if (_172)
+ {
+ int3 _176 = _58.xyz;
+ _179 = all(bool3(int3(100, 0, 0).x == _176.x, int3(100, 0, 0).y == _176.y, int3(100, 0, 0).z == _176.z));
+ }
+ else
+ {
+ _179 = false;
+ }
+ bool _185 = false;
+ if (_179)
+ {
+ _185 = all(bool4(int4(100, 0, 0, 100).x == _58.x, int4(100, 0, 0, 100).y == _58.y, int4(100, 0, 0, 100).z == _58.z, int4(100, 0, 0, 100).w == _58.w));
+ }
+ else
+ {
+ _185 = false;
+ }
+ bool _205 = false;
+ if (_185)
+ {
+ _205 = (false ? _10_colorRed.x : _10_colorGreen.x) == _10_colorGreen.x;
+ }
+ else
+ {
+ _205 = false;
+ }
+ bool _226 = false;
+ if (_205)
+ {
+ float2 _208 = float2(bool2(false, false).x ? _10_colorRed.xy.x : _10_colorGreen.xy.x, bool2(false, false).y ? _10_colorRed.xy.y : _10_colorGreen.xy.y);
+ _226 = all(bool2(_208.x == _10_colorGreen.xy.x, _208.y == _10_colorGreen.xy.y));
+ }
+ else
+ {
+ _226 = false;
+ }
+ bool _248 = false;
+ if (_226)
+ {
+ float3 _229 = float3(bool3(false, false, false).x ? _10_colorRed.xyz.x : _10_colorGreen.xyz.x, bool3(false, false, false).y ? _10_colorRed.xyz.y : _10_colorGreen.xyz.y, bool3(false, false, false).z ? _10_colorRed.xyz.z : _10_colorGreen.xyz.z);
+ _248 = all(bool3(_229.x == _10_colorGreen.xyz.x, _229.y == _10_colorGreen.xyz.y, _229.z == _10_colorGreen.xyz.z));
+ }
+ else
+ {
+ _248 = false;
+ }
+ bool _264 = false;
+ if (_248)
+ {
+ float4 _251 = float4(bool4(false, false, false, false).x ? _10_colorRed.x : _10_colorGreen.x, bool4(false, false, false, false).y ? _10_colorRed.y : _10_colorGreen.y, bool4(false, false, false, false).z ? _10_colorRed.z : _10_colorGreen.z, bool4(false, false, false, false).w ? _10_colorRed.w : _10_colorGreen.w);
+ _264 = all(bool4(_251.x == _10_colorGreen.x, _251.y == _10_colorGreen.y, _251.z == _10_colorGreen.z, _251.w == _10_colorGreen.w));
+ }
+ else
+ {
+ _264 = false;
+ }
+ bool _284 = false;
+ if (_264)
+ {
+ _284 = (true ? _10_colorRed.x : _10_colorGreen.x) == _10_colorRed.x;
+ }
+ else
+ {
+ _284 = false;
+ }
+ bool _305 = false;
+ if (_284)
+ {
+ float2 _287 = float2(bool2(true, true).x ? _10_colorRed.xy.x : _10_colorGreen.xy.x, bool2(true, true).y ? _10_colorRed.xy.y : _10_colorGreen.xy.y);
+ _305 = all(bool2(_287.x == _10_colorRed.xy.x, _287.y == _10_colorRed.xy.y));
+ }
+ else
+ {
+ _305 = false;
+ }
+ bool _326 = false;
+ if (_305)
+ {
+ float3 _308 = float3(bool3(true, true, true).x ? _10_colorRed.xyz.x : _10_colorGreen.xyz.x, bool3(true, true, true).y ? _10_colorRed.xyz.y : _10_colorGreen.xyz.y, bool3(true, true, true).z ? _10_colorRed.xyz.z : _10_colorGreen.xyz.z);
+ _326 = all(bool3(_308.x == _10_colorRed.xyz.x, _308.y == _10_colorRed.xyz.y, _308.z == _10_colorRed.xyz.z));
+ }
+ else
+ {
+ _326 = false;
+ }
+ bool _342 = false;
+ if (_326)
+ {
+ float4 _329 = float4(bool4(true, true, true, true).x ? _10_colorRed.x : _10_colorGreen.x, bool4(true, true, true, true).y ? _10_colorRed.y : _10_colorGreen.y, bool4(true, true, true, true).z ? _10_colorRed.z : _10_colorGreen.z, bool4(true, true, true, true).w ? _10_colorRed.w : _10_colorGreen.w);
+ _342 = all(bool4(_329.x == _10_colorRed.x, _329.y == _10_colorRed.y, _329.z == _10_colorRed.z, _329.w == _10_colorRed.w));
+ }
+ else
+ {
+ _342 = false;
+ }
+ bool _349 = false;
+ if (_342)
+ {
+ _349 = 0.0f == _10_colorGreen.x;
+ }
+ else
+ {
+ _349 = false;
+ }
+ bool _359 = false;
+ if (_349)
+ {
+ _359 = all(bool2(float2(0.0f, 1.0f).x == _10_colorGreen.xy.x, float2(0.0f, 1.0f).y == _10_colorGreen.xy.y));
+ }
+ else
+ {
+ _359 = false;
+ }
+ bool _368 = false;
+ if (_359)
+ {
+ _368 = all(bool3(float3(0.0f, 1.0f, 0.0f).x == _10_colorGreen.xyz.x, float3(0.0f, 1.0f, 0.0f).y == _10_colorGreen.xyz.y, float3(0.0f, 1.0f, 0.0f).z == _10_colorGreen.xyz.z));
+ }
+ else
+ {
+ _368 = false;
+ }
+ bool _376 = false;
+ if (_368)
+ {
+ _376 = all(bool4(float4(0.0f, 1.0f, 0.0f, 1.0f).x == _10_colorGreen.x, float4(0.0f, 1.0f, 0.0f, 1.0f).y == _10_colorGreen.y, float4(0.0f, 1.0f, 0.0f, 1.0f).z == _10_colorGreen.z, float4(0.0f, 1.0f, 0.0f, 1.0f).w == _10_colorGreen.w));
+ }
+ else
+ {
+ _376 = false;
+ }
+ bool _383 = false;
+ if (_376)
+ {
+ _383 = 1.0f == _10_colorRed.x;
+ }
+ else
+ {
+ _383 = false;
+ }
+ bool _392 = false;
+ if (_383)
+ {
+ _392 = all(bool2(float2(1.0f, 0.0f).x == _10_colorRed.xy.x, float2(1.0f, 0.0f).y == _10_colorRed.xy.y));
+ }
+ else
+ {
+ _392 = false;
+ }
+ bool _401 = false;
+ if (_392)
+ {
+ _401 = all(bool3(float3(1.0f, 0.0f, 0.0f).x == _10_colorRed.xyz.x, float3(1.0f, 0.0f, 0.0f).y == _10_colorRed.xyz.y, float3(1.0f, 0.0f, 0.0f).z == _10_colorRed.xyz.z));
+ }
+ else
+ {
+ _401 = false;
+ }
+ bool _409 = false;
+ if (_401)
+ {
+ _409 = all(bool4(float4(1.0f, 0.0f, 0.0f, 1.0f).x == _10_colorRed.x, float4(1.0f, 0.0f, 0.0f, 1.0f).y == _10_colorRed.y, float4(1.0f, 0.0f, 0.0f, 1.0f).z == _10_colorRed.z, float4(1.0f, 0.0f, 0.0f, 1.0f).w == _10_colorRed.w));
+ }
+ else
+ {
+ _409 = false;
+ }
+ float4 _410 = 0.0f.xxxx;
+ if (_409)
+ {
+ _410 = _10_colorGreen;
+ }
+ else
+ {
+ _410 = _10_colorRed;
+ }
+ return _410;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/MixFloat.hlsl b/tests/sksl/intrinsics/MixFloat.hlsl
new file mode 100644
index 0000000..bdd8ed4
--- /dev/null
+++ b/tests/sksl/intrinsics/MixFloat.hlsl
@@ -0,0 +1,227 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float4 _10_colorBlack : packoffset(c2);
+ float4 _10_colorWhite : packoffset(c3);
+ float4 _10_testInputs : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedBW = float4(0.5f, 0.5f, 0.5f, 1.0f);
+ float4 expectedWT = float4(1.0f, 0.5f, 1.0f, 2.25f);
+ float4 _35 = lerp(_10_colorGreen, _10_colorRed, 0.0f.xxxx);
+ bool _62 = false;
+ if (all(bool4(_35.x == float4(0.0f, 1.0f, 0.0f, 1.0f).x, _35.y == float4(0.0f, 1.0f, 0.0f, 1.0f).y, _35.z == float4(0.0f, 1.0f, 0.0f, 1.0f).z, _35.w == float4(0.0f, 1.0f, 0.0f, 1.0f).w)))
+ {
+ float4 _51 = lerp(_10_colorGreen, _10_colorRed, 0.25f.xxxx);
+ _62 = all(bool4(_51.x == float4(0.25f, 0.75f, 0.0f, 1.0f).x, _51.y == float4(0.25f, 0.75f, 0.0f, 1.0f).y, _51.z == float4(0.25f, 0.75f, 0.0f, 1.0f).z, _51.w == float4(0.25f, 0.75f, 0.0f, 1.0f).w));
+ }
+ else
+ {
+ _62 = false;
+ }
+ bool _74 = false;
+ if (_62)
+ {
+ float4 _65 = lerp(_10_colorGreen, _10_colorRed, 0.75f.xxxx);
+ _74 = all(bool4(_65.x == float4(0.75f, 0.25f, 0.0f, 1.0f).x, _65.y == float4(0.75f, 0.25f, 0.0f, 1.0f).y, _65.z == float4(0.75f, 0.25f, 0.0f, 1.0f).z, _65.w == float4(0.75f, 0.25f, 0.0f, 1.0f).w));
+ }
+ else
+ {
+ _74 = false;
+ }
+ bool _86 = false;
+ if (_74)
+ {
+ float4 _77 = lerp(_10_colorGreen, _10_colorRed, 1.0f.xxxx);
+ _86 = all(bool4(_77.x == float4(1.0f, 0.0f, 0.0f, 1.0f).x, _77.y == float4(1.0f, 0.0f, 0.0f, 1.0f).y, _77.z == float4(1.0f, 0.0f, 0.0f, 1.0f).z, _77.w == float4(1.0f, 0.0f, 0.0f, 1.0f).w));
+ }
+ else
+ {
+ _86 = false;
+ }
+ bool _99 = false;
+ if (_86)
+ {
+ _99 = lerp(_10_colorBlack.x, _10_colorWhite.x, 0.5f) == 0.5f;
+ }
+ else
+ {
+ _99 = false;
+ }
+ bool _114 = false;
+ if (_99)
+ {
+ float2 _102 = lerp(_10_colorBlack.xy, _10_colorWhite.xy, 0.5f.xx);
+ _114 = all(bool2(_102.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.x, _102.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.y));
+ }
+ else
+ {
+ _114 = false;
+ }
+ bool _130 = false;
+ if (_114)
+ {
+ float3 _117 = lerp(_10_colorBlack.xyz, _10_colorWhite.xyz, 0.5f.xxx);
+ _130 = all(bool3(_117.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.x, _117.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.y, _117.z == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _130 = false;
+ }
+ bool _141 = false;
+ if (_130)
+ {
+ float4 _133 = lerp(_10_colorBlack, _10_colorWhite, 0.5f.xxxx);
+ _141 = all(bool4(_133.x == float4(0.5f, 0.5f, 0.5f, 1.0f).x, _133.y == float4(0.5f, 0.5f, 0.5f, 1.0f).y, _133.z == float4(0.5f, 0.5f, 0.5f, 1.0f).z, _133.w == float4(0.5f, 0.5f, 0.5f, 1.0f).w));
+ }
+ else
+ {
+ _141 = false;
+ }
+ bool _145 = false;
+ if (_141)
+ {
+ _145 = true;
+ }
+ else
+ {
+ _145 = false;
+ }
+ bool _151 = false;
+ if (_145)
+ {
+ _151 = all(bool2(0.5f.xx.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.x, 0.5f.xx.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.y));
+ }
+ else
+ {
+ _151 = false;
+ }
+ bool _157 = false;
+ if (_151)
+ {
+ _157 = all(bool3(0.5f.xxx.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.x, 0.5f.xxx.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.y, 0.5f.xxx.z == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _157 = false;
+ }
+ bool _160 = false;
+ if (_157)
+ {
+ _160 = true;
+ }
+ else
+ {
+ _160 = false;
+ }
+ bool _172 = false;
+ if (_160)
+ {
+ _172 = lerp(_10_colorWhite.x, _10_testInputs.x, 0.0f) == 1.0f;
+ }
+ else
+ {
+ _172 = false;
+ }
+ bool _186 = false;
+ if (_172)
+ {
+ float2 _175 = lerp(_10_colorWhite.xy, _10_testInputs.xy, float2(0.0f, 0.5f));
+ _186 = all(bool2(_175.x == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.x, _175.y == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.y));
+ }
+ else
+ {
+ _186 = false;
+ }
+ bool _200 = false;
+ if (_186)
+ {
+ float3 _189 = lerp(_10_colorWhite.xyz, _10_testInputs.xyz, float3(0.0f, 0.5f, 0.0f));
+ _200 = all(bool3(_189.x == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.x, _189.y == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.y, _189.z == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _200 = false;
+ }
+ bool _211 = false;
+ if (_200)
+ {
+ float4 _203 = lerp(_10_colorWhite, _10_testInputs, float4(0.0f, 0.5f, 0.0f, 1.0f));
+ _211 = all(bool4(_203.x == float4(1.0f, 0.5f, 1.0f, 2.25f).x, _203.y == float4(1.0f, 0.5f, 1.0f, 2.25f).y, _203.z == float4(1.0f, 0.5f, 1.0f, 2.25f).z, _203.w == float4(1.0f, 0.5f, 1.0f, 2.25f).w));
+ }
+ else
+ {
+ _211 = false;
+ }
+ bool _214 = false;
+ if (_211)
+ {
+ _214 = true;
+ }
+ else
+ {
+ _214 = false;
+ }
+ bool _221 = false;
+ if (_214)
+ {
+ _221 = all(bool2(float2(1.0f, 0.5f).x == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.x, float2(1.0f, 0.5f).y == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.y));
+ }
+ else
+ {
+ _221 = false;
+ }
+ bool _228 = false;
+ if (_221)
+ {
+ _228 = all(bool3(float3(1.0f, 0.5f, 1.0f).x == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.x, float3(1.0f, 0.5f, 1.0f).y == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.y, float3(1.0f, 0.5f, 1.0f).z == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.z));
+ }
+ else
+ {
+ _228 = false;
+ }
+ bool _231 = false;
+ if (_228)
+ {
+ _231 = true;
+ }
+ else
+ {
+ _231 = false;
+ }
+ float4 _232 = 0.0f.xxxx;
+ if (_231)
+ {
+ _232 = _10_colorGreen;
+ }
+ else
+ {
+ _232 = _10_colorRed;
+ }
+ return _232;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Mod.hlsl b/tests/sksl/intrinsics/Mod.hlsl
new file mode 100644
index 0000000..3b46785
--- /dev/null
+++ b/tests/sksl/intrinsics/Mod.hlsl
@@ -0,0 +1,206 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+ float4 _10_colorWhite : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float mod(float x, float y)
+{
+ return x - y * floor(x / y);
+}
+
+float2 mod(float2 x, float2 y)
+{
+ return x - y * floor(x / y);
+}
+
+float3 mod(float3 x, float3 y)
+{
+ return x - y * floor(x / y);
+}
+
+float4 mod(float4 x, float4 y)
+{
+ return x - y * floor(x / y);
+}
+
+float4 main(float2 _24)
+{
+ float4 expectedA = float4(0.75f, 0.0f, 0.75f, 0.25f);
+ float4 expectedB = float4(0.25f, 0.0f, 0.75f, 1.0f);
+ bool _54 = false;
+ if (mod(_10_testInputs.x, 1.0f) == 0.75f)
+ {
+ float2 _45 = mod(_10_testInputs.xy, 1.0f.xx);
+ _54 = all(bool2(_45.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.x, _45.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.y));
+ }
+ else
+ {
+ _54 = false;
+ }
+ bool _67 = false;
+ if (_54)
+ {
+ float3 _57 = mod(_10_testInputs.xyz, 1.0f.xxx);
+ _67 = all(bool3(_57.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.x, _57.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.y, _57.z == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.z));
+ }
+ else
+ {
+ _67 = false;
+ }
+ bool _77 = false;
+ if (_67)
+ {
+ float4 _70 = mod(_10_testInputs, 1.0f.xxxx);
+ _77 = all(bool4(_70.x == float4(0.75f, 0.0f, 0.75f, 0.25f).x, _70.y == float4(0.75f, 0.0f, 0.75f, 0.25f).y, _70.z == float4(0.75f, 0.0f, 0.75f, 0.25f).z, _70.w == float4(0.75f, 0.0f, 0.75f, 0.25f).w));
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _81 = false;
+ if (_77)
+ {
+ _81 = true;
+ }
+ else
+ {
+ _81 = false;
+ }
+ bool _88 = false;
+ if (_81)
+ {
+ _88 = all(bool2(float2(0.75f, 0.0f).x == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.x, float2(0.75f, 0.0f).y == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.y));
+ }
+ else
+ {
+ _88 = false;
+ }
+ bool _95 = false;
+ if (_88)
+ {
+ _95 = all(bool3(float3(0.75f, 0.0f, 0.75f).x == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.x, float3(0.75f, 0.0f, 0.75f).y == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.y, float3(0.75f, 0.0f, 0.75f).z == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.z));
+ }
+ else
+ {
+ _95 = false;
+ }
+ bool _98 = false;
+ if (_95)
+ {
+ _98 = true;
+ }
+ else
+ {
+ _98 = false;
+ }
+ bool _110 = false;
+ if (_98)
+ {
+ _110 = mod(_10_testInputs.x, _10_colorWhite.x) == 0.75f;
+ }
+ else
+ {
+ _110 = false;
+ }
+ bool _123 = false;
+ if (_110)
+ {
+ float2 _113 = mod(_10_testInputs.xy, _10_colorWhite.xy);
+ _123 = all(bool2(_113.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.x, _113.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.y));
+ }
+ else
+ {
+ _123 = false;
+ }
+ bool _136 = false;
+ if (_123)
+ {
+ float3 _126 = mod(_10_testInputs.xyz, _10_colorWhite.xyz);
+ _136 = all(bool3(_126.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.x, _126.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.y, _126.z == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.z));
+ }
+ else
+ {
+ _136 = false;
+ }
+ bool _146 = false;
+ if (_136)
+ {
+ float4 _139 = mod(_10_testInputs, _10_colorWhite);
+ _146 = all(bool4(_139.x == float4(0.75f, 0.0f, 0.75f, 0.25f).x, _139.y == float4(0.75f, 0.0f, 0.75f, 0.25f).y, _139.z == float4(0.75f, 0.0f, 0.75f, 0.25f).z, _139.w == float4(0.75f, 0.0f, 0.75f, 0.25f).w));
+ }
+ else
+ {
+ _146 = false;
+ }
+ bool _149 = false;
+ if (_146)
+ {
+ _149 = true;
+ }
+ else
+ {
+ _149 = false;
+ }
+ bool _156 = false;
+ if (_149)
+ {
+ _156 = all(bool2(float2(0.25f, 0.0f).x == float4(0.25f, 0.0f, 0.75f, 1.0f).xy.x, float2(0.25f, 0.0f).y == float4(0.25f, 0.0f, 0.75f, 1.0f).xy.y));
+ }
+ else
+ {
+ _156 = false;
+ }
+ bool _163 = false;
+ if (_156)
+ {
+ _163 = all(bool3(float3(0.25f, 0.0f, 0.75f).x == float4(0.25f, 0.0f, 0.75f, 1.0f).xyz.x, float3(0.25f, 0.0f, 0.75f).y == float4(0.25f, 0.0f, 0.75f, 1.0f).xyz.y, float3(0.25f, 0.0f, 0.75f).z == float4(0.25f, 0.0f, 0.75f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _163 = false;
+ }
+ bool _166 = false;
+ if (_163)
+ {
+ _166 = true;
+ }
+ else
+ {
+ _166 = false;
+ }
+ float4 _167 = 0.0f.xxxx;
+ if (_166)
+ {
+ _167 = _10_colorGreen;
+ }
+ else
+ {
+ _167 = _10_colorRed;
+ }
+ return _167;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Modf.hlsl b/tests/sksl/intrinsics/Modf.hlsl
new file mode 100644
index 0000000..b011bae
--- /dev/null
+++ b/tests/sksl/intrinsics/Modf.hlsl
@@ -0,0 +1,105 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 value = float4(2.5f, -2.5f, 8.0f, -0.125f);
+ bool4 ok = bool4(false, false, false, false);
+ float4 whole = 0.0f.xxxx;
+ float _45 = 0.0f;
+ float _40 = modf(2.5f, _45);
+ whole.x = _45;
+ float4 fraction = 0.0f.xxxx;
+ fraction.x = _40;
+ bool _58 = false;
+ if (whole.x == 2.0f)
+ {
+ _58 = fraction.x == 0.5f;
+ }
+ else
+ {
+ _58 = false;
+ }
+ ok.x = _58;
+ float2 _64 = 0.0f.xx;
+ float2 _61 = modf(value.xy, _64);
+ float4 _66 = whole;
+ whole = float4(_64.x, _64.y, _66.z, _66.w);
+ float4 _68 = fraction;
+ fraction = float4(_61.x, _61.y, _68.z, _68.w);
+ bool _83 = false;
+ if (all(bool2(float4(_64.x, _64.y, _66.z, _66.w).xy.x == float2(2.0f, -2.0f).x, float4(_64.x, _64.y, _66.z, _66.w).xy.y == float2(2.0f, -2.0f).y)))
+ {
+ _83 = all(bool2(float4(_61.x, _61.y, _68.z, _68.w).xy.x == float2(0.5f, -0.5f).x, float4(_61.x, _61.y, _68.z, _68.w).xy.y == float2(0.5f, -0.5f).y));
+ }
+ else
+ {
+ _83 = false;
+ }
+ ok.y = _83;
+ float3 _90 = 0.0f.xxx;
+ float3 _86 = modf(value.xyz, _90);
+ float4 _93 = whole;
+ whole = float4(_90.x, _90.y, _90.z, _93.w);
+ float4 _95 = fraction;
+ fraction = float4(_86.x, _86.y, _86.z, _95.w);
+ bool _108 = false;
+ if (all(bool3(float4(_90.x, _90.y, _90.z, _93.w).xyz.x == float3(2.0f, -2.0f, 8.0f).x, float4(_90.x, _90.y, _90.z, _93.w).xyz.y == float3(2.0f, -2.0f, 8.0f).y, float4(_90.x, _90.y, _90.z, _93.w).xyz.z == float3(2.0f, -2.0f, 8.0f).z)))
+ {
+ _108 = all(bool3(float4(_86.x, _86.y, _86.z, _95.w).xyz.x == float3(0.5f, -0.5f, 0.0f).x, float4(_86.x, _86.y, _86.z, _95.w).xyz.y == float3(0.5f, -0.5f, 0.0f).y, float4(_86.x, _86.y, _86.z, _95.w).xyz.z == float3(0.5f, -0.5f, 0.0f).z));
+ }
+ else
+ {
+ _108 = false;
+ }
+ ok.z = _108;
+ float4 _113 = 0.0f.xxxx;
+ float4 _111 = modf(value, _113);
+ whole = _113;
+ fraction = _111;
+ bool _123 = false;
+ if (all(bool4(_113.x == float4(2.0f, -2.0f, 8.0f, 0.0f).x, _113.y == float4(2.0f, -2.0f, 8.0f, 0.0f).y, _113.z == float4(2.0f, -2.0f, 8.0f, 0.0f).z, _113.w == float4(2.0f, -2.0f, 8.0f, 0.0f).w)))
+ {
+ _123 = all(bool4(_111.x == float4(0.5f, -0.5f, 0.0f, -0.125f).x, _111.y == float4(0.5f, -0.5f, 0.0f, -0.125f).y, _111.z == float4(0.5f, -0.5f, 0.0f, -0.125f).z, _111.w == float4(0.5f, -0.5f, 0.0f, -0.125f).w));
+ }
+ else
+ {
+ _123 = false;
+ }
+ ok.w = _123;
+ float4 _128 = 0.0f.xxxx;
+ if (all(ok))
+ {
+ _128 = _10_colorGreen;
+ }
+ else
+ {
+ _128 = _10_colorRed;
+ }
+ return _128;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Normalize.hlsl b/tests/sksl/intrinsics/Normalize.hlsl
new file mode 100644
index 0000000..fa5b8af
--- /dev/null
+++ b/tests/sksl/intrinsics/Normalize.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedVec = float4(1.0f, 0.0f, 0.0f, 0.0f);
+ bool _49 = false;
+ if (sign(_10_inputVal.x) == 1.0f)
+ {
+ float2 _41 = normalize(_10_inputVal.xy);
+ _49 = all(bool2(_41.x == float4(1.0f, 0.0f, 0.0f, 0.0f).xy.x, _41.y == float4(1.0f, 0.0f, 0.0f, 0.0f).xy.y));
+ }
+ else
+ {
+ _49 = false;
+ }
+ bool _61 = false;
+ if (_49)
+ {
+ float3 _52 = normalize(_10_inputVal.xyz);
+ _61 = all(bool3(_52.x == float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.x, _52.y == float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.y, _52.z == float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.z));
+ }
+ else
+ {
+ _61 = false;
+ }
+ bool _70 = false;
+ if (_61)
+ {
+ float4 _64 = normalize(_10_inputVal);
+ _70 = all(bool4(_64.x == float4(1.0f, 0.0f, 0.0f, 0.0f).x, _64.y == float4(1.0f, 0.0f, 0.0f, 0.0f).y, _64.z == float4(1.0f, 0.0f, 0.0f, 0.0f).z, _64.w == float4(1.0f, 0.0f, 0.0f, 0.0f).w));
+ }
+ else
+ {
+ _70 = false;
+ }
+ bool _74 = false;
+ if (_70)
+ {
+ _74 = true;
+ }
+ else
+ {
+ _74 = false;
+ }
+ bool _81 = false;
+ if (_74)
+ {
+ _81 = all(bool2(float2(0.0f, 1.0f).x == float4(1.0f, 0.0f, 0.0f, 0.0f).yx.x, float2(0.0f, 1.0f).y == float4(1.0f, 0.0f, 0.0f, 0.0f).yx.y));
+ }
+ else
+ {
+ _81 = false;
+ }
+ bool _88 = false;
+ if (_81)
+ {
+ _88 = all(bool3(float3(0.0f, 1.0f, 0.0f).x == float4(1.0f, 0.0f, 0.0f, 0.0f).zxy.x, float3(0.0f, 1.0f, 0.0f).y == float4(1.0f, 0.0f, 0.0f, 0.0f).zxy.y, float3(0.0f, 1.0f, 0.0f).z == float4(1.0f, 0.0f, 0.0f, 0.0f).zxy.z));
+ }
+ else
+ {
+ _88 = false;
+ }
+ bool _91 = false;
+ if (_88)
+ {
+ _91 = true;
+ }
+ else
+ {
+ _91 = false;
+ }
+ float4 _92 = 0.0f.xxxx;
+ if (_91)
+ {
+ _92 = _10_colorGreen;
+ }
+ else
+ {
+ _92 = _10_colorRed;
+ }
+ return _92;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Not.hlsl b/tests/sksl/intrinsics/Not.hlsl
new file mode 100644
index 0000000..c2cc98a
--- /dev/null
+++ b/tests/sksl/intrinsics/Not.hlsl
@@ -0,0 +1,101 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputH4 : packoffset(c0);
+ float4 _10_expectedH4 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool4 _42 = bool4(_10_inputH4.x != 0.0f, _10_inputH4.y != 0.0f, _10_inputH4.z != 0.0f, _10_inputH4.w != 0.0f);
+ bool4 inputVal = _42;
+ bool4 _55 = bool4(_10_expectedH4.x != 0.0f, _10_expectedH4.y != 0.0f, _10_expectedH4.z != 0.0f, _10_expectedH4.w != 0.0f);
+ bool4 expected = _55;
+ bool2 _58 = _42.xy;
+ bool2 _57 = bool2(!_58.x, !_58.y);
+ bool2 _60 = _55.xy;
+ bool _71 = false;
+ if (all(bool2(_57.x == _60.x, _57.y == _60.y)))
+ {
+ bool3 _66 = _42.xyz;
+ bool3 _65 = bool3(!_66.x, !_66.y, !_66.z);
+ bool3 _68 = _55.xyz;
+ _71 = all(bool3(_65.x == _68.x, _65.y == _68.y, _65.z == _68.z));
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _77 = false;
+ if (_71)
+ {
+ bool4 _74 = bool4(!_42.x, !_42.y, !_42.z, !_42.w);
+ _77 = all(bool4(_74.x == _55.x, _74.y == _55.y, _74.z == _55.z, _74.w == _55.w));
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool _85 = false;
+ if (_77)
+ {
+ bool2 _82 = _55.xy;
+ _85 = all(bool2(bool2(false, true).x == _82.x, bool2(false, true).y == _82.y));
+ }
+ else
+ {
+ _85 = false;
+ }
+ bool _92 = false;
+ if (_85)
+ {
+ bool3 _89 = _55.xyz;
+ _92 = all(bool3(bool3(false, true, false).x == _89.x, bool3(false, true, false).y == _89.y, bool3(false, true, false).z == _89.z));
+ }
+ else
+ {
+ _92 = false;
+ }
+ bool _98 = false;
+ if (_92)
+ {
+ _98 = all(bool4(bool4(false, true, false, true).x == _55.x, bool4(false, true, false, true).y == _55.y, bool4(false, true, false, true).z == _55.z, bool4(false, true, false, true).w == _55.w));
+ }
+ else
+ {
+ _98 = false;
+ }
+ float4 _99 = 0.0f.xxxx;
+ if (_98)
+ {
+ _99 = _10_colorGreen;
+ }
+ else
+ {
+ _99 = _10_colorRed;
+ }
+ return _99;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/NotEqual.hlsl b/tests/sksl/intrinsics/NotEqual.hlsl
new file mode 100644
index 0000000..9019850
--- /dev/null
+++ b/tests/sksl/intrinsics/NotEqual.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+ uint2 _10_c : packoffset(c2);
+ uint2 _10_d : packoffset(c2.z);
+ int3 _10_e : packoffset(c3);
+ int3 _10_f : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool4 expectFFTT = bool4(false, false, true, true);
+ bool4 expectTTFF = bool4(true, true, false, false);
+ sk_FragColor.x = float(int(bool4(_10_a.x != _10_b.x, _10_a.y != _10_b.y, _10_a.z != _10_b.z, _10_a.w != _10_b.w).x));
+ sk_FragColor.y = float(int(bool2(_10_c.x != _10_d.x, _10_c.y != _10_d.y).y));
+ sk_FragColor.z = float(int(bool3(_10_e.x != _10_f.x, _10_e.y != _10_f.y, _10_e.z != _10_f.z).z));
+ bool _73 = false;
+ if (any(expectTTFF))
+ {
+ _73 = true;
+ }
+ else
+ {
+ _73 = any(expectFFTT);
+ }
+ sk_FragColor.w = float(int(_73));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/OuterProduct.hlsl b/tests/sksl/intrinsics/OuterProduct.hlsl
new file mode 100644
index 0000000..db9fb31
--- /dev/null
+++ b/tests/sksl/intrinsics/OuterProduct.hlsl
@@ -0,0 +1,113 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
+ row_major float3x3 _10_testMatrix3x3 : packoffset(c4);
+ float4 _10_testInputs : packoffset(c7);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ float2x2 _30 = float2x2(_10_testMatrix2x2[0] * _10_testMatrix2x2[1].x, _10_testMatrix2x2[0] * _10_testMatrix2x2[1].y);
+ float2 _51 = _30[0];
+ float2 _54 = _30[1];
+ bool _91 = false;
+ if (all(bool2(_51.x == float2(3.0f, 6.0f).x, _51.y == float2(3.0f, 6.0f).y)) && all(bool2(_54.x == float2(4.0f, 8.0f).x, _54.y == float2(4.0f, 8.0f).y)))
+ {
+ float3x3 _60 = float3x3(_10_testMatrix3x3[0] * _10_testMatrix3x3[1].x, _10_testMatrix3x3[0] * _10_testMatrix3x3[1].y, _10_testMatrix3x3[0] * _10_testMatrix3x3[1].z);
+ float3 _80 = _60[0];
+ float3 _83 = _60[1];
+ float3 _87 = _60[2];
+ _91 = (all(bool3(_80.x == float3(4.0f, 8.0f, 12.0f).x, _80.y == float3(4.0f, 8.0f, 12.0f).y, _80.z == float3(4.0f, 8.0f, 12.0f).z)) && all(bool3(_83.x == float3(5.0f, 10.0f, 15.0f).x, _83.y == float3(5.0f, 10.0f, 15.0f).y, _83.z == float3(5.0f, 10.0f, 15.0f).z))) && all(bool3(_87.x == float3(6.0f, 12.0f, 18.0f).x, _87.y == float3(6.0f, 12.0f, 18.0f).y, _87.z == float3(6.0f, 12.0f, 18.0f).z));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _116 = false;
+ if (_91)
+ {
+ float3x2 _94 = float3x2(_10_testMatrix2x2[0] * _10_testMatrix3x3[1].x, _10_testMatrix2x2[0] * _10_testMatrix3x3[1].y, _10_testMatrix2x2[0] * _10_testMatrix3x3[1].z);
+ float2 _105 = _94[0];
+ float2 _108 = _94[1];
+ float2 _112 = _94[2];
+ _116 = (all(bool2(_105.x == float2(4.0f, 8.0f).x, _105.y == float2(4.0f, 8.0f).y)) && all(bool2(_108.x == float2(5.0f, 10.0f).x, _108.y == float2(5.0f, 10.0f).y))) && all(bool2(_112.x == float2(6.0f, 12.0f).x, _112.y == float2(6.0f, 12.0f).y));
+ }
+ else
+ {
+ _116 = false;
+ }
+ bool _154 = false;
+ if (_116)
+ {
+ float4x4 _119 = float4x4(_10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).x, _10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).y, _10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).z, _10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).w);
+ float4 _139 = _119[0];
+ float4 _142 = _119[1];
+ float4 _146 = _119[2];
+ float4 _150 = _119[3];
+ _154 = ((all(bool4(_139.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _139.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _139.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _139.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w)) && all(bool4(_142.x == 0.0f.xxxx.x, _142.y == 0.0f.xxxx.y, _142.z == 0.0f.xxxx.z, _142.w == 0.0f.xxxx.w))) && all(bool4(_146.x == 0.0f.xxxx.x, _146.y == 0.0f.xxxx.y, _146.z == 0.0f.xxxx.z, _146.w == 0.0f.xxxx.w))) && all(bool4(_150.x == float4(-2.5f, 0.0f, 1.5f, 4.5f).x, _150.y == float4(-2.5f, 0.0f, 1.5f, 4.5f).y, _150.z == float4(-2.5f, 0.0f, 1.5f, 4.5f).z, _150.w == float4(-2.5f, 0.0f, 1.5f, 4.5f).w));
+ }
+ else
+ {
+ _154 = false;
+ }
+ bool _170 = false;
+ if (_154)
+ {
+ float2x4 _157 = float2x4(_10_testInputs * float2(1.0f, 2.0f).x, _10_testInputs * float2(1.0f, 2.0f).y);
+ float4 _163 = _157[0];
+ float4 _166 = _157[1];
+ _170 = all(bool4(_163.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _163.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _163.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _163.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w)) && all(bool4(_166.x == float4(-2.5f, 0.0f, 1.5f, 4.5f).x, _166.y == float4(-2.5f, 0.0f, 1.5f, 4.5f).y, _166.z == float4(-2.5f, 0.0f, 1.5f, 4.5f).z, _166.w == float4(-2.5f, 0.0f, 1.5f, 4.5f).w));
+ }
+ else
+ {
+ _170 = false;
+ }
+ bool _196 = false;
+ if (_170)
+ {
+ float4x2 _173 = float4x2(float2(1.0f, 2.0f) * _10_testInputs.x, float2(1.0f, 2.0f) * _10_testInputs.y, float2(1.0f, 2.0f) * _10_testInputs.z, float2(1.0f, 2.0f) * _10_testInputs.w);
+ float2 _181 = _173[0];
+ float2 _184 = _173[1];
+ float2 _188 = _173[2];
+ float2 _192 = _173[3];
+ _196 = ((all(bool2(_181.x == float2(-1.25f, -2.5f).x, _181.y == float2(-1.25f, -2.5f).y)) && all(bool2(_184.x == 0.0f.xx.x, _184.y == 0.0f.xx.y))) && all(bool2(_188.x == float2(0.75f, 1.5f).x, _188.y == float2(0.75f, 1.5f).y))) && all(bool2(_192.x == float2(2.25f, 4.5f).x, _192.y == float2(2.25f, 4.5f).y));
+ }
+ else
+ {
+ _196 = false;
+ }
+ float4 _197 = 0.0f.xxxx;
+ if (_196)
+ {
+ _197 = _10_colorGreen;
+ }
+ else
+ {
+ _197 = _10_colorRed;
+ }
+ return _197;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Pack.hlsl b/tests/sksl/intrinsics/Pack.hlsl
new file mode 100644
index 0000000..09d9200
--- /dev/null
+++ b/tests/sksl/intrinsics/Pack.hlsl
@@ -0,0 +1,91 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float2 _10_a : packoffset(c0);
+ float4 _10_b : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+uint spvPackHalf2x16(float2 value)
+{
+ uint2 Packed = f32tof16(value);
+ return Packed.x | (Packed.y << 16);
+}
+
+float2 spvUnpackHalf2x16(uint value)
+{
+ return f16tof32(uint2(value & 0xffff, value >> 16));
+}
+
+uint spvPackUnorm4x8(float4 value)
+{
+ uint4 Packed = uint4(round(saturate(value) * 255.0));
+ return Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24);
+}
+
+float4 spvUnpackUnorm4x8(uint value)
+{
+ uint4 Packed = uint4(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, value >> 24);
+ return float4(Packed) / 255.0;
+}
+
+uint spvPackSnorm4x8(float4 value)
+{
+ int4 Packed = int4(round(clamp(value, -1.0, 1.0) * 127.0)) & 0xff;
+ return uint(Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24));
+}
+
+float4 spvUnpackSnorm4x8(uint value)
+{
+ int SignedValue = int(value);
+ int4 Packed = int4(SignedValue << 24, SignedValue << 16, SignedValue << 8, SignedValue) >> 24;
+ return clamp(float4(Packed) / 127.0, -1.0, 1.0);
+}
+
+uint spvPackUnorm2x16(float2 value)
+{
+ uint2 Packed = uint2(round(saturate(value) * 65535.0));
+ return Packed.x | (Packed.y << 16);
+}
+
+float2 spvUnpackUnorm2x16(uint value)
+{
+ uint2 Packed = uint2(value & 0xffff, value >> 16);
+ return float2(Packed) / 65535.0;
+}
+
+uint spvPackSnorm2x16(float2 value)
+{
+ int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
+ return uint(Packed.x | (Packed.y << 16));
+}
+
+float2 spvUnpackSnorm2x16(uint value)
+{
+ int SignedValue = int(value);
+ int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
+ return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
+}
+
+void frag_main()
+{
+ sk_FragColor.x = float(spvPackHalf2x16(_10_a));
+ sk_FragColor.x = float(spvPackUnorm2x16(_10_a));
+ sk_FragColor.x = float(spvPackSnorm2x16(_10_a));
+ sk_FragColor.x = float(spvPackUnorm4x8(_10_b));
+ sk_FragColor.x = float(spvPackSnorm4x8(_10_b));
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/PackHalf2x16.hlsl b/tests/sksl/intrinsics/PackHalf2x16.hlsl
new file mode 100644
index 0000000..e40a51a
--- /dev/null
+++ b/tests/sksl/intrinsics/PackHalf2x16.hlsl
@@ -0,0 +1,68 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float4 _10_testInputs : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+uint spvPackHalf2x16(float2 value)
+{
+ uint2 Packed = f32tof16(value);
+ return Packed.x | (Packed.y << 16);
+}
+
+float2 spvUnpackHalf2x16(uint value)
+{
+ return f16tof32(uint2(value & 0xffff, value >> 16));
+}
+
+float4 main(float2 _24)
+{
+ uint _29 = spvPackHalf2x16(_10_testInputs.xy);
+ uint xy = _29;
+ uint _37 = spvPackHalf2x16(_10_testInputs.zw);
+ uint zw = _37;
+ float2 _42 = spvUnpackHalf2x16(_29);
+ bool _56 = false;
+ if (all(bool2(_42.x == float2(-1.25f, 0.0f).x, _42.y == float2(-1.25f, 0.0f).y)))
+ {
+ float2 _50 = spvUnpackHalf2x16(_37);
+ _56 = all(bool2(_50.x == float2(0.75f, 2.25f).x, _50.y == float2(0.75f, 2.25f).y));
+ }
+ else
+ {
+ _56 = false;
+ }
+ float4 _57 = 0.0f.xxxx;
+ if (_56)
+ {
+ _57 = _10_colorGreen;
+ }
+ else
+ {
+ _57 = _10_colorRed;
+ }
+ return _57;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/PackSnorm2x16.hlsl b/tests/sksl/intrinsics/PackSnorm2x16.hlsl
new file mode 100644
index 0000000..c16e9d8
--- /dev/null
+++ b/tests/sksl/intrinsics/PackSnorm2x16.hlsl
@@ -0,0 +1,70 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float4 _10_testInputs : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+uint spvPackSnorm2x16(float2 value)
+{
+ int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
+ return uint(Packed.x | (Packed.y << 16));
+}
+
+float2 spvUnpackSnorm2x16(uint value)
+{
+ int SignedValue = int(value);
+ int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
+ return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
+}
+
+float4 main(float2 _24)
+{
+ uint _29 = spvPackSnorm2x16(_10_testInputs.xy);
+ uint xy = _29;
+ uint _37 = spvPackSnorm2x16(_10_testInputs.zw);
+ uint zw = _37;
+ float2 _44 = abs(spvUnpackSnorm2x16(_29) - float2(-1.0f, 0.0f));
+ bool _62 = false;
+ if (all(bool2(_44.x < 0.015625f.xx.x, _44.y < 0.015625f.xx.y)))
+ {
+ float2 _56 = abs(spvUnpackSnorm2x16(_37) - float2(0.75f, 1.0f));
+ _62 = all(bool2(_56.x < 0.015625f.xx.x, _56.y < 0.015625f.xx.y));
+ }
+ else
+ {
+ _62 = false;
+ }
+ float4 _63 = 0.0f.xxxx;
+ if (_62)
+ {
+ _63 = _10_colorGreen;
+ }
+ else
+ {
+ _63 = _10_colorRed;
+ }
+ return _63;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/PackUnorm2x16.hlsl b/tests/sksl/intrinsics/PackUnorm2x16.hlsl
new file mode 100644
index 0000000..7297d99
--- /dev/null
+++ b/tests/sksl/intrinsics/PackUnorm2x16.hlsl
@@ -0,0 +1,69 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float4 _10_testInputs : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+uint spvPackUnorm2x16(float2 value)
+{
+ uint2 Packed = uint2(round(saturate(value) * 65535.0));
+ return Packed.x | (Packed.y << 16);
+}
+
+float2 spvUnpackUnorm2x16(uint value)
+{
+ uint2 Packed = uint2(value & 0xffff, value >> 16);
+ return float2(Packed) / 65535.0;
+}
+
+float4 main(float2 _24)
+{
+ uint _29 = spvPackUnorm2x16(_10_testInputs.xy);
+ uint xy = _29;
+ uint _37 = spvPackUnorm2x16(_10_testInputs.zw);
+ uint zw = _37;
+ float2 _44 = abs(spvUnpackUnorm2x16(_29));
+ bool _59 = false;
+ if (all(bool2(_44.x < 0.015625f.xx.x, _44.y < 0.015625f.xx.y)))
+ {
+ float2 _53 = abs(spvUnpackUnorm2x16(_37) - float2(0.75f, 1.0f));
+ _59 = all(bool2(_53.x < 0.015625f.xx.x, _53.y < 0.015625f.xx.y));
+ }
+ else
+ {
+ _59 = false;
+ }
+ float4 _60 = 0.0f.xxxx;
+ if (_59)
+ {
+ _60 = _10_colorGreen;
+ }
+ else
+ {
+ _60 = _10_colorRed;
+ }
+ return _60;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Pow.hlsl b/tests/sksl/intrinsics/Pow.hlsl
new file mode 100644
index 0000000..705f896
--- /dev/null
+++ b/tests/sksl/intrinsics/Pow.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(-1.5625f, 0.0f, 0.75f, 3.375f);
+ bool _54 = false;
+ if (pow(_10_testInputs.x, 2.0f) == (-1.5625f))
+ {
+ float2 _44 = pow(_10_testInputs.xy, float2(2.0f, 3.0f));
+ _54 = all(bool2(_44.x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.x, _44.y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.y));
+ }
+ else
+ {
+ _54 = false;
+ }
+ bool _68 = false;
+ if (_54)
+ {
+ float3 _57 = pow(_10_testInputs.xyz, float3(2.0f, 3.0f, 1.0f));
+ _68 = all(bool3(_57.x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.x, _57.y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.y, _57.z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.z));
+ }
+ else
+ {
+ _68 = false;
+ }
+ bool _79 = false;
+ if (_68)
+ {
+ float4 _71 = pow(_10_testInputs, float4(2.0f, 3.0f, 1.0f, 1.5f));
+ _79 = all(bool4(_71.x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).x, _71.y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).y, _71.z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).z, _71.w == float4(-1.5625f, 0.0f, 0.75f, 3.375f).w));
+ }
+ else
+ {
+ _79 = false;
+ }
+ bool _84 = false;
+ if (_79)
+ {
+ _84 = 1.5625f == (-1.5625f);
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _91 = false;
+ if (_84)
+ {
+ _91 = all(bool2(float2(1.5625f, 0.0f).x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.x, float2(1.5625f, 0.0f).y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _98 = false;
+ if (_91)
+ {
+ _98 = all(bool3(float3(1.5625f, 0.0f, 0.75f).x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.x, float3(1.5625f, 0.0f, 0.75f).y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.y, float3(1.5625f, 0.0f, 0.75f).z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.z));
+ }
+ else
+ {
+ _98 = false;
+ }
+ bool _104 = false;
+ if (_98)
+ {
+ _104 = all(bool4(float4(1.5625f, 0.0f, 0.75f, 3.375f).x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).x, float4(1.5625f, 0.0f, 0.75f, 3.375f).y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).y, float4(1.5625f, 0.0f, 0.75f, 3.375f).z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).z, float4(1.5625f, 0.0f, 0.75f, 3.375f).w == float4(-1.5625f, 0.0f, 0.75f, 3.375f).w));
+ }
+ else
+ {
+ _104 = false;
+ }
+ float4 _105 = 0.0f.xxxx;
+ if (_104)
+ {
+ _105 = _10_colorGreen;
+ }
+ else
+ {
+ _105 = _10_colorRed;
+ }
+ return _105;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Radians.hlsl b/tests/sksl/intrinsics/Radians.hlsl
new file mode 100644
index 0000000..72fca52
--- /dev/null
+++ b/tests/sksl/intrinsics/Radians.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (radians(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = radians(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = radians(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = radians(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Reflect.hlsl b/tests/sksl/intrinsics/Reflect.hlsl
new file mode 100644
index 0000000..21559d6
--- /dev/null
+++ b/tests/sksl/intrinsics/Reflect.hlsl
@@ -0,0 +1,118 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_I : packoffset(c0);
+ float4 _10_N : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float spvReflect(float i, float n)
+{
+ return i - 2.0 * dot(n, i) * n;
+}
+
+float4 main(float2 _24)
+{
+ float expectedX = -49.0f;
+ float2 expectedXY = float2(-169.0f, 202.0f);
+ float3 expectedXYZ = float3(-379.0f, 454.0f, -529.0f);
+ float4 expectedXYZW = float4(-699.0f, 838.0f, -977.0f, 1116.0f);
+ bool _72 = false;
+ if (spvReflect(_10_I.x, _10_N.x) == (-49.0f))
+ {
+ float2 _62 = reflect(_10_I.xy, _10_N.xy);
+ _72 = all(bool2(_62.x == float2(-169.0f, 202.0f).x, _62.y == float2(-169.0f, 202.0f).y));
+ }
+ else
+ {
+ _72 = false;
+ }
+ bool _85 = false;
+ if (_72)
+ {
+ float3 _75 = reflect(_10_I.xyz, _10_N.xyz);
+ _85 = all(bool3(_75.x == float3(-379.0f, 454.0f, -529.0f).x, _75.y == float3(-379.0f, 454.0f, -529.0f).y, _75.z == float3(-379.0f, 454.0f, -529.0f).z));
+ }
+ else
+ {
+ _85 = false;
+ }
+ bool _96 = false;
+ if (_85)
+ {
+ float4 _88 = reflect(_10_I, _10_N);
+ _96 = all(bool4(_88.x == float4(-699.0f, 838.0f, -977.0f, 1116.0f).x, _88.y == float4(-699.0f, 838.0f, -977.0f, 1116.0f).y, _88.z == float4(-699.0f, 838.0f, -977.0f, 1116.0f).z, _88.w == float4(-699.0f, 838.0f, -977.0f, 1116.0f).w));
+ }
+ else
+ {
+ _96 = false;
+ }
+ bool _100 = false;
+ if (_96)
+ {
+ _100 = true;
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _103 = false;
+ if (_100)
+ {
+ _103 = true;
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _106 = false;
+ if (_103)
+ {
+ _106 = true;
+ }
+ else
+ {
+ _106 = false;
+ }
+ bool _109 = false;
+ if (_106)
+ {
+ _109 = true;
+ }
+ else
+ {
+ _109 = false;
+ }
+ float4 _110 = 0.0f.xxxx;
+ if (_109)
+ {
+ _110 = _10_colorGreen;
+ }
+ else
+ {
+ _110 = _10_colorRed;
+ }
+ return _110;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Refract.hlsl b/tests/sksl/intrinsics/Refract.hlsl
new file mode 100644
index 0000000..80e4dbd
--- /dev/null
+++ b/tests/sksl/intrinsics/Refract.hlsl
@@ -0,0 +1,48 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_a : packoffset(c0);
+ float _10_b : packoffset(c0.y);
+ float _10_c : packoffset(c0.z);
+ float4 _10_d : packoffset(c1);
+ float4 _10_e : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float spvRefract(float i, float n, float eta)
+{
+ float NoI = n * i;
+ float NoI2 = NoI * NoI;
+ float k = 1.0 - eta * eta * (1.0 - NoI2);
+ if (k < 0.0)
+ {
+ return 0.0;
+ }
+ else
+ {
+ return eta * i - (eta * NoI + sqrt(k)) * n;
+ }
+}
+
+void frag_main()
+{
+ sk_FragColor.x = spvRefract(_10_a, _10_b, _10_c);
+ sk_FragColor = refract(_10_d, _10_e, _10_c);
+ sk_FragColor = float4(float2(0.5f, -0.866025388240814208984375f).x, float2(0.5f, -0.866025388240814208984375f).y, sk_FragColor.z, sk_FragColor.w);
+ sk_FragColor = float4(float3(0.5f, 0.0f, -0.866025388240814208984375f).x, float3(0.5f, 0.0f, -0.866025388240814208984375f).y, float3(0.5f, 0.0f, -0.866025388240814208984375f).z, sk_FragColor.w);
+ sk_FragColor = float4(0.5f, 0.0f, 0.0f, -0.866025388240814208984375f);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Round.hlsl b/tests/sksl/intrinsics/Round.hlsl
new file mode 100644
index 0000000..4479268
--- /dev/null
+++ b/tests/sksl/intrinsics/Round.hlsl
@@ -0,0 +1,72 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _46 = false;
+ if (round(_10_testInputs.x) == (-1.0f))
+ {
+ float2 _38 = round(_10_testInputs.xy);
+ _46 = all(bool2(_38.x == float2(-1.0f, 0.0f).x, _38.y == float2(-1.0f, 0.0f).y));
+ }
+ else
+ {
+ _46 = false;
+ }
+ bool _59 = false;
+ if (_46)
+ {
+ float3 _49 = round(_10_testInputs.xyz);
+ _59 = all(bool3(_49.x == float3(-1.0f, 0.0f, 1.0f).x, _49.y == float3(-1.0f, 0.0f, 1.0f).y, _49.z == float3(-1.0f, 0.0f, 1.0f).z));
+ }
+ else
+ {
+ _59 = false;
+ }
+ bool _70 = false;
+ if (_59)
+ {
+ float4 _62 = round(_10_testInputs);
+ _70 = all(bool4(_62.x == float4(-1.0f, 0.0f, 1.0f, 2.0f).x, _62.y == float4(-1.0f, 0.0f, 1.0f, 2.0f).y, _62.z == float4(-1.0f, 0.0f, 1.0f, 2.0f).z, _62.w == float4(-1.0f, 0.0f, 1.0f, 2.0f).w));
+ }
+ else
+ {
+ _70 = false;
+ }
+ float4 _71 = 0.0f.xxxx;
+ if (_70)
+ {
+ _71 = _10_colorGreen;
+ }
+ else
+ {
+ _71 = _10_colorRed;
+ }
+ return _71;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/RoundEven.hlsl b/tests/sksl/intrinsics/RoundEven.hlsl
new file mode 100644
index 0000000..4479268
--- /dev/null
+++ b/tests/sksl/intrinsics/RoundEven.hlsl
@@ -0,0 +1,72 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _46 = false;
+ if (round(_10_testInputs.x) == (-1.0f))
+ {
+ float2 _38 = round(_10_testInputs.xy);
+ _46 = all(bool2(_38.x == float2(-1.0f, 0.0f).x, _38.y == float2(-1.0f, 0.0f).y));
+ }
+ else
+ {
+ _46 = false;
+ }
+ bool _59 = false;
+ if (_46)
+ {
+ float3 _49 = round(_10_testInputs.xyz);
+ _59 = all(bool3(_49.x == float3(-1.0f, 0.0f, 1.0f).x, _49.y == float3(-1.0f, 0.0f, 1.0f).y, _49.z == float3(-1.0f, 0.0f, 1.0f).z));
+ }
+ else
+ {
+ _59 = false;
+ }
+ bool _70 = false;
+ if (_59)
+ {
+ float4 _62 = round(_10_testInputs);
+ _70 = all(bool4(_62.x == float4(-1.0f, 0.0f, 1.0f, 2.0f).x, _62.y == float4(-1.0f, 0.0f, 1.0f, 2.0f).y, _62.z == float4(-1.0f, 0.0f, 1.0f, 2.0f).z, _62.w == float4(-1.0f, 0.0f, 1.0f, 2.0f).w));
+ }
+ else
+ {
+ _70 = false;
+ }
+ float4 _71 = 0.0f.xxxx;
+ if (_70)
+ {
+ _71 = _10_colorGreen;
+ }
+ else
+ {
+ _71 = _10_colorRed;
+ }
+ return _71;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Sample.hlsl b/tests/sksl/intrinsics/Sample.hlsl
new file mode 100644
index 0000000..d987263
--- /dev/null
+++ b/tests/sksl/intrinsics/Sample.hlsl
@@ -0,0 +1,24 @@
+Texture2D<float4> t : register(t0, space0);
+SamplerState _t_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _19 = t.Sample(_t_sampler, 0.0f.xx);
+ float4 c = _19;
+ sk_FragColor = _19 * t.Sample(_t_sampler, 1.0f.xxx.xy / 1.0f.xxx.z);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/SampleGrad.hlsl b/tests/sksl/intrinsics/SampleGrad.hlsl
new file mode 100644
index 0000000..43ad520
--- /dev/null
+++ b/tests/sksl/intrinsics/SampleGrad.hlsl
@@ -0,0 +1,33 @@
+cbuffer sksl_synthetic_uniforms : register(b0, space0)
+{
+ float2 _34_u_skRTFlip : packoffset(c1024);
+};
+
+Texture2D<float4> t : register(t0, space0);
+SamplerState _t_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ return t.SampleGrad(_t_sampler, _25, ddx(_25), ddy(_25) * _34_u_skRTFlip.y.xx);
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/SampleLod.hlsl b/tests/sksl/intrinsics/SampleLod.hlsl
new file mode 100644
index 0000000..9e826e5
--- /dev/null
+++ b/tests/sksl/intrinsics/SampleLod.hlsl
@@ -0,0 +1,24 @@
+Texture2D<float4> t : register(t0, space0);
+SamplerState _t_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _19 = t.SampleLevel(_t_sampler, 0.0f.xx, 0.0f);
+ float4 c = _19;
+ sk_FragColor = _19 * t.SampleLevel(_t_sampler, 1.0f.xxx.xy / 1.0f.xxx.z, 0.0f);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Saturate.hlsl b/tests/sksl/intrinsics/Saturate.hlsl
new file mode 100644
index 0000000..220b49f
--- /dev/null
+++ b/tests/sksl/intrinsics/Saturate.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(0.0f, 0.0f, 0.75f, 1.0f);
+ bool _51 = false;
+ if (clamp(_10_testInputs.x, 0.0f, 1.0f) == 0.0f)
+ {
+ float2 _42 = clamp(_10_testInputs.xy, 0.0f.xx, 1.0f.xx);
+ _51 = all(bool2(_42.x == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.x, _42.y == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = clamp(_10_testInputs.xyz, 0.0f.xxx, 1.0f.xxx);
+ _65 = all(bool3(_54.x == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.x, _54.y == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.y, _54.z == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = clamp(_10_testInputs, 0.0f.xxxx, 1.0f.xxxx);
+ _76 = all(bool4(_68.x == float4(0.0f, 0.0f, 0.75f, 1.0f).x, _68.y == float4(0.0f, 0.0f, 0.75f, 1.0f).y, _68.z == float4(0.0f, 0.0f, 0.75f, 1.0f).z, _68.w == float4(0.0f, 0.0f, 0.75f, 1.0f).w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _80 = false;
+ if (_76)
+ {
+ _80 = true;
+ }
+ else
+ {
+ _80 = false;
+ }
+ bool _86 = false;
+ if (_80)
+ {
+ _86 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.y));
+ }
+ else
+ {
+ _86 = false;
+ }
+ bool _93 = false;
+ if (_86)
+ {
+ _93 = all(bool3(float3(0.0f, 0.0f, 0.75f).x == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.x, float3(0.0f, 0.0f, 0.75f).y == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.y, float3(0.0f, 0.0f, 0.75f).z == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _96 = false;
+ if (_93)
+ {
+ _96 = true;
+ }
+ else
+ {
+ _96 = false;
+ }
+ float4 _97 = 0.0f.xxxx;
+ if (_96)
+ {
+ _97 = _10_colorGreen;
+ }
+ else
+ {
+ _97 = _10_colorRed;
+ }
+ return _97;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/SignFloat.hlsl b/tests/sksl/intrinsics/SignFloat.hlsl
new file mode 100644
index 0000000..62ea826
--- /dev/null
+++ b/tests/sksl/intrinsics/SignFloat.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expected = float4(-1.0f, 0.0f, 1.0f, 1.0f);
+ bool _50 = false;
+ if (sign(_10_testInputs.x) == (-1.0f))
+ {
+ float2 _42 = sign(_10_testInputs.xy);
+ _50 = all(bool2(_42.x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.x, _42.y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _50 = false;
+ }
+ bool _62 = false;
+ if (_50)
+ {
+ float3 _53 = sign(_10_testInputs.xyz);
+ _62 = all(bool3(_53.x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.x, _53.y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.y, _53.z == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _62 = false;
+ }
+ bool _71 = false;
+ if (_62)
+ {
+ float4 _65 = sign(_10_testInputs);
+ _71 = all(bool4(_65.x == float4(-1.0f, 0.0f, 1.0f, 1.0f).x, _65.y == float4(-1.0f, 0.0f, 1.0f, 1.0f).y, _65.z == float4(-1.0f, 0.0f, 1.0f, 1.0f).z, _65.w == float4(-1.0f, 0.0f, 1.0f, 1.0f).w));
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _75 = false;
+ if (_71)
+ {
+ _75 = true;
+ }
+ else
+ {
+ _75 = false;
+ }
+ bool _82 = false;
+ if (_75)
+ {
+ _82 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _82 = false;
+ }
+ bool _89 = false;
+ if (_82)
+ {
+ _89 = all(bool3(float3(-1.0f, 0.0f, 1.0f).x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.x, float3(-1.0f, 0.0f, 1.0f).y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.y, float3(-1.0f, 0.0f, 1.0f).z == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _89 = false;
+ }
+ bool _92 = false;
+ if (_89)
+ {
+ _92 = true;
+ }
+ else
+ {
+ _92 = false;
+ }
+ float4 _93 = 0.0f.xxxx;
+ if (_92)
+ {
+ _93 = _10_colorGreen;
+ }
+ else
+ {
+ _93 = _10_colorRed;
+ }
+ return _93;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/SignInt.hlsl b/tests/sksl/intrinsics/SignInt.hlsl
new file mode 100644
index 0000000..35f183c
--- /dev/null
+++ b/tests/sksl/intrinsics/SignInt.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int4 expected = int4(-1, 0, 0, 1);
+ bool _58 = false;
+ if (sign(int(_10_testInputs.x)) == (-1))
+ {
+ int2 _44 = sign(int2(int(_10_testInputs.xy.x), int(_10_testInputs.xy.y)));
+ _58 = all(bool2(_44.x == int4(-1, 0, 0, 1).xy.x, _44.y == int4(-1, 0, 0, 1).xy.y));
+ }
+ else
+ {
+ _58 = false;
+ }
+ bool _78 = false;
+ if (_58)
+ {
+ int3 _61 = sign(int3(int(_10_testInputs.xyz.x), int(_10_testInputs.xyz.y), int(_10_testInputs.xyz.z)));
+ _78 = all(bool3(_61.x == int4(-1, 0, 0, 1).xyz.x, _61.y == int4(-1, 0, 0, 1).xyz.y, _61.z == int4(-1, 0, 0, 1).xyz.z));
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _96 = false;
+ if (_78)
+ {
+ int4 _81 = sign(int4(int(_10_testInputs.x), int(_10_testInputs.y), int(_10_testInputs.z), int(_10_testInputs.w)));
+ _96 = all(bool4(_81.x == int4(-1, 0, 0, 1).x, _81.y == int4(-1, 0, 0, 1).y, _81.z == int4(-1, 0, 0, 1).z, _81.w == int4(-1, 0, 0, 1).w));
+ }
+ else
+ {
+ _96 = false;
+ }
+ bool _100 = false;
+ if (_96)
+ {
+ _100 = true;
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _107 = false;
+ if (_100)
+ {
+ _107 = all(bool2(int2(-1, 0).x == int4(-1, 0, 0, 1).xy.x, int2(-1, 0).y == int4(-1, 0, 0, 1).xy.y));
+ }
+ else
+ {
+ _107 = false;
+ }
+ bool _114 = false;
+ if (_107)
+ {
+ _114 = all(bool3(int3(-1, 0, 0).x == int4(-1, 0, 0, 1).xyz.x, int3(-1, 0, 0).y == int4(-1, 0, 0, 1).xyz.y, int3(-1, 0, 0).z == int4(-1, 0, 0, 1).xyz.z));
+ }
+ else
+ {
+ _114 = false;
+ }
+ bool _117 = false;
+ if (_114)
+ {
+ _117 = true;
+ }
+ else
+ {
+ _117 = false;
+ }
+ float4 _118 = 0.0f.xxxx;
+ if (_117)
+ {
+ _118 = _10_colorGreen;
+ }
+ else
+ {
+ _118 = _10_colorRed;
+ }
+ return _118;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Sin.hlsl b/tests/sksl/intrinsics/Sin.hlsl
new file mode 100644
index 0000000..f583319
--- /dev/null
+++ b/tests/sksl/intrinsics/Sin.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (sin(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = sin(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = sin(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = sin(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Sinh.hlsl b/tests/sksl/intrinsics/Sinh.hlsl
new file mode 100644
index 0000000..254a95f
--- /dev/null
+++ b/tests/sksl/intrinsics/Sinh.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (sinh(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = sinh(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = sinh(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = sinh(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Smoothstep.hlsl b/tests/sksl/intrinsics/Smoothstep.hlsl
new file mode 100644
index 0000000..a7000b4
--- /dev/null
+++ b/tests/sksl/intrinsics/Smoothstep.hlsl
@@ -0,0 +1,221 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedA = float4(0.0f, 0.0f, 0.84375f, 1.0f);
+ float4 expectedB = float4(1.0f, 0.0f, 1.0f, 1.0f);
+ bool _41 = false;
+ if (true)
+ {
+ _41 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.y));
+ }
+ else
+ {
+ _41 = false;
+ }
+ bool _50 = false;
+ if (_41)
+ {
+ _50 = all(bool3(float3(0.0f, 0.0f, 0.84375f).x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.x, float3(0.0f, 0.0f, 0.84375f).y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.y, float3(0.0f, 0.0f, 0.84375f).z == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _50 = false;
+ }
+ bool _53 = false;
+ if (_50)
+ {
+ _53 = true;
+ }
+ else
+ {
+ _53 = false;
+ }
+ bool _56 = false;
+ if (_53)
+ {
+ _56 = true;
+ }
+ else
+ {
+ _56 = false;
+ }
+ bool _62 = false;
+ if (_56)
+ {
+ _62 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.y));
+ }
+ else
+ {
+ _62 = false;
+ }
+ bool _68 = false;
+ if (_62)
+ {
+ _68 = all(bool3(float3(0.0f, 0.0f, 0.84375f).x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.x, float3(0.0f, 0.0f, 0.84375f).y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.y, float3(0.0f, 0.0f, 0.84375f).z == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _68 = false;
+ }
+ bool _71 = false;
+ if (_68)
+ {
+ _71 = true;
+ }
+ else
+ {
+ _71 = false;
+ }
+ bool _87 = false;
+ if (_71)
+ {
+ _87 = smoothstep(_10_colorRed.y, _10_colorGreen.y, -1.25f) == 0.0f;
+ }
+ else
+ {
+ _87 = false;
+ }
+ bool _103 = false;
+ if (_87)
+ {
+ float2 _90 = smoothstep(_10_colorRed.y.xx, _10_colorGreen.y.xx, float2(-1.25f, 0.0f));
+ _103 = all(bool2(_90.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.x, _90.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.y));
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _120 = false;
+ if (_103)
+ {
+ float3 _106 = smoothstep(_10_colorRed.y.xxx, _10_colorGreen.y.xxx, float3(-1.25f, 0.0f, 0.75f));
+ _120 = all(bool3(_106.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.x, _106.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.y, _106.z == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _120 = false;
+ }
+ bool _137 = false;
+ if (_120)
+ {
+ float4 _123 = smoothstep(_10_colorRed.y.xxxx, _10_colorGreen.y.xxxx, float4(-1.25f, 0.0f, 0.75f, 2.25f));
+ _137 = all(bool4(_123.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).x, _123.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).y, _123.z == float4(0.0f, 0.0f, 0.84375f, 1.0f).z, _123.w == float4(0.0f, 0.0f, 0.84375f, 1.0f).w));
+ }
+ else
+ {
+ _137 = false;
+ }
+ bool _140 = false;
+ if (_137)
+ {
+ _140 = true;
+ }
+ else
+ {
+ _140 = false;
+ }
+ bool _147 = false;
+ if (_140)
+ {
+ _147 = all(bool2(float2(1.0f, 0.0f).x == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.x, float2(1.0f, 0.0f).y == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _147 = false;
+ }
+ bool _154 = false;
+ if (_147)
+ {
+ _154 = all(bool3(float3(1.0f, 0.0f, 1.0f).x == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.x, float3(1.0f, 0.0f, 1.0f).y == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.y, float3(1.0f, 0.0f, 1.0f).z == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _154 = false;
+ }
+ bool _157 = false;
+ if (_154)
+ {
+ _157 = true;
+ }
+ else
+ {
+ _157 = false;
+ }
+ bool _168 = false;
+ if (_157)
+ {
+ _168 = smoothstep(_10_colorRed.x, _10_colorGreen.x, -1.25f) == 1.0f;
+ }
+ else
+ {
+ _168 = false;
+ }
+ bool _181 = false;
+ if (_168)
+ {
+ float2 _171 = smoothstep(_10_colorRed.xy, _10_colorGreen.xy, float2(-1.25f, 0.0f));
+ _181 = all(bool2(_171.x == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.x, _171.y == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _181 = false;
+ }
+ bool _194 = false;
+ if (_181)
+ {
+ float3 _184 = smoothstep(_10_colorRed.xyz, _10_colorGreen.xyz, float3(-1.25f, 0.0f, 0.75f));
+ _194 = all(bool3(_184.x == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.x, _184.y == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.y, _184.z == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _194 = false;
+ }
+ bool _204 = false;
+ if (_194)
+ {
+ float4 _197 = smoothstep(_10_colorRed, _10_colorGreen, float4(-1.25f, 0.0f, 0.75f, 2.25f));
+ _204 = all(bool4(_197.x == float4(1.0f, 0.0f, 1.0f, 1.0f).x, _197.y == float4(1.0f, 0.0f, 1.0f, 1.0f).y, _197.z == float4(1.0f, 0.0f, 1.0f, 1.0f).z, _197.w == float4(1.0f, 0.0f, 1.0f, 1.0f).w));
+ }
+ else
+ {
+ _204 = false;
+ }
+ float4 _205 = 0.0f.xxxx;
+ if (_204)
+ {
+ _205 = _10_colorGreen;
+ }
+ else
+ {
+ _205 = _10_colorRed;
+ }
+ return _205;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Sqrt.hlsl b/tests/sksl/intrinsics/Sqrt.hlsl
new file mode 100644
index 0000000..dfc6d7a
--- /dev/null
+++ b/tests/sksl/intrinsics/Sqrt.hlsl
@@ -0,0 +1,148 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (sqrt(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = sqrt(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = sqrt(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = sqrt(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _84 = false;
+ if (_76)
+ {
+ _84 = 1.0f == _10_expected.x;
+ }
+ else
+ {
+ _84 = false;
+ }
+ bool _94 = false;
+ if (_84)
+ {
+ _94 = all(bool2(float2(1.0f, 2.0f).x == _10_expected.xy.x, float2(1.0f, 2.0f).y == _10_expected.xy.y));
+ }
+ else
+ {
+ _94 = false;
+ }
+ bool _104 = false;
+ if (_94)
+ {
+ _104 = all(bool3(float3(1.0f, 2.0f, 4.0f).x == _10_expected.xyz.x, float3(1.0f, 2.0f, 4.0f).y == _10_expected.xyz.y, float3(1.0f, 2.0f, 4.0f).z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _113 = false;
+ if (_104)
+ {
+ _113 = all(bool4(float4(1.0f, 2.0f, 4.0f, 8.0f).x == _10_expected.x, float4(1.0f, 2.0f, 4.0f, 8.0f).y == _10_expected.y, float4(1.0f, 2.0f, 4.0f, 8.0f).z == _10_expected.z, float4(1.0f, 2.0f, 4.0f, 8.0f).w == _10_expected.w));
+ }
+ else
+ {
+ _113 = false;
+ }
+ bool _122 = false;
+ if (_113)
+ {
+ _122 = sqrt(-1.0f) == _10_expected.x;
+ }
+ else
+ {
+ _122 = false;
+ }
+ bool _133 = false;
+ if (_122)
+ {
+ float2 _125 = sqrt(float2(-1.0f, -4.0f));
+ _133 = all(bool2(_125.x == _10_expected.xy.x, _125.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _133 = false;
+ }
+ bool _144 = false;
+ if (_133)
+ {
+ float3 _136 = sqrt(float3(-1.0f, -4.0f, -16.0f));
+ _144 = all(bool3(_136.x == _10_expected.xyz.x, _136.y == _10_expected.xyz.y, _136.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _144 = false;
+ }
+ bool _154 = false;
+ if (_144)
+ {
+ float4 _147 = sqrt(float4(-1.0f, -4.0f, -16.0f, -64.0f));
+ _154 = all(bool4(_147.x == _10_expected.x, _147.y == _10_expected.y, _147.z == _10_expected.z, _147.w == _10_expected.w));
+ }
+ else
+ {
+ _154 = false;
+ }
+ float4 _155 = 0.0f.xxxx;
+ if (_154)
+ {
+ _155 = _10_colorGreen;
+ }
+ else
+ {
+ _155 = _10_colorRed;
+ }
+ return _155;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Step.hlsl b/tests/sksl/intrinsics/Step.hlsl
new file mode 100644
index 0000000..75f1d03
--- /dev/null
+++ b/tests/sksl/intrinsics/Step.hlsl
@@ -0,0 +1,185 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 expectedA = float4(0.0f, 0.0f, 1.0f, 1.0f);
+ float4 expectedB = float4(1.0f, 1.0f, 0.0f, 0.0f);
+ bool _53 = false;
+ if (step(0.5f, _10_testInputs.x) == 0.0f)
+ {
+ float2 _44 = step(0.5f.xx, _10_testInputs.xy);
+ _53 = all(bool2(_44.x == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.x, _44.y == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _53 = false;
+ }
+ bool _66 = false;
+ if (_53)
+ {
+ float3 _56 = step(0.5f.xxx, _10_testInputs.xyz);
+ _66 = all(bool3(_56.x == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.x, _56.y == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.y, _56.z == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _66 = false;
+ }
+ bool _76 = false;
+ if (_66)
+ {
+ float4 _69 = step(0.5f.xxxx, _10_testInputs);
+ _76 = all(bool4(_69.x == float4(0.0f, 0.0f, 1.0f, 1.0f).x, _69.y == float4(0.0f, 0.0f, 1.0f, 1.0f).y, _69.z == float4(0.0f, 0.0f, 1.0f, 1.0f).z, _69.w == float4(0.0f, 0.0f, 1.0f, 1.0f).w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _80 = false;
+ if (_76)
+ {
+ _80 = true;
+ }
+ else
+ {
+ _80 = false;
+ }
+ bool _86 = false;
+ if (_80)
+ {
+ _86 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.y));
+ }
+ else
+ {
+ _86 = false;
+ }
+ bool _93 = false;
+ if (_86)
+ {
+ _93 = all(bool3(float3(0.0f, 0.0f, 1.0f).x == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.x, float3(0.0f, 0.0f, 1.0f).y == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.y, float3(0.0f, 0.0f, 1.0f).z == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.z));
+ }
+ else
+ {
+ _93 = false;
+ }
+ bool _96 = false;
+ if (_93)
+ {
+ _96 = true;
+ }
+ else
+ {
+ _96 = false;
+ }
+ bool _104 = false;
+ if (_96)
+ {
+ _104 = step(_10_testInputs.x, 0.0f) == 1.0f;
+ }
+ else
+ {
+ _104 = false;
+ }
+ bool _115 = false;
+ if (_104)
+ {
+ float2 _107 = step(_10_testInputs.xy, float2(0.0f, 1.0f));
+ _115 = all(bool2(_107.x == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.x, _107.y == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.y));
+ }
+ else
+ {
+ _115 = false;
+ }
+ bool _126 = false;
+ if (_115)
+ {
+ float3 _118 = step(_10_testInputs.xyz, float3(0.0f, 1.0f, 0.0f));
+ _126 = all(bool3(_118.x == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.x, _118.y == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.y, _118.z == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.z));
+ }
+ else
+ {
+ _126 = false;
+ }
+ bool _135 = false;
+ if (_126)
+ {
+ float4 _129 = step(_10_testInputs, float4(0.0f, 1.0f, 0.0f, 1.0f));
+ _135 = all(bool4(_129.x == float4(1.0f, 1.0f, 0.0f, 0.0f).x, _129.y == float4(1.0f, 1.0f, 0.0f, 0.0f).y, _129.z == float4(1.0f, 1.0f, 0.0f, 0.0f).z, _129.w == float4(1.0f, 1.0f, 0.0f, 0.0f).w));
+ }
+ else
+ {
+ _135 = false;
+ }
+ bool _138 = false;
+ if (_135)
+ {
+ _138 = true;
+ }
+ else
+ {
+ _138 = false;
+ }
+ bool _145 = false;
+ if (_138)
+ {
+ _145 = all(bool2(1.0f.xx.x == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.x, 1.0f.xx.y == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.y));
+ }
+ else
+ {
+ _145 = false;
+ }
+ bool _152 = false;
+ if (_145)
+ {
+ _152 = all(bool3(float3(1.0f, 1.0f, 0.0f).x == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.x, float3(1.0f, 1.0f, 0.0f).y == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.y, float3(1.0f, 1.0f, 0.0f).z == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.z));
+ }
+ else
+ {
+ _152 = false;
+ }
+ bool _155 = false;
+ if (_152)
+ {
+ _155 = true;
+ }
+ else
+ {
+ _155 = false;
+ }
+ float4 _156 = 0.0f.xxxx;
+ if (_155)
+ {
+ _156 = _10_colorGreen;
+ }
+ else
+ {
+ _156 = _10_colorRed;
+ }
+ return _156;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Tan.hlsl b/tests/sksl/intrinsics/Tan.hlsl
new file mode 100644
index 0000000..54ab0d3
--- /dev/null
+++ b/tests/sksl/intrinsics/Tan.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (tan(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = tan(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = tan(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = tan(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Tanh.hlsl b/tests/sksl/intrinsics/Tanh.hlsl
new file mode 100644
index 0000000..2dba513
--- /dev/null
+++ b/tests/sksl/intrinsics/Tanh.hlsl
@@ -0,0 +1,109 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_inputVal : packoffset(c0);
+ float4 _10_expected : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _51 = false;
+ if (tanh(_10_inputVal.x) == _10_expected.x)
+ {
+ float2 _41 = tanh(_10_inputVal.xy);
+ _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _51 = false;
+ }
+ bool _65 = false;
+ if (_51)
+ {
+ float3 _54 = tanh(_10_inputVal.xyz);
+ _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float4 _68 = tanh(_10_inputVal);
+ _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ _83 = 0.0f == _10_expected.x;
+ }
+ else
+ {
+ _83 = false;
+ }
+ bool _91 = false;
+ if (_83)
+ {
+ _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
+ }
+ else
+ {
+ _91 = false;
+ }
+ bool _100 = false;
+ if (_91)
+ {
+ _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
+ }
+ else
+ {
+ _100 = false;
+ }
+ bool _108 = false;
+ if (_100)
+ {
+ _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
+ }
+ else
+ {
+ _108 = false;
+ }
+ float4 _109 = 0.0f.xxxx;
+ if (_108)
+ {
+ _109 = _10_colorGreen;
+ }
+ else
+ {
+ _109 = _10_colorRed;
+ }
+ return _109;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Transpose.hlsl b/tests/sksl/intrinsics/Transpose.hlsl
new file mode 100644
index 0000000..24bf05a
--- /dev/null
+++ b/tests/sksl/intrinsics/Transpose.hlsl
@@ -0,0 +1,73 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c0);
+ row_major float3x3 _10_testMatrix3x3 : packoffset(c2);
+ float4 _10_colorGreen : packoffset(c5);
+ float4 _10_colorRed : packoffset(c6);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ float2x3 testMatrix2x3 = float2x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f));
+ float2x2 _42 = transpose(_10_testMatrix2x2);
+ float2 _52 = _42[0];
+ float2 _55 = _42[1];
+ bool _78 = false;
+ if (all(bool2(_52.x == float2(1.0f, 3.0f).x, _52.y == float2(1.0f, 3.0f).y)) && all(bool2(_55.x == float2(2.0f, 4.0f).x, _55.y == float2(2.0f, 4.0f).y)))
+ {
+ float3x2 _61 = transpose(float2x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f)));
+ float2 _67 = _61[0];
+ float2 _70 = _61[1];
+ float2 _74 = _61[2];
+ _78 = (all(bool2(_67.x == float2(1.0f, 4.0f).x, _67.y == float2(1.0f, 4.0f).y)) && all(bool2(_70.x == float2(2.0f, 5.0f).x, _70.y == float2(2.0f, 5.0f).y))) && all(bool2(_74.x == float2(3.0f, 6.0f).x, _74.y == float2(3.0f, 6.0f).y));
+ }
+ else
+ {
+ _78 = false;
+ }
+ bool _105 = false;
+ if (_78)
+ {
+ float3x3 _81 = transpose(_10_testMatrix3x3);
+ float3 _94 = _81[0];
+ float3 _97 = _81[1];
+ float3 _101 = _81[2];
+ _105 = (all(bool3(_94.x == float3(1.0f, 4.0f, 7.0f).x, _94.y == float3(1.0f, 4.0f, 7.0f).y, _94.z == float3(1.0f, 4.0f, 7.0f).z)) && all(bool3(_97.x == float3(2.0f, 5.0f, 8.0f).x, _97.y == float3(2.0f, 5.0f, 8.0f).y, _97.z == float3(2.0f, 5.0f, 8.0f).z))) && all(bool3(_101.x == float3(3.0f, 6.0f, 9.0f).x, _101.y == float3(3.0f, 6.0f, 9.0f).y, _101.z == float3(3.0f, 6.0f, 9.0f).z));
+ }
+ else
+ {
+ _105 = false;
+ }
+ float4 _106 = 0.0f.xxxx;
+ if (_105)
+ {
+ _106 = _10_colorGreen;
+ }
+ else
+ {
+ _106 = _10_colorRed;
+ }
+ return _106;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Trunc.hlsl b/tests/sksl/intrinsics/Trunc.hlsl
new file mode 100644
index 0000000..51b44ef
--- /dev/null
+++ b/tests/sksl/intrinsics/Trunc.hlsl
@@ -0,0 +1,72 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _46 = false;
+ if (trunc(_10_testInputs.x) == (-1.0f))
+ {
+ float2 _38 = trunc(_10_testInputs.xy);
+ _46 = all(bool2(_38.x == float2(-1.0f, 0.0f).x, _38.y == float2(-1.0f, 0.0f).y));
+ }
+ else
+ {
+ _46 = false;
+ }
+ bool _58 = false;
+ if (_46)
+ {
+ float3 _49 = trunc(_10_testInputs.xyz);
+ _58 = all(bool3(_49.x == float3(-1.0f, 0.0f, 0.0f).x, _49.y == float3(-1.0f, 0.0f, 0.0f).y, _49.z == float3(-1.0f, 0.0f, 0.0f).z));
+ }
+ else
+ {
+ _58 = false;
+ }
+ bool _69 = false;
+ if (_58)
+ {
+ float4 _61 = trunc(_10_testInputs);
+ _69 = all(bool4(_61.x == float4(-1.0f, 0.0f, 0.0f, 2.0f).x, _61.y == float4(-1.0f, 0.0f, 0.0f, 2.0f).y, _61.z == float4(-1.0f, 0.0f, 0.0f, 2.0f).z, _61.w == float4(-1.0f, 0.0f, 0.0f, 2.0f).w));
+ }
+ else
+ {
+ _69 = false;
+ }
+ float4 _70 = 0.0f.xxxx;
+ if (_69)
+ {
+ _70 = _10_colorGreen;
+ }
+ else
+ {
+ _70 = _10_colorRed;
+ }
+ return _70;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/UintBitsToFloat.hlsl b/tests/sksl/intrinsics/UintBitsToFloat.hlsl
new file mode 100644
index 0000000..889189f
--- /dev/null
+++ b/tests/sksl/intrinsics/UintBitsToFloat.hlsl
@@ -0,0 +1,78 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_testInput : packoffset(c0);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c3);
+ float4 _10_colorRed : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
+ float4 inputVal = _42;
+ uint4 expectedB = uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u);
+ bool _65 = false;
+ if (_42.x == asfloat(1065353216u))
+ {
+ float2 _58 = _42.xy;
+ float2 _59 = asfloat(uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).xy);
+ _65 = all(bool2(_58.x == _59.x, _58.y == _59.y));
+ }
+ else
+ {
+ _65 = false;
+ }
+ bool _76 = false;
+ if (_65)
+ {
+ float3 _68 = _42.xyz;
+ float3 _70 = asfloat(uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).xyz);
+ _76 = all(bool3(_68.x == _70.x, _68.y == _70.y, _68.z == _70.z));
+ }
+ else
+ {
+ _76 = false;
+ }
+ bool _83 = false;
+ if (_76)
+ {
+ float4 _79 = asfloat(uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u));
+ _83 = all(bool4(_42.x == _79.x, _42.y == _79.y, _42.z == _79.z, _42.w == _79.w));
+ }
+ else
+ {
+ _83 = false;
+ }
+ float4 _84 = 0.0f.xxxx;
+ if (_83)
+ {
+ _84 = _10_colorGreen;
+ }
+ else
+ {
+ _84 = _10_colorRed;
+ }
+ return _84;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/intrinsics/Unpack.hlsl b/tests/sksl/intrinsics/Unpack.hlsl
new file mode 100644
index 0000000..b3079c4
--- /dev/null
+++ b/tests/sksl/intrinsics/Unpack.hlsl
@@ -0,0 +1,93 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ uint _10_a : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+uint spvPackHalf2x16(float2 value)
+{
+ uint2 Packed = f32tof16(value);
+ return Packed.x | (Packed.y << 16);
+}
+
+float2 spvUnpackHalf2x16(uint value)
+{
+ return f16tof32(uint2(value & 0xffff, value >> 16));
+}
+
+uint spvPackUnorm4x8(float4 value)
+{
+ uint4 Packed = uint4(round(saturate(value) * 255.0));
+ return Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24);
+}
+
+float4 spvUnpackUnorm4x8(uint value)
+{
+ uint4 Packed = uint4(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, value >> 24);
+ return float4(Packed) / 255.0;
+}
+
+uint spvPackSnorm4x8(float4 value)
+{
+ int4 Packed = int4(round(clamp(value, -1.0, 1.0) * 127.0)) & 0xff;
+ return uint(Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24));
+}
+
+float4 spvUnpackSnorm4x8(uint value)
+{
+ int SignedValue = int(value);
+ int4 Packed = int4(SignedValue << 24, SignedValue << 16, SignedValue << 8, SignedValue) >> 24;
+ return clamp(float4(Packed) / 127.0, -1.0, 1.0);
+}
+
+uint spvPackUnorm2x16(float2 value)
+{
+ uint2 Packed = uint2(round(saturate(value) * 65535.0));
+ return Packed.x | (Packed.y << 16);
+}
+
+float2 spvUnpackUnorm2x16(uint value)
+{
+ uint2 Packed = uint2(value & 0xffff, value >> 16);
+ return float2(Packed) / 65535.0;
+}
+
+uint spvPackSnorm2x16(float2 value)
+{
+ int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
+ return uint(Packed.x | (Packed.y << 16));
+}
+
+float2 spvUnpackSnorm2x16(uint value)
+{
+ int SignedValue = int(value);
+ int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
+ return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
+}
+
+void frag_main()
+{
+ float2 _17 = spvUnpackHalf2x16(_10_a);
+ sk_FragColor = float4(_17.x, _17.y, sk_FragColor.z, sk_FragColor.w);
+ float2 _26 = spvUnpackUnorm2x16(_10_a);
+ sk_FragColor = float4(_26.x, _26.y, sk_FragColor.z, sk_FragColor.w);
+ float2 _31 = spvUnpackSnorm2x16(_10_a);
+ sk_FragColor = float4(_31.x, _31.y, sk_FragColor.z, sk_FragColor.w);
+ sk_FragColor = spvUnpackUnorm4x8(_10_a);
+ sk_FragColor = spvUnpackSnorm4x8(_10_a);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayCast.hlsl b/tests/sksl/shared/ArrayCast.hlsl
new file mode 100644
index 0000000..5c06de9
--- /dev/null
+++ b/tests/sksl/shared/ArrayCast.hlsl
@@ -0,0 +1,74 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float _35[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
+ float f[4] = _35;
+ float h[4] = _35;
+ f = _35;
+ h = _35;
+ int3 _47[3] = { int3(1, 1, 1), int3(2, 2, 2), int3(3, 3, 3) };
+ int3 i3[3] = _47;
+ int3 s3[3] = _47;
+ i3 = _47;
+ s3 = _47;
+ float2x2 _63[2] = { float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)), float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f)) };
+ float2x2 h2x2[2] = _63;
+ float2x2 f2x2[2] = _63;
+ f2x2 = _63;
+ h2x2 = _63;
+ bool _74 = false;
+ if (true && (true && (true && true)))
+ {
+ _74 = true && (true && true);
+ }
+ else
+ {
+ _74 = false;
+ }
+ bool _89 = false;
+ if (_74)
+ {
+ _89 = (all(bool2(float2(5.0f, 6.0f).x == float2(5.0f, 6.0f).x, float2(5.0f, 6.0f).y == float2(5.0f, 6.0f).y)) && all(bool2(float2(7.0f, 8.0f).x == float2(7.0f, 8.0f).x, float2(7.0f, 8.0f).y == float2(7.0f, 8.0f).y))) && (all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y)));
+ }
+ else
+ {
+ _89 = false;
+ }
+ float4 _90 = 0.0f.xxxx;
+ if (_89)
+ {
+ _90 = _10_colorGreen;
+ }
+ else
+ {
+ _90 = _10_colorRed;
+ }
+ return _90;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayComparison.hlsl b/tests/sksl/shared/ArrayComparison.hlsl
new file mode 100644
index 0000000..7e08abb
--- /dev/null
+++ b/tests/sksl/shared/ArrayComparison.hlsl
@@ -0,0 +1,181 @@
+struct S
+{
+ int x;
+ int y;
+};
+
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float _10_testArray[5] : packoffset(c2);
+ float _10_testArrayNegative[5] : packoffset(c7);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ float _36[5] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
+ float f1[5] = _36;
+ float f2[5] = _36;
+ float _40[5] = { 1.0f, 2.0f, 3.0f, -4.0f, 5.0f };
+ float f3[5] = _40;
+ int3 _52[2] = { int3(1, 2, 3), int3(4, 5, 6) };
+ int3 v1[2] = _52;
+ int3 v2[2] = _52;
+ int3 _57[2] = { int3(1, 2, 3), int3(4, 5, -6) };
+ int3 v3[2] = _57;
+ float2x2 _72[3] = { float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f)), float2x2(float2(3.0f, 4.0f), float2(5.0f, 6.0f)) };
+ float2x2 m1[3] = _72;
+ float2x2 m2[3] = _72;
+ float2x2 _81[3] = { float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), float2x2(float2(2.0f, 3.0f), float2(4.0f, 5.0f)), float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f)) };
+ float2x2 m3[3] = _81;
+ S _86 = { 1, 2 };
+ S _87 = { 3, 4 };
+ S _88 = { 5, 6 };
+ S _89[3] = { _86, _87, _88 };
+ S s1[3] = _89;
+ S _92 = { 0, 0 };
+ S _93[3] = { _86, _92, _88 };
+ S s2[3] = _93;
+ S s3[3] = _89;
+ bool _108 = false;
+ if (true && (true && (true && (true && true))))
+ {
+ _108 = false || ((4.0f != (-4.0f)) || (false || (false || false)));
+ }
+ else
+ {
+ _108 = false;
+ }
+ bool _135 = false;
+ if (_108)
+ {
+ _135 = (_10_testArray[4] != _10_testArrayNegative[4]) || ((_10_testArray[3] != _10_testArrayNegative[3]) || ((_10_testArray[2] != _10_testArrayNegative[2]) || ((_10_testArray[1] != _10_testArrayNegative[1]) || (_10_testArray[0] != _10_testArrayNegative[0]))));
+ }
+ else
+ {
+ _135 = false;
+ }
+ bool _154 = false;
+ if (_135)
+ {
+ _154 = (_10_testArray[4] == 5.0f) && ((_10_testArray[3] == 4.0f) && ((_10_testArray[2] == 3.0f) && ((_10_testArray[1] == 2.0f) && (_10_testArray[0] == 1.0f))));
+ }
+ else
+ {
+ _154 = false;
+ }
+ bool _173 = false;
+ if (_154)
+ {
+ _173 = (_10_testArray[4] != 5.0f) || ((_10_testArray[3] != (-4.0f)) || ((_10_testArray[2] != 3.0f) || ((_10_testArray[1] != 2.0f) || (_10_testArray[0] != 1.0f))));
+ }
+ else
+ {
+ _173 = false;
+ }
+ bool _192 = false;
+ if (_173)
+ {
+ _192 = (5.0f == _10_testArray[4]) && ((4.0f == _10_testArray[3]) && ((3.0f == _10_testArray[2]) && ((2.0f == _10_testArray[1]) && (1.0f == _10_testArray[0]))));
+ }
+ else
+ {
+ _192 = false;
+ }
+ bool _211 = false;
+ if (_192)
+ {
+ _211 = (5.0f != _10_testArray[4]) || (((-4.0f) != _10_testArray[3]) || ((3.0f != _10_testArray[2]) || ((2.0f != _10_testArray[1]) || (1.0f != _10_testArray[0]))));
+ }
+ else
+ {
+ _211 = false;
+ }
+ bool _215 = false;
+ if (_211)
+ {
+ _215 = true && true;
+ }
+ else
+ {
+ _215 = false;
+ }
+ bool _222 = false;
+ if (_215)
+ {
+ _222 = any(bool3(int3(4, 5, 6).x != int3(4, 5, -6).x, int3(4, 5, 6).y != int3(4, 5, -6).y, int3(4, 5, 6).z != int3(4, 5, -6).z)) || false;
+ }
+ else
+ {
+ _222 = false;
+ }
+ bool _243 = false;
+ if (_222)
+ {
+ _243 = (all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y)) && all(bool2(float2(5.0f, 6.0f).x == float2(5.0f, 6.0f).x, float2(5.0f, 6.0f).y == float2(5.0f, 6.0f).y))) && ((all(bool2(float2(2.0f, 0.0f).x == float2(2.0f, 0.0f).x, float2(2.0f, 0.0f).y == float2(2.0f, 0.0f).y)) && all(bool2(float2(0.0f, 2.0f).x == float2(0.0f, 2.0f).x, float2(0.0f, 2.0f).y == float2(0.0f, 2.0f).y))) && (all(bool2(float2(1.0f, 0.0f).x == float2(1.0f, 0.0f).x, float2(1.0f, 0.0f).y == float2(1.0f, 0.0f).y)) && all(bool2(float2(0.0f, 1.0f).x == float2(0.0f, 1.0f).x, float2(0.0f, 1.0f).y == float2(0.0f, 1.0f).y))));
+ }
+ else
+ {
+ _243 = false;
+ }
+ bool _263 = false;
+ if (_243)
+ {
+ _263 = (any(bool2(float2(3.0f, 4.0f).x != float2(6.0f, 0.0f).x, float2(3.0f, 4.0f).y != float2(6.0f, 0.0f).y)) || any(bool2(float2(5.0f, 6.0f).x != float2(0.0f, 6.0f).x, float2(5.0f, 6.0f).y != float2(0.0f, 6.0f).y))) || ((any(bool2(float2(2.0f, 0.0f).x != float2(2.0f, 3.0f).x, float2(2.0f, 0.0f).y != float2(2.0f, 3.0f).y)) || any(bool2(float2(0.0f, 2.0f).x != float2(4.0f, 5.0f).x, float2(0.0f, 2.0f).y != float2(4.0f, 5.0f).y))) || (any(bool2(float2(1.0f, 0.0f).x != float2(1.0f, 0.0f).x, float2(1.0f, 0.0f).y != float2(1.0f, 0.0f).y)) || any(bool2(float2(0.0f, 1.0f).x != float2(0.0f, 1.0f).x, float2(0.0f, 1.0f).y != float2(0.0f, 1.0f).y))));
+ }
+ else
+ {
+ _263 = false;
+ }
+ bool _273 = false;
+ if (_263)
+ {
+ _273 = (false || false) || (((4 != 0) || (3 != 0)) || (false || false));
+ }
+ else
+ {
+ _273 = false;
+ }
+ bool _281 = false;
+ if (_273)
+ {
+ _281 = (true && true) && ((true && true) && (true && true));
+ }
+ else
+ {
+ _281 = false;
+ }
+ float4 _282 = 0.0f.xxxx;
+ if (_281)
+ {
+ _282 = _10_colorGreen;
+ }
+ else
+ {
+ _282 = _10_colorRed;
+ }
+ return _282;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayConstructors.hlsl b/tests/sksl/shared/ArrayConstructors.hlsl
new file mode 100644
index 0000000..fd28e30
--- /dev/null
+++ b/tests/sksl/shared/ArrayConstructors.hlsl
@@ -0,0 +1,47 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float _35[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
+ float test1[4] = _35;
+ float2 _42[2] = { float2(1.0f, 2.0f), float2(3.0f, 4.0f) };
+ float2 test2[2] = _42;
+ float4x4 _54[1] = { float4x4(float4(16.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 16.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 16.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 16.0f)) };
+ float4x4 test3[1] = _54;
+ float4 _71 = 0.0f.xxxx;
+ if (((test1[3] + test2[1].y) + test3[0][3].w) == 24.0f)
+ {
+ _71 = _10_colorGreen;
+ }
+ else
+ {
+ _71 = _10_colorRed;
+ }
+ return _71;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayFollowedByScalar.hlsl b/tests/sksl/shared/ArrayFollowedByScalar.hlsl
new file mode 100644
index 0000000..b68202e
--- /dev/null
+++ b/tests/sksl/shared/ArrayFollowedByScalar.hlsl
@@ -0,0 +1,30 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float rgb[3] = { 0.0f, 0.0f, 0.0f };
+ rgb[0] = 0.0f;
+ rgb[1] = 1.0f;
+ rgb[2] = 0.0f;
+ float a = 1.0f;
+ return float4(rgb[0], rgb[1], rgb[2], 1.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayIndexTypes.hlsl b/tests/sksl/shared/ArrayIndexTypes.hlsl
new file mode 100644
index 0000000..3af3cc9
--- /dev/null
+++ b/tests/sksl/shared/ArrayIndexTypes.hlsl
@@ -0,0 +1,25 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float _22[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
+ float array[4] = _22;
+ int x = 0;
+ uint y = 1u;
+ int z = 2;
+ uint w = 3u;
+ sk_FragColor = float4(array[0], array[1u], array[2], array[3u]);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayNarrowingConversions.hlsl b/tests/sksl/shared/ArrayNarrowingConversions.hlsl
new file mode 100644
index 0000000..9ea63a4
--- /dev/null
+++ b/tests/sksl/shared/ArrayNarrowingConversions.hlsl
@@ -0,0 +1,81 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int _32[2] = { 1, 2 };
+ int i2[2] = _32;
+ int _34[2] = { 1, 2 };
+ int s2[2] = _34;
+ float _40[2] = { 1.0f, 2.0f };
+ float f2[2] = _40;
+ float _42[2] = { 1.0f, 2.0f };
+ float h2[2] = _42;
+ i2 = _34;
+ s2 = _34;
+ f2 = _42;
+ h2 = _42;
+ float cf2[2] = _40;
+ bool _50 = false;
+ if (true && true)
+ {
+ _50 = true && true;
+ }
+ else
+ {
+ _50 = false;
+ }
+ bool _54 = false;
+ if (_50)
+ {
+ _54 = true && true;
+ }
+ else
+ {
+ _54 = false;
+ }
+ bool _58 = false;
+ if (_54)
+ {
+ _58 = true && true;
+ }
+ else
+ {
+ _58 = false;
+ }
+ float4 _59 = 0.0f.xxxx;
+ if (_58)
+ {
+ _59 = _10_colorGreen;
+ }
+ else
+ {
+ _59 = _10_colorRed;
+ }
+ return _59;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ArrayTypes.hlsl b/tests/sksl/shared/ArrayTypes.hlsl
new file mode 100644
index 0000000..84267d3
--- /dev/null
+++ b/tests/sksl/shared/ArrayTypes.hlsl
@@ -0,0 +1,45 @@
+struct S
+{
+ float2 v;
+};
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void initialize_vS(inout S _27[2])
+{
+ _27[0].v = float2(0.0f, 1.0f);
+ _27[1].v = float2(2.0f, 1.0f);
+}
+
+float4 main(float2 _38)
+{
+ float2 x[2] = { 0.0f.xx, 0.0f.xx };
+ x[0] = 0.0f.xx;
+ x[1] = float2(1.0f, 0.0f);
+ float2 y[2] = { 0.0f.xx, 0.0f.xx };
+ y[0] = float2(0.0f, 1.0f);
+ y[1] = float2(-1.0f, 2.0f);
+ S _52[2] = { { 0.0f.xx }, { 0.0f.xx } };
+ initialize_vS(_52);
+ S z[2] = _52;
+ return float4((x[0].x * x[0].y) + z[0].v.x, x[1].x - (x[1].y * z[0].v.y), (y[0].x / y[0].y) / z[1].v.x, y[1].x + (y[1].y * z[1].v.y));
+}
+
+void frag_main()
+{
+ float2 _18 = 0.0f.xx;
+ sk_FragColor = main(_18);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Assignment.hlsl b/tests/sksl/shared/Assignment.hlsl
new file mode 100644
index 0000000..d98683a
--- /dev/null
+++ b/tests/sksl/shared/Assignment.hlsl
@@ -0,0 +1,113 @@
+struct S
+{
+ float f;
+ float af[5];
+ float4 h4;
+ float4 ah4[5];
+};
+
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _22_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float4 globalVar = 0.0f.xxxx;
+static S globalStruct = { 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 0.0f.xxxx, { 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx } };
+
+void keepAlive_vf(float _39)
+{
+}
+
+void keepAlive_vh(float _37)
+{
+}
+
+void keepAlive_vi(int _43)
+{
+}
+
+float4 main(float2 _46)
+{
+ int i = 0;
+ int4 i4 = int4(1, 2, 3, 4);
+ float3x3 f3x3 = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ float4 x = 0.0f.xxxx;
+ x.w = 0.0f;
+ x = float4(0.0f.xx.y, 0.0f.xx.x, x.z, x.w);
+ int ai[1] = { 0 };
+ ai[0] = 0;
+ int4 ai4[1] = { int4(0, 0, 0, 0) };
+ ai4[0] = int4(1, 2, 3, 4);
+ float3x3 ah3x3[1] = { float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx) };
+ ah3x3[0] = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+ float4 af4[1] = { 0.0f.xxxx };
+ af4[0].x = 0.0f;
+ af4[0] = float4(1.0f.xxxx.z, 1.0f.xxxx.x, 1.0f.xxxx.w, 1.0f.xxxx.y);
+ S s = { 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 0.0f.xxxx, { 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx } };
+ s.f = 0.0f;
+ s.af[1] = 0.0f;
+ s.h4 = float4(9.0f.xxx.y, 9.0f.xxx.z, 9.0f.xxx.x, s.h4.w);
+ s.ah4[2] = float4(s.ah4[2].x, 5.0f.xx.x, s.ah4[2].z, 5.0f.xx.y);
+ globalVar = 0.0f.xxxx;
+ globalStruct.f = 0.0f;
+ float l = 0.0f;
+ ai[0] += ai4[0].x;
+ s.f = 1.0f;
+ s.af[0] = 2.0f;
+ s.h4 = 1.0f.xxxx;
+ s.ah4[0] = 2.0f.xxxx;
+ float _131 = af4[0].x;
+ keepAlive_vf(_131);
+ af4[0].x = _131;
+ float _138 = ah3x3[0][0].x;
+ keepAlive_vh(_138);
+ ah3x3[0][0].x = _138;
+ int _142 = i;
+ keepAlive_vi(_142);
+ i = _142;
+ int _147 = i4.y;
+ keepAlive_vi(_147);
+ i4.y = _147;
+ int _152 = ai[0];
+ keepAlive_vi(_152);
+ ai[0] = _152;
+ int _158 = ai4[0].x;
+ keepAlive_vi(_158);
+ ai4[0].x = _158;
+ float _163 = x.y;
+ keepAlive_vh(_163);
+ x.y = _163;
+ float _168 = s.f;
+ keepAlive_vf(_168);
+ s.f = _168;
+ float _172 = l;
+ keepAlive_vh(_172);
+ l = _172;
+ float _178 = f3x3[0].x;
+ keepAlive_vf(_178);
+ f3x3[0].x = _178;
+ return _22_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _32 = 0.0f.xx;
+ float4 _34 = main(_32);
+ sk_FragColor = _34;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Caps.hlsl b/tests/sksl/shared/Caps.hlsl
new file mode 100644
index 0000000..b52493a
--- /dev/null
+++ b/tests/sksl/shared/Caps.hlsl
@@ -0,0 +1,25 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ int x = 0;
+ int y = 0;
+ int z = 0;
+ x = 1;
+ z = 1;
+ float3 _24 = float3(float(1), float(0), float(1));
+ sk_FragColor = float4(_24.x, _24.y, _24.z, sk_FragColor.w);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/CastsRoundTowardZero.hlsl b/tests/sksl/shared/CastsRoundTowardZero.hlsl
new file mode 100644
index 0000000..af5dd9b
--- /dev/null
+++ b/tests/sksl/shared/CastsRoundTowardZero.hlsl
@@ -0,0 +1,42 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool ok = true;
+ float4 _29 = 0.0f.xxxx;
+ if (true)
+ {
+ _29 = _10_colorGreen;
+ }
+ else
+ {
+ _29 = _10_colorRed;
+ }
+ return _29;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Clockwise.hlsl b/tests/sksl/shared/Clockwise.hlsl
new file mode 100644
index 0000000..fe0e651
--- /dev/null
+++ b/tests/sksl/shared/Clockwise.hlsl
@@ -0,0 +1,41 @@
+cbuffer sksl_synthetic_uniforms : register(b0, space0)
+{
+ float2 _13_u_skRTFlip : packoffset(c1024);
+};
+
+
+static bool gl_FrontFacing;
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Input
+{
+ bool gl_FrontFacing : SV_IsFrontFace;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool _25 = false;
+ if (_13_u_skRTFlip.y > 0.0f)
+ {
+ _25 = !gl_FrontFacing;
+ }
+ else
+ {
+ _25 = gl_FrontFacing;
+ }
+ sk_FragColor = float(_25 ? 1 : (-1)).xxxx;
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_FrontFacing = stage_input.gl_FrontFacing;
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ClockwiseNoRTFlip.hlsl b/tests/sksl/shared/ClockwiseNoRTFlip.hlsl
new file mode 100644
index 0000000..fea761c
--- /dev/null
+++ b/tests/sksl/shared/ClockwiseNoRTFlip.hlsl
@@ -0,0 +1,26 @@
+static bool gl_FrontFacing;
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Input
+{
+ bool gl_FrontFacing : SV_IsFrontFace;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float(gl_FrontFacing ? 1 : (-1)).xxxx;
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_FrontFacing = stage_input.gl_FrontFacing;
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/CommaMixedTypes.hlsl b/tests/sksl/shared/CommaMixedTypes.hlsl
new file mode 100644
index 0000000..ae38d44
--- /dev/null
+++ b/tests/sksl/shared/CommaMixedTypes.hlsl
@@ -0,0 +1,37 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float _10_unknownInput : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 result = 0.0f.xxxx;
+ result.x = _10_colorGreen.x;
+ result.y = _10_colorGreen.y;
+ result.z = _10_colorGreen.z;
+ result.w = _10_colorGreen.w;
+ return result;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/CommaSideEffects.hlsl b/tests/sksl/shared/CommaSideEffects.hlsl
new file mode 100644
index 0000000..0c39c92
--- /dev/null
+++ b/tests/sksl/shared/CommaSideEffects.hlsl
@@ -0,0 +1,89 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorRed : packoffset(c0);
+ float4 _11_colorGreen : packoffset(c1);
+ float4 _11_colorWhite : packoffset(c2);
+ float4 _11_colorBlack : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void setToColorBlack_vh4(out float4 _26)
+{
+ _26 = _11_colorBlack;
+}
+
+float4 main(float2 _34)
+{
+ float4 b = _11_colorRed;
+ float4 c = _11_colorGreen;
+ float4 _46 = 0.0f.xxxx;
+ setToColorBlack_vh4(_46);
+ float4 d = _46;
+ float4 a = _11_colorWhite;
+ float4 _52 = _11_colorWhite * _11_colorWhite;
+ a = _52;
+ float4 _53 = _11_colorRed * _11_colorRed;
+ b = _53;
+ float4 _54 = _11_colorGreen * _11_colorGreen;
+ c = _54;
+ float4 _55 = _46 * _46;
+ d = _55;
+ bool _68 = false;
+ if (all(bool4(_52.x == _11_colorWhite.x, _52.y == _11_colorWhite.y, _52.z == _11_colorWhite.z, _52.w == _11_colorWhite.w)))
+ {
+ _68 = all(bool4(_53.x == _11_colorRed.x, _53.y == _11_colorRed.y, _53.z == _11_colorRed.z, _53.w == _11_colorRed.w));
+ }
+ else
+ {
+ _68 = false;
+ }
+ bool _75 = false;
+ if (_68)
+ {
+ _75 = all(bool4(_54.x == _11_colorGreen.x, _54.y == _11_colorGreen.y, _54.z == _11_colorGreen.z, _54.w == _11_colorGreen.w));
+ }
+ else
+ {
+ _75 = false;
+ }
+ bool _82 = false;
+ if (_75)
+ {
+ _82 = all(bool4(_55.x == _11_colorBlack.x, _55.y == _11_colorBlack.y, _55.z == _11_colorBlack.z, _55.w == _11_colorBlack.w));
+ }
+ else
+ {
+ _82 = false;
+ }
+ float4 _83 = 0.0f.xxxx;
+ if (_82)
+ {
+ _83 = _11_colorGreen;
+ }
+ else
+ {
+ _83 = _11_colorRed;
+ }
+ return _83;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/CompileTimeConstantVariables.hlsl b/tests/sksl/shared/CompileTimeConstantVariables.hlsl
new file mode 100644
index 0000000..e45d215
--- /dev/null
+++ b/tests/sksl/shared/CompileTimeConstantVariables.hlsl
@@ -0,0 +1,68 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int _34 = int(_10_colorGreen.y);
+ int integerInput = _34;
+ if (_34 == 0)
+ {
+ return 2.1400001049041748046875f.xxxx;
+ }
+ else
+ {
+ if (_34 == 1)
+ {
+ return _10_colorGreen;
+ }
+ else
+ {
+ if (_34 == 2)
+ {
+ return float4(1.0f, 0.20000000298023223876953125f, 2.1400001049041748046875f, 1.0f);
+ }
+ else
+ {
+ if (3.1400001049041748046875f < (_10_colorGreen.x * 3.1400001049041748046875f))
+ {
+ return 3.1400001049041748046875f.xxxx;
+ }
+ else
+ {
+ if (2.1400001049041748046875f >= (_10_colorGreen.x * 2.1400001049041748046875f))
+ {
+ return 0.0f.xxxx;
+ }
+ else
+ {
+ return float4(1.0f, 0.0f, 0.0f, 1.0f);
+ }
+ }
+ }
+ }
+ }
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ComplexDelete.hlsl b/tests/sksl/shared/ComplexDelete.hlsl
new file mode 100644
index 0000000..ba145b0
--- /dev/null
+++ b/tests/sksl/shared/ComplexDelete.hlsl
@@ -0,0 +1,39 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ row_major float4x4 _14_colorXform : packoffset(c0);
+};
+
+Texture2D<float4> s : register(t0, space0);
+SamplerState _s_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _23 = s.Sample(_s_sampler, 1.0f.xx);
+ float4 tmpColor = _23;
+ float4 _55 = 0.0f.xxxx;
+ if (((any(bool4(_14_colorXform[0].x != float4(1.0f, 0.0f, 0.0f, 0.0f).x, _14_colorXform[0].y != float4(1.0f, 0.0f, 0.0f, 0.0f).y, _14_colorXform[0].z != float4(1.0f, 0.0f, 0.0f, 0.0f).z, _14_colorXform[0].w != float4(1.0f, 0.0f, 0.0f, 0.0f).w)) || any(bool4(_14_colorXform[1].x != float4(0.0f, 1.0f, 0.0f, 0.0f).x, _14_colorXform[1].y != float4(0.0f, 1.0f, 0.0f, 0.0f).y, _14_colorXform[1].z != float4(0.0f, 1.0f, 0.0f, 0.0f).z, _14_colorXform[1].w != float4(0.0f, 1.0f, 0.0f, 0.0f).w))) || any(bool4(_14_colorXform[2].x != float4(0.0f, 0.0f, 1.0f, 0.0f).x, _14_colorXform[2].y != float4(0.0f, 0.0f, 1.0f, 0.0f).y, _14_colorXform[2].z != float4(0.0f, 0.0f, 1.0f, 0.0f).z, _14_colorXform[2].w != float4(0.0f, 0.0f, 1.0f, 0.0f).w))) || any(bool4(_14_colorXform[3].x != float4(0.0f, 0.0f, 0.0f, 1.0f).x, _14_colorXform[3].y != float4(0.0f, 0.0f, 0.0f, 1.0f).y, _14_colorXform[3].z != float4(0.0f, 0.0f, 0.0f, 1.0f).z, _14_colorXform[3].w != float4(0.0f, 0.0f, 0.0f, 1.0f).w)))
+ {
+ float _71 = _23.w;
+ _55 = float4(clamp(mul(float4(_23.xyz, 1.0f), _14_colorXform).xyz, 0.0f.xxx, _71.xxx), _71);
+ }
+ else
+ {
+ _55 = _23;
+ }
+ sk_FragColor = _55;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ConstArray.hlsl b/tests/sksl/shared/ConstArray.hlsl
new file mode 100644
index 0000000..77290f9
--- /dev/null
+++ b/tests/sksl/shared/ConstArray.hlsl
@@ -0,0 +1,25 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ return float4(0.0f, 1.0f, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ConstGlobal.hlsl b/tests/sksl/shared/ConstGlobal.hlsl
new file mode 100644
index 0000000..0742b9a
--- /dev/null
+++ b/tests/sksl/shared/ConstGlobal.hlsl
@@ -0,0 +1,57 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool verify_const_globals_bii(int _27, int _28)
+{
+ bool _39 = false;
+ if (_27 == 7)
+ {
+ _39 = _28 == 10;
+ }
+ else
+ {
+ _39 = false;
+ }
+ return _39;
+}
+
+float4 main(float2 _41)
+{
+ int _43 = 7;
+ int _44 = 10;
+ float4 _46 = 0.0f.xxxx;
+ if (verify_const_globals_bii(_43, _44))
+ {
+ _46 = _11_colorGreen;
+ }
+ else
+ {
+ _46 = _11_colorRed;
+ }
+ return _46;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ConstVariableComparison.hlsl b/tests/sksl/shared/ConstVariableComparison.hlsl
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/ConstVariableComparison.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl b/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl
new file mode 100644
index 0000000..8d59cff
--- /dev/null
+++ b/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl
@@ -0,0 +1,92 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _23_colorRed : packoffset(c0);
+ row_major float2x2 _23_testMatrix2x2 : packoffset(c1);
+ float _23_testArray[5] : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float globalArray[5] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+static float2x2 globalMatrix = float2x2(0.0f.xx, 0.0f.xx);
+
+float4 main(float2 _36)
+{
+ float _16[5] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
+ globalArray = _16;
+ globalMatrix = float2x2(1.0f.xx, 1.0f.xx);
+ float _43[5] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f };
+ float localArray[5] = _43;
+ float2x2 localMatrix = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
+ bool _78 = false;
+ if ((1.0f == _23_testArray[4]) && ((1.0f == _23_testArray[3]) && ((1.0f == _23_testArray[2]) && ((1.0f == _23_testArray[1]) && (1.0f == _23_testArray[0])))))
+ {
+ _78 = true;
+ }
+ else
+ {
+ _78 = all(bool2(1.0f.xx.x == _23_colorRed.xy.x, 1.0f.xx.y == _23_colorRed.xy.y));
+ }
+ bool _92 = false;
+ if (_78)
+ {
+ _92 = true;
+ }
+ else
+ {
+ _92 = all(bool2(1.0f.xx.x == _23_testMatrix2x2[0].x, 1.0f.xx.y == _23_testMatrix2x2[0].y)) && all(bool2(1.0f.xx.x == _23_testMatrix2x2[1].x, 1.0f.xx.y == _23_testMatrix2x2[1].y));
+ }
+ bool _111 = false;
+ if (_92)
+ {
+ _111 = true;
+ }
+ else
+ {
+ _111 = (4.0f == _23_testArray[4]) && ((3.0f == _23_testArray[3]) && ((2.0f == _23_testArray[2]) && ((1.0f == _23_testArray[1]) && (0.0f == _23_testArray[0]))));
+ }
+ bool _119 = false;
+ if (_111)
+ {
+ _119 = true;
+ }
+ else
+ {
+ _119 = all(bool2(1.0f.xx.x == _23_colorRed.xy.x, 1.0f.xx.y == _23_colorRed.xy.y));
+ }
+ bool _131 = false;
+ if (_119)
+ {
+ _131 = true;
+ }
+ else
+ {
+ _131 = all(bool2(float2(0.0f, 1.0f).x == _23_testMatrix2x2[0].x, float2(0.0f, 1.0f).y == _23_testMatrix2x2[0].y)) && all(bool2(float2(2.0f, 3.0f).x == _23_testMatrix2x2[1].x, float2(2.0f, 3.0f).y == _23_testMatrix2x2[1].y));
+ }
+ if (_131)
+ {
+ return _23_colorRed;
+ }
+ return float4(0.0f, 1.0f, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _32 = 0.0f.xx;
+ float4 _34 = main(_32);
+ sk_FragColor = _34;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl b/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl
new file mode 100644
index 0000000..12b79be
--- /dev/null
+++ b/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl
@@ -0,0 +1,37 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static int zero = 0;
+static float globalArray[2] = { 0.0f, 0.0f };
+static float2x2 globalMatrix = float2x2(0.0f.xx, 0.0f.xx);
+
+float4 main(float2 _36)
+{
+ zero = 0;
+ float _19[2] = { 1.0f, 1.0f };
+ globalArray = _19;
+ globalMatrix = float2x2(1.0f.xx, 1.0f.xx);
+ float _40[2] = { 0.0f, 1.0f };
+ float localArray[2] = _40;
+ float2x2 localMatrix = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
+ return float4(globalArray[zero] * localArray[zero], 1.0f.xx[zero] * 1.0f.xx[zero], globalMatrix[zero] * localMatrix[zero]);
+}
+
+void frag_main()
+{
+ float2 _32 = 0.0f.xx;
+ float4 _34 = main(_32);
+ sk_FragColor = _34;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ConstantIf.hlsl b/tests/sksl/shared/ConstantIf.hlsl
new file mode 100644
index 0000000..05e2c97
--- /dev/null
+++ b/tests/sksl/shared/ConstantIf.hlsl
@@ -0,0 +1,75 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int a = 0;
+ int b = 0;
+ int c = 0;
+ int d = 0;
+ a = 1;
+ b = 2;
+ c = 5;
+ bool _40 = false;
+ if (true)
+ {
+ _40 = true;
+ }
+ else
+ {
+ _40 = false;
+ }
+ bool _43 = false;
+ if (_40)
+ {
+ _43 = true;
+ }
+ else
+ {
+ _43 = false;
+ }
+ bool _46 = false;
+ if (_43)
+ {
+ _46 = true;
+ }
+ else
+ {
+ _46 = false;
+ }
+ float4 _47 = 0.0f.xxxx;
+ if (_46)
+ {
+ _47 = _10_colorGreen;
+ }
+ else
+ {
+ _47 = _10_colorRed;
+ }
+ return _47;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Control.hlsl b/tests/sksl/shared/Control.hlsl
new file mode 100644
index 0000000..6dfb1cd
--- /dev/null
+++ b/tests/sksl/shared/Control.hlsl
@@ -0,0 +1,60 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ if (_10_unknownInput > 5.0f)
+ {
+ sk_FragColor = 0.75f.xxxx;
+ }
+ else
+ {
+ discard;
+ }
+ int i = 0;
+ while (i < 10)
+ {
+ sk_FragColor *= 0.5f;
+ i++;
+ }
+ do
+ {
+ sk_FragColor += 0.25f.xxxx;
+ } while (sk_FragColor.x < 0.75f);
+ for (int i_1 = 0; i_1 < 10; i_1++)
+ {
+ if ((i_1 % 2) == 1)
+ {
+ break;
+ }
+ else
+ {
+ if (i_1 > 100)
+ {
+ return;
+ }
+ else
+ {
+ continue;
+ }
+ }
+ }
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadDoWhileLoop.hlsl b/tests/sksl/shared/DeadDoWhileLoop.hlsl
new file mode 100644
index 0000000..e982fe5
--- /dev/null
+++ b/tests/sksl/shared/DeadDoWhileLoop.hlsl
@@ -0,0 +1,22 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ do
+ {
+ sk_FragColor = 1.0f.xxxx;
+ } while (false);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadGlobals.hlsl b/tests/sksl/shared/DeadGlobals.hlsl
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/DeadGlobals.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadIfStatement.hlsl b/tests/sksl/shared/DeadIfStatement.hlsl
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/DeadIfStatement.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadLoopVariable.hlsl b/tests/sksl/shared/DeadLoopVariable.hlsl
new file mode 100644
index 0000000..57b7aac
--- /dev/null
+++ b/tests/sksl/shared/DeadLoopVariable.hlsl
@@ -0,0 +1,36 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int x = 0;
+ while (!(x < 4))
+ {
+ break;
+ }
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadReturn.hlsl b/tests/sksl/shared/DeadReturn.hlsl
new file mode 100644
index 0000000..5b4614d
--- /dev/null
+++ b/tests/sksl/shared/DeadReturn.hlsl
@@ -0,0 +1,122 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _18_colorGreen : packoffset(c0);
+ float4 _18_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static int scratchVar = 0;
+
+bool test_flat_b()
+{
+ return true;
+}
+
+bool test_if_b()
+{
+ if (_18_colorGreen.y > 0.0f)
+ {
+ return true;
+ }
+ else
+ {
+ scratchVar++;
+ }
+ scratchVar++;
+ return false;
+}
+
+bool test_else_b()
+{
+ if (_18_colorGreen.y == 0.0f)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+bool test_loop_if_b()
+{
+ for (int x = 0; x <= 1; x++)
+ {
+ if (_18_colorGreen.y == 0.0f)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ scratchVar++;
+ return true;
+}
+
+float4 main(float2 _79)
+{
+ scratchVar = 0;
+ bool _85 = false;
+ if (test_flat_b())
+ {
+ bool _84 = test_if_b();
+ _85 = _84;
+ }
+ else
+ {
+ _85 = false;
+ }
+ bool _89 = false;
+ if (_85)
+ {
+ _89 = test_else_b();
+ }
+ else
+ {
+ _89 = false;
+ }
+ bool _93 = false;
+ if (_89)
+ {
+ bool _92 = test_loop_if_b();
+ _93 = _92;
+ }
+ else
+ {
+ _93 = false;
+ }
+ float4 _94 = 0.0f.xxxx;
+ if (_93)
+ {
+ _94 = _18_colorGreen;
+ }
+ else
+ {
+ _94 = _18_colorRed;
+ }
+ return _94;
+}
+
+void frag_main()
+{
+ float2 _28 = 0.0f.xx;
+ float4 _30 = main(_28);
+ sk_FragColor = _30;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadReturnES3.hlsl b/tests/sksl/shared/DeadReturnES3.hlsl
new file mode 100644
index 0000000..9dd05f2
--- /dev/null
+++ b/tests/sksl/shared/DeadReturnES3.hlsl
@@ -0,0 +1,190 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _18_colorGreen : packoffset(c0);
+ float4 _18_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_return_b()
+{
+ do
+ {
+ return true;
+ } while (false);
+}
+
+bool test_break_b()
+{
+ do
+ {
+ break;
+ } while (false);
+ return true;
+}
+
+bool test_continue_b()
+{
+ do
+ {
+ } while (false);
+ return true;
+}
+
+bool test_if_return_b()
+{
+ do
+ {
+ if (_18_colorGreen.y > 0.0f)
+ {
+ return true;
+ }
+ else
+ {
+ break;
+ }
+ } while (false);
+ return false;
+}
+
+bool test_if_break_b()
+{
+ do
+ {
+ if (_18_colorGreen.y > 0.0f)
+ {
+ break;
+ }
+ else
+ {
+ continue;
+ }
+ } while (false);
+ return true;
+}
+
+bool test_else_b()
+{
+ do
+ {
+ if (_18_colorGreen.y == 0.0f)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ } while (false);
+}
+
+bool test_loop_return_b()
+{
+ return true;
+}
+
+bool test_loop_break_b()
+{
+ for (int x = 0; !(x <= 1); x++)
+ {
+ break;
+ }
+ return true;
+}
+
+float4 main(float2 _109)
+{
+ bool _115 = false;
+ if (test_return_b())
+ {
+ _115 = test_break_b();
+ }
+ else
+ {
+ _115 = false;
+ }
+ bool _119 = false;
+ if (_115)
+ {
+ _119 = test_continue_b();
+ }
+ else
+ {
+ _119 = false;
+ }
+ bool _123 = false;
+ if (_119)
+ {
+ _123 = test_if_return_b();
+ }
+ else
+ {
+ _123 = false;
+ }
+ bool _127 = false;
+ if (_123)
+ {
+ _127 = test_if_break_b();
+ }
+ else
+ {
+ _127 = false;
+ }
+ bool _131 = false;
+ if (_127)
+ {
+ _131 = test_else_b();
+ }
+ else
+ {
+ _131 = false;
+ }
+ bool _135 = false;
+ if (_131)
+ {
+ _135 = test_loop_return_b();
+ }
+ else
+ {
+ _135 = false;
+ }
+ bool _139 = false;
+ if (_135)
+ {
+ _139 = test_loop_break_b();
+ }
+ else
+ {
+ _139 = false;
+ }
+ float4 _140 = 0.0f.xxxx;
+ if (_139)
+ {
+ _140 = _18_colorGreen;
+ }
+ else
+ {
+ _140 = _18_colorRed;
+ }
+ return _140;
+}
+
+void frag_main()
+{
+ float2 _28 = 0.0f.xx;
+ sk_FragColor = main(_28);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DeadStripFunctions.hlsl b/tests/sksl/shared/DeadStripFunctions.hlsl
new file mode 100644
index 0000000..a036937
--- /dev/null
+++ b/tests/sksl/shared/DeadStripFunctions.hlsl
@@ -0,0 +1,67 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_colorGreen : packoffset(c0);
+ float4 _12_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 live_fn_h4h4h4(float4 _46, float4 _47)
+{
+ return _46 + _47;
+}
+
+float4 unpremul_h4h4(float4 _27)
+{
+ return float4(_27.xyz * (1.0f / max(_27.w, 9.9999997473787516355514526367188e-05f)), _27.w);
+}
+
+float4 main(float2 _53)
+{
+ float4 _59 = 3.0f.xxxx;
+ float4 _62 = (-5.0f).xxxx;
+ float4 _63 = live_fn_h4h4h4(_59, _62);
+ float4 a = _63;
+ float4 _65 = 1.0f.xxxx;
+ float4 _66 = unpremul_h4h4(_65);
+ float4 b = _66;
+ bool _76 = false;
+ if (any(bool4(_63.x != 0.0f.xxxx.x, _63.y != 0.0f.xxxx.y, _63.z != 0.0f.xxxx.z, _63.w != 0.0f.xxxx.w)))
+ {
+ _76 = any(bool4(_66.x != 0.0f.xxxx.x, _66.y != 0.0f.xxxx.y, _66.z != 0.0f.xxxx.z, _66.w != 0.0f.xxxx.w));
+ }
+ else
+ {
+ _76 = false;
+ }
+ float4 _77 = 0.0f.xxxx;
+ if (_76)
+ {
+ _77 = _12_colorGreen;
+ }
+ else
+ {
+ _77 = _12_colorRed;
+ }
+ return _77;
+}
+
+void frag_main()
+{
+ float2 _22 = 0.0f.xx;
+ sk_FragColor = main(_22);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DependentInitializers.hlsl b/tests/sksl/shared/DependentInitializers.hlsl
new file mode 100644
index 0000000..547682f
--- /dev/null
+++ b/tests/sksl/shared/DependentInitializers.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float x = 0.5f;
+ float _31 = 0.5f * 2.0f;
+ float y = _31;
+ float4 _34 = 0.0f.xxxx;
+ if (_31 == 1.0f)
+ {
+ _34 = _10_colorGreen;
+ }
+ else
+ {
+ _34 = _10_colorRed;
+ }
+ return _34;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DerivativesUnused.hlsl b/tests/sksl/shared/DerivativesUnused.hlsl
new file mode 100644
index 0000000..12edad8
--- /dev/null
+++ b/tests/sksl/shared/DerivativesUnused.hlsl
@@ -0,0 +1,19 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor.x = 1.0f;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Discard.hlsl b/tests/sksl/shared/Discard.hlsl
new file mode 100644
index 0000000..8da6875
--- /dev/null
+++ b/tests/sksl/shared/Discard.hlsl
@@ -0,0 +1,19 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ discard;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DoWhileControlFlow.hlsl b/tests/sksl/shared/DoWhileControlFlow.hlsl
new file mode 100644
index 0000000..f6005a3
--- /dev/null
+++ b/tests/sksl/shared/DoWhileControlFlow.hlsl
@@ -0,0 +1,43 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float4 x = 1.0f.xxxx;
+ do
+ {
+ x.x -= 0.25f;
+ if (x.x <= 0.0f)
+ {
+ break;
+ }
+ } while (x.w == 1.0f);
+ do
+ {
+ x.z -= 0.25f;
+ if (x.w == 1.0f)
+ {
+ continue;
+ }
+ x.y = 0.0f;
+ } while (x.z > 0.0f);
+ return x;
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/DoubleNegation.hlsl b/tests/sksl/shared/DoubleNegation.hlsl
new file mode 100644
index 0000000..16365bb
--- /dev/null
+++ b/tests/sksl/shared/DoubleNegation.hlsl
@@ -0,0 +1,31 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return float4(float(int(_10_colorGreen.x)), _10_colorGreen.y, _10_colorGreen.zw);
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/EmptyBlocksES2.hlsl b/tests/sksl/shared/EmptyBlocksES2.hlsl
new file mode 100644
index 0000000..376aad2
--- /dev/null
+++ b/tests/sksl/shared/EmptyBlocksES2.hlsl
@@ -0,0 +1,43 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 color = 0.0f.xxxx;
+ if (_10_unknownInput == 1.0f)
+ {
+ color.y = 1.0f;
+ }
+ if (_10_unknownInput == 2.0f)
+ {
+ }
+ else
+ {
+ color.w = 1.0f;
+ }
+ return color;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/EmptyBlocksES3.hlsl b/tests/sksl/shared/EmptyBlocksES3.hlsl
new file mode 100644
index 0000000..f619a16
--- /dev/null
+++ b/tests/sksl/shared/EmptyBlocksES3.hlsl
@@ -0,0 +1,49 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorWhite : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 color = 0.0f.xxxx;
+ if (_10_colorWhite.x == 1.0f)
+ {
+ color.y = 1.0f;
+ }
+ if (_10_colorWhite.x == 2.0f)
+ {
+ }
+ else
+ {
+ color.w = 1.0f;
+ }
+ while (_10_colorWhite.x == 2.0f)
+ {
+ }
+ do
+ {
+ } while (_10_colorWhite.x == 2.0f);
+ return color;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ForLoopControlFlow.hlsl b/tests/sksl/shared/ForLoopControlFlow.hlsl
new file mode 100644
index 0000000..75f9659
--- /dev/null
+++ b/tests/sksl/shared/ForLoopControlFlow.hlsl
@@ -0,0 +1,49 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorWhite : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 x = _10_colorWhite;
+ for (float r = -5.0f; r < 5.0f; r += 1.0f)
+ {
+ x.x = clamp(r, 0.0f, 1.0f);
+ if (x.x == 0.0f)
+ {
+ break;
+ }
+ }
+ for (float b = 5.0f; b >= 0.0f; b -= 1.0f)
+ {
+ x.z = b;
+ if (x.w == 1.0f)
+ {
+ continue;
+ }
+ x.y = 0.0f;
+ }
+ return x;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ForLoopMultipleInit.hlsl b/tests/sksl/shared/ForLoopMultipleInit.hlsl
new file mode 100644
index 0000000..7d21e1a
--- /dev/null
+++ b/tests/sksl/shared/ForLoopMultipleInit.hlsl
@@ -0,0 +1,73 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float4 result = 0.0f.xxxx;
+ float a = 0.0f;
+ float b = 0.0f;
+ for (;;)
+ {
+ bool _42 = false;
+ if (a < 10.0f)
+ {
+ _42 = b < 10.0f;
+ }
+ else
+ {
+ _42 = false;
+ }
+ if (_42)
+ {
+ result.x += a;
+ result.y += b;
+ a += 1.0f;
+ b += 1.0f;
+ continue;
+ }
+ else
+ {
+ break;
+ }
+ }
+ for (int c = 0; c < 10; c++)
+ {
+ result.z += 1.0f;
+ }
+ float _78[2] = { 0.0f, 10.0f };
+ float d[2] = _78;
+ float _86[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
+ float e[4] = _86;
+ float f = 9.0f;
+ for (; d[0] < d[1]; d[0] += 1.0f)
+ {
+ result.w = e[0] * f;
+ }
+ for (;;)
+ {
+ break;
+ }
+ for (;;)
+ {
+ break;
+ }
+ return result;
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/FragCoords.hlsl b/tests/sksl/shared/FragCoords.hlsl
new file mode 100644
index 0000000..7fc9187
--- /dev/null
+++ b/tests/sksl/shared/FragCoords.hlsl
@@ -0,0 +1,34 @@
+cbuffer sksl_synthetic_uniforms : register(b0, space0)
+{
+ float2 _15_u_skRTFlip : packoffset(c1024);
+};
+
+
+static float4 gl_FragCoord;
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Input
+{
+ float4 gl_FragCoord : SV_Position;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float2 _39 = float4(gl_FragCoord.x, _15_u_skRTFlip.x + (_15_u_skRTFlip.y * gl_FragCoord.y), gl_FragCoord.z, gl_FragCoord.w).xy;
+ sk_FragColor = float4(_39.x, _39.y, sk_FragColor.z, sk_FragColor.w);
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_FragCoord = stage_input.gl_FragCoord;
+ gl_FragCoord.w = 1.0 / gl_FragCoord.w;
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/FragCoordsNoRTFlip.hlsl b/tests/sksl/shared/FragCoordsNoRTFlip.hlsl
new file mode 100644
index 0000000..4d779d5
--- /dev/null
+++ b/tests/sksl/shared/FragCoordsNoRTFlip.hlsl
@@ -0,0 +1,27 @@
+static float4 gl_FragCoord;
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Input
+{
+ float4 gl_FragCoord : SV_Position;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float4(gl_FragCoord.xy.x, gl_FragCoord.xy.y, sk_FragColor.z, sk_FragColor.w);
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_FragCoord = stage_input.gl_FragCoord;
+ gl_FragCoord.w = 1.0 / gl_FragCoord.w;
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/FunctionAnonymousParameters.hlsl b/tests/sksl/shared/FunctionAnonymousParameters.hlsl
new file mode 100644
index 0000000..c13f36a
--- /dev/null
+++ b/tests/sksl/shared/FunctionAnonymousParameters.hlsl
@@ -0,0 +1,62 @@
+struct S
+{
+ int i;
+};
+
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_colorGreen : packoffset(c0);
+ float4 _12_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 fnGreen_h4bf2(bool _27, float2 _28)
+{
+ return _12_colorGreen;
+}
+
+float4 fnRed_h4ifS(int _40, float _41, S _42)
+{
+ return _12_colorRed;
+}
+
+float4 main(float2 _48)
+{
+ float4 _54 = 0.0f.xxxx;
+ if (_12_colorGreen.y != 0.0f)
+ {
+ bool _60 = true;
+ float2 _62 = _48;
+ _54 = fnGreen_h4bf2(_60, _62);
+ }
+ else
+ {
+ int _65 = 123;
+ float _67 = 3.1400001049041748046875f;
+ S _68 = { 0 };
+ S _69 = _68;
+ _54 = fnRed_h4ifS(_65, _67, _69);
+ }
+ return _54;
+}
+
+void frag_main()
+{
+ float2 _22 = 0.0f.xx;
+ sk_FragColor = main(_22);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/FunctionArgTypeMatch.hlsl b/tests/sksl/shared/FunctionArgTypeMatch.hlsl
new file mode 100644
index 0000000..03c51a9
--- /dev/null
+++ b/tests/sksl/shared/FunctionArgTypeMatch.hlsl
@@ -0,0 +1,385 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _33_colorGreen : packoffset(c0);
+ float4 _33_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool takes_void_b()
+{
+ return true;
+}
+
+bool takes_float_bf(float _51)
+{
+ return true;
+}
+
+bool takes_float2_bf2(float2 _54)
+{
+ return true;
+}
+
+bool takes_float3_bf3(float3 _59)
+{
+ return true;
+}
+
+bool takes_float4_bf4(float4 _63)
+{
+ return true;
+}
+
+bool takes_float2x2_bf22(float2x2 _68)
+{
+ return true;
+}
+
+bool takes_float3x3_bf33(float3x3 _73)
+{
+ return true;
+}
+
+bool takes_float4x4_bf44(float4x4 _78)
+{
+ return true;
+}
+
+bool takes_half_bh(float _80)
+{
+ return true;
+}
+
+bool takes_half2_bh2(float2 _82)
+{
+ return true;
+}
+
+bool takes_half3_bh3(float3 _84)
+{
+ return true;
+}
+
+bool takes_half4_bh4(float4 _86)
+{
+ return true;
+}
+
+bool takes_half2x2_bh22(float2x2 _88)
+{
+ return true;
+}
+
+bool takes_half3x3_bh33(float3x3 _90)
+{
+ return true;
+}
+
+bool takes_half4x4_bh44(float4x4 _92)
+{
+ return true;
+}
+
+bool takes_bool_bb(bool _96)
+{
+ return true;
+}
+
+bool takes_bool2_bb2(bool2 _101)
+{
+ return true;
+}
+
+bool takes_bool3_bb3(bool3 _106)
+{
+ return true;
+}
+
+bool takes_bool4_bb4(bool4 _111)
+{
+ return true;
+}
+
+bool takes_int_bi(int _116)
+{
+ return true;
+}
+
+bool takes_int2_bi2(int2 _121)
+{
+ return true;
+}
+
+bool takes_int3_bi3(int3 _126)
+{
+ return true;
+}
+
+bool takes_int4_bi4(int4 _131)
+{
+ return true;
+}
+
+float4 main(float2 _134)
+{
+ bool _140 = false;
+ if (true)
+ {
+ _140 = takes_void_b();
+ }
+ else
+ {
+ _140 = false;
+ }
+ bool _146 = false;
+ if (_140)
+ {
+ float _144 = 1.0f;
+ _146 = takes_float_bf(_144);
+ }
+ else
+ {
+ _146 = false;
+ }
+ bool _153 = false;
+ if (_146)
+ {
+ float2 _151 = 2.0f.xx;
+ _153 = takes_float2_bf2(_151);
+ }
+ else
+ {
+ _153 = false;
+ }
+ bool _160 = false;
+ if (_153)
+ {
+ float3 _158 = 3.0f.xxx;
+ _160 = takes_float3_bf3(_158);
+ }
+ else
+ {
+ _160 = false;
+ }
+ bool _167 = false;
+ if (_160)
+ {
+ float4 _165 = 4.0f.xxxx;
+ _167 = takes_float4_bf4(_165);
+ }
+ else
+ {
+ _167 = false;
+ }
+ bool _175 = false;
+ if (_167)
+ {
+ float2x2 _173 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
+ _175 = takes_float2x2_bf22(_173);
+ }
+ else
+ {
+ _175 = false;
+ }
+ bool _184 = false;
+ if (_175)
+ {
+ float3x3 _182 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
+ _184 = takes_float3x3_bf33(_182);
+ }
+ else
+ {
+ _184 = false;
+ }
+ bool _194 = false;
+ if (_184)
+ {
+ float4x4 _192 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
+ _194 = takes_float4x4_bf44(_192);
+ }
+ else
+ {
+ _194 = false;
+ }
+ bool _199 = false;
+ if (_194)
+ {
+ float _197 = 1.0f;
+ _199 = takes_half_bh(_197);
+ }
+ else
+ {
+ _199 = false;
+ }
+ bool _204 = false;
+ if (_199)
+ {
+ float2 _202 = 2.0f.xx;
+ _204 = takes_half2_bh2(_202);
+ }
+ else
+ {
+ _204 = false;
+ }
+ bool _209 = false;
+ if (_204)
+ {
+ float3 _207 = 3.0f.xxx;
+ _209 = takes_half3_bh3(_207);
+ }
+ else
+ {
+ _209 = false;
+ }
+ bool _214 = false;
+ if (_209)
+ {
+ float4 _212 = 4.0f.xxxx;
+ _214 = takes_half4_bh4(_212);
+ }
+ else
+ {
+ _214 = false;
+ }
+ bool _219 = false;
+ if (_214)
+ {
+ float2x2 _217 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
+ _219 = takes_half2x2_bh22(_217);
+ }
+ else
+ {
+ _219 = false;
+ }
+ bool _224 = false;
+ if (_219)
+ {
+ float3x3 _222 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
+ _224 = takes_half3x3_bh33(_222);
+ }
+ else
+ {
+ _224 = false;
+ }
+ bool _229 = false;
+ if (_224)
+ {
+ float4x4 _227 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
+ _229 = takes_half4x4_bh44(_227);
+ }
+ else
+ {
+ _229 = false;
+ }
+ bool _234 = false;
+ if (_229)
+ {
+ bool _232 = true;
+ _234 = takes_bool_bb(_232);
+ }
+ else
+ {
+ _234 = false;
+ }
+ bool _240 = false;
+ if (_234)
+ {
+ bool2 _238 = bool2(true, true);
+ _240 = takes_bool2_bb2(_238);
+ }
+ else
+ {
+ _240 = false;
+ }
+ bool _246 = false;
+ if (_240)
+ {
+ bool3 _244 = bool3(true, true, true);
+ _246 = takes_bool3_bb3(_244);
+ }
+ else
+ {
+ _246 = false;
+ }
+ bool _252 = false;
+ if (_246)
+ {
+ bool4 _250 = bool4(true, true, true, true);
+ _252 = takes_bool4_bb4(_250);
+ }
+ else
+ {
+ _252 = false;
+ }
+ bool _258 = false;
+ if (_252)
+ {
+ int _256 = 1;
+ _258 = takes_int_bi(_256);
+ }
+ else
+ {
+ _258 = false;
+ }
+ bool _265 = false;
+ if (_258)
+ {
+ int2 _263 = int2(2, 2);
+ _265 = takes_int2_bi2(_263);
+ }
+ else
+ {
+ _265 = false;
+ }
+ bool _272 = false;
+ if (_265)
+ {
+ int3 _270 = int3(3, 3, 3);
+ _272 = takes_int3_bi3(_270);
+ }
+ else
+ {
+ _272 = false;
+ }
+ bool _279 = false;
+ if (_272)
+ {
+ int4 _277 = int4(4, 4, 4, 4);
+ _279 = takes_int4_bi4(_277);
+ }
+ else
+ {
+ _279 = false;
+ }
+ float4 _280 = 0.0f.xxxx;
+ if (_279)
+ {
+ _280 = _33_colorGreen;
+ }
+ else
+ {
+ _280 = _33_colorRed;
+ }
+ return _280;
+}
+
+void frag_main()
+{
+ float2 _43 = 0.0f.xx;
+ sk_FragColor = main(_43);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/FunctionPrototype.hlsl b/tests/sksl/shared/FunctionPrototype.hlsl
new file mode 100644
index 0000000..d917e8f
--- /dev/null
+++ b/tests/sksl/shared/FunctionPrototype.hlsl
@@ -0,0 +1,37 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 this_function_is_defined_before_use_h4h4(float4 _26)
+{
+ return -_26;
+}
+
+float4 main(float2 _31)
+{
+ float4 _39 = -_11_colorGreen;
+ return this_function_is_defined_before_use_h4h4(_39);
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/FunctionReturnTypeMatch.hlsl b/tests/sksl/shared/FunctionReturnTypeMatch.hlsl
new file mode 100644
index 0000000..04f0874
--- /dev/null
+++ b/tests/sksl/shared/FunctionReturnTypeMatch.hlsl
@@ -0,0 +1,393 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _31_colorGreen : packoffset(c0);
+ float4 _31_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float2 returns_float2_f2()
+{
+ return 2.0f.xx;
+}
+
+float3 returns_float3_f3()
+{
+ return 3.0f.xxx;
+}
+
+float4 returns_float4_f4()
+{
+ return 4.0f.xxxx;
+}
+
+float2x2 returns_float2x2_f22()
+{
+ return float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
+}
+
+float3x3 returns_float3x3_f33()
+{
+ return float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
+}
+
+float4x4 returns_float4x4_f44()
+{
+ return float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
+}
+
+float returns_half_h()
+{
+ return 1.0f;
+}
+
+float2 returns_half2_h2()
+{
+ return 2.0f.xx;
+}
+
+float3 returns_half3_h3()
+{
+ return 3.0f.xxx;
+}
+
+float4 returns_half4_h4()
+{
+ return 4.0f.xxxx;
+}
+
+float2x2 returns_half2x2_h22()
+{
+ return float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
+}
+
+float3x3 returns_half3x3_h33()
+{
+ return float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
+}
+
+float4x4 returns_half4x4_h44()
+{
+ return float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
+}
+
+bool returns_bool_b()
+{
+ return true;
+}
+
+bool2 returns_bool2_b2()
+{
+ return bool2(true, true);
+}
+
+bool3 returns_bool3_b3()
+{
+ return bool3(true, true, true);
+}
+
+bool4 returns_bool4_b4()
+{
+ return bool4(true, true, true, true);
+}
+
+int returns_int_i()
+{
+ return 1;
+}
+
+int2 returns_int2_i2()
+{
+ return int2(2, 2);
+}
+
+int3 returns_int3_i3()
+{
+ return int3(3, 3, 3);
+}
+
+int4 returns_int4_i4()
+{
+ return int4(4, 4, 4, 4);
+}
+
+float4 main(float2 _122)
+{
+ float x1 = 1.0f;
+ float2 x2 = 2.0f.xx;
+ float3 x3 = 3.0f.xxx;
+ float4 x4 = 4.0f.xxxx;
+ float2x2 x5 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
+ float3x3 x6 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
+ float4x4 x7 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
+ float x8 = 1.0f;
+ float2 x9 = 2.0f.xx;
+ float3 x10 = 3.0f.xxx;
+ float4 x11 = 4.0f.xxxx;
+ float2x2 x12 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
+ float3x3 x13 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
+ float4x4 x14 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
+ bool x15 = true;
+ bool2 x16 = bool2(true, true);
+ bool3 x17 = bool3(true, true, true);
+ bool4 x18 = bool4(true, true, true, true);
+ int x19 = 1;
+ int2 x20 = int2(2, 2);
+ int3 x21 = int3(3, 3, 3);
+ int4 x22 = int4(4, 4, 4, 4);
+ bool _166 = false;
+ if (true)
+ {
+ float2 _163 = returns_float2_f2();
+ _166 = all(bool2(2.0f.xx.x == _163.x, 2.0f.xx.y == _163.y));
+ }
+ else
+ {
+ _166 = false;
+ }
+ bool _172 = false;
+ if (_166)
+ {
+ float3 _169 = returns_float3_f3();
+ _172 = all(bool3(3.0f.xxx.x == _169.x, 3.0f.xxx.y == _169.y, 3.0f.xxx.z == _169.z));
+ }
+ else
+ {
+ _172 = false;
+ }
+ bool _178 = false;
+ if (_172)
+ {
+ float4 _175 = returns_float4_f4();
+ _178 = all(bool4(4.0f.xxxx.x == _175.x, 4.0f.xxxx.y == _175.y, 4.0f.xxxx.z == _175.z, 4.0f.xxxx.w == _175.w));
+ }
+ else
+ {
+ _178 = false;
+ }
+ bool _189 = false;
+ if (_178)
+ {
+ float2x2 _181 = returns_float2x2_f22();
+ float2 _182 = _181[0];
+ float2 _185 = _181[1];
+ _189 = all(bool2(float2(2.0f, 0.0f).x == _182.x, float2(2.0f, 0.0f).y == _182.y)) && all(bool2(float2(0.0f, 2.0f).x == _185.x, float2(0.0f, 2.0f).y == _185.y));
+ }
+ else
+ {
+ _189 = false;
+ }
+ bool _204 = false;
+ if (_189)
+ {
+ float3x3 _192 = returns_float3x3_f33();
+ float3 _193 = _192[0];
+ float3 _196 = _192[1];
+ float3 _200 = _192[2];
+ _204 = (all(bool3(float3(3.0f, 0.0f, 0.0f).x == _193.x, float3(3.0f, 0.0f, 0.0f).y == _193.y, float3(3.0f, 0.0f, 0.0f).z == _193.z)) && all(bool3(float3(0.0f, 3.0f, 0.0f).x == _196.x, float3(0.0f, 3.0f, 0.0f).y == _196.y, float3(0.0f, 3.0f, 0.0f).z == _196.z))) && all(bool3(float3(0.0f, 0.0f, 3.0f).x == _200.x, float3(0.0f, 0.0f, 3.0f).y == _200.y, float3(0.0f, 0.0f, 3.0f).z == _200.z));
+ }
+ else
+ {
+ _204 = false;
+ }
+ bool _223 = false;
+ if (_204)
+ {
+ float4x4 _207 = returns_float4x4_f44();
+ float4 _208 = _207[0];
+ float4 _211 = _207[1];
+ float4 _215 = _207[2];
+ float4 _219 = _207[3];
+ _223 = ((all(bool4(float4(4.0f, 0.0f, 0.0f, 0.0f).x == _208.x, float4(4.0f, 0.0f, 0.0f, 0.0f).y == _208.y, float4(4.0f, 0.0f, 0.0f, 0.0f).z == _208.z, float4(4.0f, 0.0f, 0.0f, 0.0f).w == _208.w)) && all(bool4(float4(0.0f, 4.0f, 0.0f, 0.0f).x == _211.x, float4(0.0f, 4.0f, 0.0f, 0.0f).y == _211.y, float4(0.0f, 4.0f, 0.0f, 0.0f).z == _211.z, float4(0.0f, 4.0f, 0.0f, 0.0f).w == _211.w))) && all(bool4(float4(0.0f, 0.0f, 4.0f, 0.0f).x == _215.x, float4(0.0f, 0.0f, 4.0f, 0.0f).y == _215.y, float4(0.0f, 0.0f, 4.0f, 0.0f).z == _215.z, float4(0.0f, 0.0f, 4.0f, 0.0f).w == _215.w))) && all(bool4(float4(0.0f, 0.0f, 0.0f, 4.0f).x == _219.x, float4(0.0f, 0.0f, 0.0f, 4.0f).y == _219.y, float4(0.0f, 0.0f, 0.0f, 4.0f).z == _219.z, float4(0.0f, 0.0f, 0.0f, 4.0f).w == _219.w));
+ }
+ else
+ {
+ _223 = false;
+ }
+ bool _228 = false;
+ if (_223)
+ {
+ _228 = 1.0f == returns_half_h();
+ }
+ else
+ {
+ _228 = false;
+ }
+ bool _234 = false;
+ if (_228)
+ {
+ float2 _231 = returns_half2_h2();
+ _234 = all(bool2(2.0f.xx.x == _231.x, 2.0f.xx.y == _231.y));
+ }
+ else
+ {
+ _234 = false;
+ }
+ bool _240 = false;
+ if (_234)
+ {
+ float3 _237 = returns_half3_h3();
+ _240 = all(bool3(3.0f.xxx.x == _237.x, 3.0f.xxx.y == _237.y, 3.0f.xxx.z == _237.z));
+ }
+ else
+ {
+ _240 = false;
+ }
+ bool _246 = false;
+ if (_240)
+ {
+ float4 _243 = returns_half4_h4();
+ _246 = all(bool4(4.0f.xxxx.x == _243.x, 4.0f.xxxx.y == _243.y, 4.0f.xxxx.z == _243.z, 4.0f.xxxx.w == _243.w));
+ }
+ else
+ {
+ _246 = false;
+ }
+ bool _257 = false;
+ if (_246)
+ {
+ float2x2 _249 = returns_half2x2_h22();
+ float2 _250 = _249[0];
+ float2 _253 = _249[1];
+ _257 = all(bool2(float2(2.0f, 0.0f).x == _250.x, float2(2.0f, 0.0f).y == _250.y)) && all(bool2(float2(0.0f, 2.0f).x == _253.x, float2(0.0f, 2.0f).y == _253.y));
+ }
+ else
+ {
+ _257 = false;
+ }
+ bool _272 = false;
+ if (_257)
+ {
+ float3x3 _260 = returns_half3x3_h33();
+ float3 _261 = _260[0];
+ float3 _264 = _260[1];
+ float3 _268 = _260[2];
+ _272 = (all(bool3(float3(3.0f, 0.0f, 0.0f).x == _261.x, float3(3.0f, 0.0f, 0.0f).y == _261.y, float3(3.0f, 0.0f, 0.0f).z == _261.z)) && all(bool3(float3(0.0f, 3.0f, 0.0f).x == _264.x, float3(0.0f, 3.0f, 0.0f).y == _264.y, float3(0.0f, 3.0f, 0.0f).z == _264.z))) && all(bool3(float3(0.0f, 0.0f, 3.0f).x == _268.x, float3(0.0f, 0.0f, 3.0f).y == _268.y, float3(0.0f, 0.0f, 3.0f).z == _268.z));
+ }
+ else
+ {
+ _272 = false;
+ }
+ bool _291 = false;
+ if (_272)
+ {
+ float4x4 _275 = returns_half4x4_h44();
+ float4 _276 = _275[0];
+ float4 _279 = _275[1];
+ float4 _283 = _275[2];
+ float4 _287 = _275[3];
+ _291 = ((all(bool4(float4(4.0f, 0.0f, 0.0f, 0.0f).x == _276.x, float4(4.0f, 0.0f, 0.0f, 0.0f).y == _276.y, float4(4.0f, 0.0f, 0.0f, 0.0f).z == _276.z, float4(4.0f, 0.0f, 0.0f, 0.0f).w == _276.w)) && all(bool4(float4(0.0f, 4.0f, 0.0f, 0.0f).x == _279.x, float4(0.0f, 4.0f, 0.0f, 0.0f).y == _279.y, float4(0.0f, 4.0f, 0.0f, 0.0f).z == _279.z, float4(0.0f, 4.0f, 0.0f, 0.0f).w == _279.w))) && all(bool4(float4(0.0f, 0.0f, 4.0f, 0.0f).x == _283.x, float4(0.0f, 0.0f, 4.0f, 0.0f).y == _283.y, float4(0.0f, 0.0f, 4.0f, 0.0f).z == _283.z, float4(0.0f, 0.0f, 4.0f, 0.0f).w == _283.w))) && all(bool4(float4(0.0f, 0.0f, 0.0f, 4.0f).x == _287.x, float4(0.0f, 0.0f, 0.0f, 4.0f).y == _287.y, float4(0.0f, 0.0f, 0.0f, 4.0f).z == _287.z, float4(0.0f, 0.0f, 0.0f, 4.0f).w == _287.w));
+ }
+ else
+ {
+ _291 = false;
+ }
+ bool _296 = false;
+ if (_291)
+ {
+ _296 = true == returns_bool_b();
+ }
+ else
+ {
+ _296 = false;
+ }
+ bool _302 = false;
+ if (_296)
+ {
+ bool2 _299 = returns_bool2_b2();
+ _302 = all(bool2(bool2(true, true).x == _299.x, bool2(true, true).y == _299.y));
+ }
+ else
+ {
+ _302 = false;
+ }
+ bool _308 = false;
+ if (_302)
+ {
+ bool3 _305 = returns_bool3_b3();
+ _308 = all(bool3(bool3(true, true, true).x == _305.x, bool3(true, true, true).y == _305.y, bool3(true, true, true).z == _305.z));
+ }
+ else
+ {
+ _308 = false;
+ }
+ bool _314 = false;
+ if (_308)
+ {
+ bool4 _311 = returns_bool4_b4();
+ _314 = all(bool4(bool4(true, true, true, true).x == _311.x, bool4(true, true, true, true).y == _311.y, bool4(true, true, true, true).z == _311.z, bool4(true, true, true, true).w == _311.w));
+ }
+ else
+ {
+ _314 = false;
+ }
+ bool _319 = false;
+ if (_314)
+ {
+ _319 = 1 == returns_int_i();
+ }
+ else
+ {
+ _319 = false;
+ }
+ bool _325 = false;
+ if (_319)
+ {
+ int2 _322 = returns_int2_i2();
+ _325 = all(bool2(int2(2, 2).x == _322.x, int2(2, 2).y == _322.y));
+ }
+ else
+ {
+ _325 = false;
+ }
+ bool _331 = false;
+ if (_325)
+ {
+ int3 _328 = returns_int3_i3();
+ _331 = all(bool3(int3(3, 3, 3).x == _328.x, int3(3, 3, 3).y == _328.y, int3(3, 3, 3).z == _328.z));
+ }
+ else
+ {
+ _331 = false;
+ }
+ bool _337 = false;
+ if (_331)
+ {
+ int4 _334 = returns_int4_i4();
+ _337 = all(bool4(int4(4, 4, 4, 4).x == _334.x, int4(4, 4, 4, 4).y == _334.y, int4(4, 4, 4, 4).z == _334.z, int4(4, 4, 4, 4).w == _334.w));
+ }
+ else
+ {
+ _337 = false;
+ }
+ float4 _338 = 0.0f.xxxx;
+ if (_337)
+ {
+ _338 = _31_colorGreen;
+ }
+ else
+ {
+ _338 = _31_colorRed;
+ }
+ return _338;
+}
+
+void frag_main()
+{
+ float2 _41 = 0.0f.xx;
+ sk_FragColor = main(_41);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Functions.hlsl b/tests/sksl/shared/Functions.hlsl
new file mode 100644
index 0000000..34d9caa
--- /dev/null
+++ b/tests/sksl/shared/Functions.hlsl
@@ -0,0 +1,59 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_colorGreen : packoffset(c0);
+ float4 _12_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float foo_ff2(float2 _26)
+{
+ return _26.x * _26.y;
+}
+
+void bar_vf(inout float _35)
+{
+ float y[2] = { 0.0f, 0.0f };
+ y[0] = _35;
+ y[1] = _35 * 2.0f;
+ float2 _55 = float2(y[0], y[1]);
+ _35 = foo_ff2(_55);
+}
+
+float4 main(float2 _58)
+{
+ float x = 10.0f;
+ float _62 = 10.0f;
+ bar_vf(_62);
+ x = _62;
+ float4 _67 = 0.0f.xxxx;
+ if (_62 == 200.0f)
+ {
+ _67 = _12_colorGreen;
+ }
+ else
+ {
+ _67 = _12_colorRed;
+ }
+ return _67;
+}
+
+void frag_main()
+{
+ float2 _22 = 0.0f.xx;
+ sk_FragColor = main(_22);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/GaussianBlur.hlsl b/tests/sksl/shared/GaussianBlur.hlsl
new file mode 100644
index 0000000..3d70411
--- /dev/null
+++ b/tests/sksl/shared/GaussianBlur.hlsl
@@ -0,0 +1,252 @@
+cbuffer uniformBuffer : register(b0, space0)
+{
+ float4 _4_sk_RTAdjust : packoffset(c0);
+ float2 _4_uIncrement_Stage1_c0 : packoffset(c1);
+ float4 _4_uKernel_Stage1_c0[7] : packoffset(c2);
+ row_major float3x3 _4_umatrix_Stage1_c0_c0 : packoffset(c9);
+ float4 _4_uborder_Stage1_c0_c0_c0 : packoffset(c12);
+ float4 _4_usubset_Stage1_c0_c0_c0 : packoffset(c13);
+ float4 _4_unorm_Stage1_c0_c0_c0 : packoffset(c14);
+};
+
+Texture2D<float4> uTextureSampler_0_Stage1 : register(t0, space0);
+SamplerState _uTextureSampler_0_Stage1_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+static float2 vLocalCoord_Stage0;
+
+struct SPIRV_Cross_Input
+{
+ float2 vLocalCoord_Stage0 : TEXCOORD0;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 MatrixEffect_Stage1_c0_c0_h4h4f2(float4 _29, float2 _30)
+{
+ float2 _43 = mul(float3(_30, 1.0f), _4_umatrix_Stage1_c0_c0).xy;
+ float2 _RESERVED_IDENTIFIER_FIXUP_1_inCoord = _43;
+ float2 _49 = _43 * _4_unorm_Stage1_c0_c0_c0.xy;
+ _RESERVED_IDENTIFIER_FIXUP_1_inCoord = _49;
+ float2 _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord = 0.0f.xx;
+ _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord.x = _49.x;
+ _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord.y = _RESERVED_IDENTIFIER_FIXUP_1_inCoord.y;
+ float2 _RESERVED_IDENTIFIER_FIXUP_3_clampedCoord = _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord;
+ float4 _RESERVED_IDENTIFIER_FIXUP_4_textureColor = uTextureSampler_0_Stage1.Sample(_uTextureSampler_0_Stage1_sampler, _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord * _4_unorm_Stage1_c0_c0_c0.zw);
+ float _75 = floor(_RESERVED_IDENTIFIER_FIXUP_1_inCoord.x + 0.001000000047497451305389404296875f) + 0.5f;
+ float _RESERVED_IDENTIFIER_FIXUP_5_snappedX = _75;
+ bool _88 = false;
+ if (_75 < _4_usubset_Stage1_c0_c0_c0.x)
+ {
+ _88 = true;
+ }
+ else
+ {
+ _88 = _75 > _4_usubset_Stage1_c0_c0_c0.z;
+ }
+ if (_88)
+ {
+ _RESERVED_IDENTIFIER_FIXUP_4_textureColor = _4_uborder_Stage1_c0_c0_c0;
+ }
+ return _RESERVED_IDENTIFIER_FIXUP_4_textureColor;
+}
+
+void frag_main()
+{
+ float4 outputColor_Stage0 = 1.0f.xxxx;
+ float4 outputCoverage_Stage0 = 1.0f.xxxx;
+ float4 _RESERVED_IDENTIFIER_FIXUP_6_output = 0.0f.xxxx;
+ float2 _112 = vLocalCoord_Stage0 - (_4_uIncrement_Stage1_c0 * 12.0f);
+ float2 _RESERVED_IDENTIFIER_FIXUP_7_coord = _112;
+ float2 _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = 0.0f.xx;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _112;
+ float4 _115 = 1.0f.xxxx;
+ float2 _116 = _112;
+ float4 _123 = 0.0f.xxxx + (MatrixEffect_Stage1_c0_c0_h4h4f2(_115, _116) * _4_uKernel_Stage1_c0[0].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _123;
+ float2 _126 = _112 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _126;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _126;
+ float4 _127 = 1.0f.xxxx;
+ float2 _128 = _126;
+ float4 _134 = _123 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_127, _128) * _4_uKernel_Stage1_c0[0].y);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _134;
+ float2 _137 = _126 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _137;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _137;
+ float4 _138 = 1.0f.xxxx;
+ float2 _139 = _137;
+ float4 _145 = _134 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_138, _139) * _4_uKernel_Stage1_c0[0].z);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _145;
+ float2 _148 = _137 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _148;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _148;
+ float4 _149 = 1.0f.xxxx;
+ float2 _150 = _148;
+ float4 _156 = _145 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_149, _150) * _4_uKernel_Stage1_c0[0].w);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _156;
+ float2 _159 = _148 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _159;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _159;
+ float4 _160 = 1.0f.xxxx;
+ float2 _161 = _159;
+ float4 _167 = _156 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_160, _161) * _4_uKernel_Stage1_c0[1].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _167;
+ float2 _170 = _159 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _170;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _170;
+ float4 _171 = 1.0f.xxxx;
+ float2 _172 = _170;
+ float4 _178 = _167 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_171, _172) * _4_uKernel_Stage1_c0[1].y);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _178;
+ float2 _181 = _170 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _181;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _181;
+ float4 _182 = 1.0f.xxxx;
+ float2 _183 = _181;
+ float4 _189 = _178 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_182, _183) * _4_uKernel_Stage1_c0[1].z);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _189;
+ float2 _192 = _181 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _192;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _192;
+ float4 _193 = 1.0f.xxxx;
+ float2 _194 = _192;
+ float4 _200 = _189 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_193, _194) * _4_uKernel_Stage1_c0[1].w);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _200;
+ float2 _203 = _192 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _203;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _203;
+ float4 _204 = 1.0f.xxxx;
+ float2 _205 = _203;
+ float4 _211 = _200 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_204, _205) * _4_uKernel_Stage1_c0[2].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _211;
+ float2 _214 = _203 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _214;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _214;
+ float4 _215 = 1.0f.xxxx;
+ float2 _216 = _214;
+ float4 _222 = _211 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_215, _216) * _4_uKernel_Stage1_c0[2].y);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _222;
+ float2 _225 = _214 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _225;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _225;
+ float4 _226 = 1.0f.xxxx;
+ float2 _227 = _225;
+ float4 _233 = _222 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_226, _227) * _4_uKernel_Stage1_c0[2].z);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _233;
+ float2 _236 = _225 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _236;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _236;
+ float4 _237 = 1.0f.xxxx;
+ float2 _238 = _236;
+ float4 _244 = _233 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_237, _238) * _4_uKernel_Stage1_c0[2].w);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _244;
+ float2 _247 = _236 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _247;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _247;
+ float4 _248 = 1.0f.xxxx;
+ float2 _249 = _247;
+ float4 _255 = _244 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_248, _249) * _4_uKernel_Stage1_c0[3].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _255;
+ float2 _258 = _247 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _258;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _258;
+ float4 _259 = 1.0f.xxxx;
+ float2 _260 = _258;
+ float4 _266 = _255 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_259, _260) * _4_uKernel_Stage1_c0[3].y);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _266;
+ float2 _269 = _258 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _269;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _269;
+ float4 _270 = 1.0f.xxxx;
+ float2 _271 = _269;
+ float4 _277 = _266 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_270, _271) * _4_uKernel_Stage1_c0[3].z);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _277;
+ float2 _280 = _269 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _280;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _280;
+ float4 _281 = 1.0f.xxxx;
+ float2 _282 = _280;
+ float4 _288 = _277 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_281, _282) * _4_uKernel_Stage1_c0[3].w);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _288;
+ float2 _291 = _280 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _291;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _291;
+ float4 _292 = 1.0f.xxxx;
+ float2 _293 = _291;
+ float4 _299 = _288 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_292, _293) * _4_uKernel_Stage1_c0[4].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _299;
+ float2 _302 = _291 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _302;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _302;
+ float4 _303 = 1.0f.xxxx;
+ float2 _304 = _302;
+ float4 _310 = _299 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_303, _304) * _4_uKernel_Stage1_c0[4].y);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _310;
+ float2 _313 = _302 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _313;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _313;
+ float4 _314 = 1.0f.xxxx;
+ float2 _315 = _313;
+ float4 _321 = _310 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_314, _315) * _4_uKernel_Stage1_c0[4].z);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _321;
+ float2 _324 = _313 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _324;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _324;
+ float4 _325 = 1.0f.xxxx;
+ float2 _326 = _324;
+ float4 _332 = _321 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_325, _326) * _4_uKernel_Stage1_c0[4].w);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _332;
+ float2 _335 = _324 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _335;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _335;
+ float4 _336 = 1.0f.xxxx;
+ float2 _337 = _335;
+ float4 _343 = _332 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_336, _337) * _4_uKernel_Stage1_c0[5].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _343;
+ float2 _346 = _335 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _346;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _346;
+ float4 _347 = 1.0f.xxxx;
+ float2 _348 = _346;
+ float4 _354 = _343 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_347, _348) * _4_uKernel_Stage1_c0[5].y);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _354;
+ float2 _357 = _346 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _357;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _357;
+ float4 _358 = 1.0f.xxxx;
+ float2 _359 = _357;
+ float4 _365 = _354 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_358, _359) * _4_uKernel_Stage1_c0[5].z);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _365;
+ float2 _368 = _357 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _368;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _368;
+ float4 _369 = 1.0f.xxxx;
+ float2 _370 = _368;
+ float4 _376 = _365 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_369, _370) * _4_uKernel_Stage1_c0[5].w);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _376;
+ float2 _379 = _368 + _4_uIncrement_Stage1_c0;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _379;
+ _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _379;
+ float4 _380 = 1.0f.xxxx;
+ float2 _381 = _379;
+ float4 _387 = _376 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_380, _381) * _4_uKernel_Stage1_c0[6].x);
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _387;
+ _RESERVED_IDENTIFIER_FIXUP_7_coord = _379 + _4_uIncrement_Stage1_c0;
+ float4 _391 = _387 * 1.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_6_output = _391;
+ float4 output_Stage1 = _391;
+ sk_FragColor = _391 * 1.0f.xxxx;
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ vLocalCoord_Stage0 = stage_input.vLocalCoord_Stage0;
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/GeometricIntrinsics.hlsl b/tests/sksl/shared/GeometricIntrinsics.hlsl
new file mode 100644
index 0000000..f9aee29
--- /dev/null
+++ b/tests/sksl/shared/GeometricIntrinsics.hlsl
@@ -0,0 +1,47 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float _RESERVED_IDENTIFIER_FIXUP_0_x = 1.0f;
+ float _29 = length(1.0f);
+ _RESERVED_IDENTIFIER_FIXUP_0_x = _29;
+ float _30 = distance(_29, 2.0f);
+ _RESERVED_IDENTIFIER_FIXUP_0_x = _30;
+ float _32 = _30 * 2.0f;
+ _RESERVED_IDENTIFIER_FIXUP_0_x = _32;
+ _RESERVED_IDENTIFIER_FIXUP_0_x = sign(_32);
+ float2 _RESERVED_IDENTIFIER_FIXUP_1_x = float2(1.0f, 2.0f);
+ float2 _37 = length(float2(1.0f, 2.0f)).xx;
+ _RESERVED_IDENTIFIER_FIXUP_1_x = _37;
+ float2 _42 = distance(_37, float2(3.0f, 4.0f)).xx;
+ _RESERVED_IDENTIFIER_FIXUP_1_x = _42;
+ float2 _44 = dot(_42, float2(3.0f, 4.0f)).xx;
+ _RESERVED_IDENTIFIER_FIXUP_1_x = _44;
+ _RESERVED_IDENTIFIER_FIXUP_1_x = normalize(_44);
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/HelloWorld.hlsl b/tests/sksl/shared/HelloWorld.hlsl
new file mode 100644
index 0000000..77290f9
--- /dev/null
+++ b/tests/sksl/shared/HelloWorld.hlsl
@@ -0,0 +1,25 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ return float4(0.0f, 1.0f, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Hex.hlsl b/tests/sksl/shared/Hex.hlsl
new file mode 100644
index 0000000..18ffcd2
--- /dev/null
+++ b/tests/sksl/shared/Hex.hlsl
@@ -0,0 +1,41 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int i1 = 0;
+ i1 = 0 + 1;
+ int i2 = 4660;
+ i2 = 4660 + 1;
+ int i3 = 32766;
+ i3 = 32766 + 1;
+ int i4 = -32766;
+ i4 = (-32766) + 1;
+ int i5 = 19132;
+ i5 = 19132 + 1;
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/HexUnsigned.hlsl b/tests/sksl/shared/HexUnsigned.hlsl
new file mode 100644
index 0000000..18f7abe
--- /dev/null
+++ b/tests/sksl/shared/HexUnsigned.hlsl
@@ -0,0 +1,41 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ uint u1 = 0u;
+ u1 = 0u + 1u;
+ uint u2 = 305441741u;
+ u2 = 305441741u + 1u;
+ uint u3 = 2147483646u;
+ u3 = 2147483646u + 1u;
+ uint u4 = 4294967294u;
+ u4 = 4294967294u + 1u;
+ uint u5 = 65534u;
+ u5 = 65534u + 1u;
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/InoutParameters.hlsl b/tests/sksl/shared/InoutParameters.hlsl
new file mode 100644
index 0000000..832b97a
--- /dev/null
+++ b/tests/sksl/shared/InoutParameters.hlsl
@@ -0,0 +1,67 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _14_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void outParameterWrite_vh4(out float4 _29)
+{
+ _29 = _14_colorGreen;
+}
+
+void outParameterWriteIndirect_vh4(out float4 _36)
+{
+ float4 _38 = 0.0f.xxxx;
+ outParameterWrite_vh4(_38);
+ _36 = _38;
+}
+
+void inoutParameterWrite_vh4(inout float4 _41)
+{
+ _41 *= _41;
+}
+
+void inoutParameterWriteIndirect_vh4(inout float4 _46)
+{
+ float4 _49 = _46;
+ inoutParameterWrite_vh4(_49);
+ _46 = _49;
+}
+
+float4 main(float2 _53)
+{
+ float4 _56 = 0.0f.xxxx;
+ outParameterWrite_vh4(_56);
+ float4 c = _56;
+ float4 _59 = 0.0f.xxxx;
+ outParameterWriteIndirect_vh4(_59);
+ c = _59;
+ float4 _62 = _59;
+ inoutParameterWrite_vh4(_62);
+ c = _62;
+ float4 _65 = _62;
+ inoutParameterWriteIndirect_vh4(_65);
+ c = _65;
+ return _65;
+}
+
+void frag_main()
+{
+ float2 _24 = 0.0f.xx;
+ sk_FragColor = main(_24);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/InoutParamsAreDistinct.hlsl b/tests/sksl/shared/InoutParamsAreDistinct.hlsl
new file mode 100644
index 0000000..69b16bf
--- /dev/null
+++ b/tests/sksl/shared/InoutParamsAreDistinct.hlsl
@@ -0,0 +1,63 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool inout_params_are_distinct_bhh(out float _26, out float _27)
+{
+ _26 = 1.0f;
+ _27 = 2.0f;
+ bool _35 = false;
+ if (true)
+ {
+ _35 = true;
+ }
+ else
+ {
+ _35 = false;
+ }
+ return _35;
+}
+
+float4 main(float2 _37)
+{
+ float x = 0.0f;
+ float _40 = 0.0f;
+ float _41 = 0.0f;
+ bool _42 = inout_params_are_distinct_bhh(_40, _41);
+ x = _40;
+ x = _41;
+ float4 _45 = 0.0f.xxxx;
+ if (_42)
+ {
+ _45 = _11_colorGreen;
+ }
+ else
+ {
+ _45 = _11_colorRed;
+ }
+ return _45;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/InstanceID.hlsl b/tests/sksl/shared/InstanceID.hlsl
new file mode 100644
index 0000000..e95d9be
--- /dev/null
+++ b/tests/sksl/shared/InstanceID.hlsl
@@ -0,0 +1,26 @@
+static int gl_InstanceIndex;
+static int id;
+
+struct SPIRV_Cross_Input
+{
+ uint gl_InstanceIndex : SV_InstanceID;
+};
+
+struct SPIRV_Cross_Output
+{
+ int id : TEXCOORD1;
+};
+
+void vert_main()
+{
+ id = gl_InstanceIndex;
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_InstanceIndex = int(stage_input.gl_InstanceIndex);
+ vert_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.id = id;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/IntegerDivisionES3.hlsl b/tests/sksl/shared/IntegerDivisionES3.hlsl
new file mode 100644
index 0000000..7098d35
--- /dev/null
+++ b/tests/sksl/shared/IntegerDivisionES3.hlsl
@@ -0,0 +1,51 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int _34 = int(_10_colorGreen.x);
+ int zero = _34;
+ int one = int(_10_colorGreen.y);
+ for (int x = _34; x < 100; x++)
+ {
+ for (int y = one; y < 100; y++)
+ {
+ int _RESERVED_IDENTIFIER_FIXUP_0_x = x;
+ int _RESERVED_IDENTIFIER_FIXUP_1_result = 0;
+ while (_RESERVED_IDENTIFIER_FIXUP_0_x >= y)
+ {
+ _RESERVED_IDENTIFIER_FIXUP_1_result++;
+ _RESERVED_IDENTIFIER_FIXUP_0_x -= y;
+ }
+ if ((x / y) != _RESERVED_IDENTIFIER_FIXUP_1_result)
+ {
+ return float4(1.0f, float(x) * 0.0039215688593685626983642578125f, float(y) * 0.0039215688593685626983642578125f, 1.0f);
+ }
+ }
+ }
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/InterfaceBlockBuffer.hlsl b/tests/sksl/shared/InterfaceBlockBuffer.hlsl
new file mode 100644
index 0000000..e77feb6
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockBuffer.hlsl
@@ -0,0 +1,48 @@
+### Compilation failed:
+
+error: SPIR-V validation error: [VUID-StandaloneSpirv-DescriptorSet-06491] Binding decoration on target <id> '3[%3]' must be in the StorageBuffer, Uniform, or UniformConstant storage class
+ OpDecorate %3 Binding 456
+
+OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main" %sk_Clockwise %sk_FragColor
+OpExecutionMode %main OriginUpperLeft
+OpName %testBlock "testBlock"
+OpMemberName %testBlock 0 "x"
+OpName %sk_Clockwise "sk_Clockwise"
+OpName %sk_FragColor "sk_FragColor"
+OpName %main "main"
+OpMemberDecorate %testBlock 0 Offset 0
+OpDecorate %testBlock Block
+OpDecorate %3 Binding 456
+OpDecorate %sk_Clockwise BuiltIn FrontFacing
+OpDecorate %sk_FragColor RelaxedPrecision
+OpDecorate %sk_FragColor Location 0
+OpDecorate %sk_FragColor Index 0
+OpDecorate %21 RelaxedPrecision
+%float = OpTypeFloat 32
+%testBlock = OpTypeStruct %float
+%_ptr_Function_testBlock = OpTypePointer Function %testBlock
+%3 = OpVariable %_ptr_Function_testBlock Function
+%bool = OpTypeBool
+%_ptr_Input_bool = OpTypePointer Input %bool
+%sk_Clockwise = OpVariable %_ptr_Input_bool Input
+%v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%sk_FragColor = OpVariable %_ptr_Output_v4float Output
+%void = OpTypeVoid
+%14 = OpTypeFunction %void
+%int = OpTypeInt 32 1
+%int_0 = OpConstant %int 0
+%_ptr_Private_float = OpTypePointer Private %float
+%main = OpFunction %void None %14
+%15 = OpLabel
+%18 = OpAccessChain %_ptr_Private_float %3 %int_0
+%20 = OpLoad %float %18
+%21 = OpCompositeConstruct %v4float %20 %20 %20 %20
+OpStore %sk_FragColor %21
+OpReturn
+OpFunctionEnd
+
+1 error
diff --git a/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl b/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl
new file mode 100644
index 0000000..86f4fa9
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl
@@ -0,0 +1,30 @@
+cbuffer testBlockA : register(b1, space0)
+{
+ float2 _3_x : packoffset(c0);
+};
+
+cbuffer testBlockB : register(b2, space0)
+{
+ float2 _8_y : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float4(_3_x, _8_y);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/InterfaceBlockNamed.hlsl b/tests/sksl/shared/InterfaceBlockNamed.hlsl
new file mode 100644
index 0000000..ea3b2a5
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockNamed.hlsl
@@ -0,0 +1,25 @@
+cbuffer testBlock : register(b456, space0)
+{
+ float _3_x : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = _3_x.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/InterfaceBlockNamedArray.hlsl b/tests/sksl/shared/InterfaceBlockNamedArray.hlsl
new file mode 100644
index 0000000..0f5372d
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockNamedArray.hlsl
@@ -0,0 +1,53 @@
+### Compilation failed:
+
+error: SPIR-V validation error: Block decoration on target <id> '8[%_arr_testBlock_int_2]' must be a structure type
+ OpDecorate %_arr_testBlock_int_2 Block
+
+OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main" %sk_Clockwise %sk_FragColor
+OpExecutionMode %main OriginUpperLeft
+OpName %testBlock "testBlock"
+OpMemberName %testBlock 0 "x"
+OpName %sk_Clockwise "sk_Clockwise"
+OpName %sk_FragColor "sk_FragColor"
+OpName %main "main"
+OpMemberDecorate %testBlock 0 Offset 0
+OpDecorate %_arr_testBlock_int_2 ArrayStride 16
+OpDecorate %_arr_testBlock_int_2 Block
+OpDecorate %3 Binding 123
+OpDecorate %3 DescriptorSet 0
+OpDecorate %sk_Clockwise BuiltIn FrontFacing
+OpDecorate %sk_FragColor RelaxedPrecision
+OpDecorate %sk_FragColor Location 0
+OpDecorate %sk_FragColor Index 0
+OpDecorate %24 RelaxedPrecision
+%float = OpTypeFloat 32
+%testBlock = OpTypeStruct %float
+%int = OpTypeInt 32 1
+%int_2 = OpConstant %int 2
+%_arr_testBlock_int_2 = OpTypeArray %testBlock %int_2
+%_ptr_Uniform__arr_testBlock_int_2 = OpTypePointer Uniform %_arr_testBlock_int_2
+%3 = OpVariable %_ptr_Uniform__arr_testBlock_int_2 Uniform
+%bool = OpTypeBool
+%_ptr_Input_bool = OpTypePointer Input %bool
+%sk_Clockwise = OpVariable %_ptr_Input_bool Input
+%v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%sk_FragColor = OpVariable %_ptr_Output_v4float Output
+%void = OpTypeVoid
+%17 = OpTypeFunction %void
+%int_1 = OpConstant %int 1
+%int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%main = OpFunction %void None %17
+%18 = OpLabel
+%21 = OpAccessChain %_ptr_Uniform_float %3 %int_1 %int_0
+%23 = OpLoad %float %21
+%24 = OpCompositeConstruct %v4float %23 %23 %23 %23
+OpStore %sk_FragColor %24
+OpReturn
+OpFunctionEnd
+
+1 error
diff --git a/tests/sksl/shared/Matrices.hlsl b/tests/sksl/shared/Matrices.hlsl
new file mode 100644
index 0000000..91d46a7
--- /dev/null
+++ b/tests/sksl/shared/Matrices.hlsl
@@ -0,0 +1,277 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_colorGreen : packoffset(c0);
+ float4 _12_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_half_b()
+{
+ bool ok = true;
+ float2x2 m1 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+ bool _49 = false;
+ if (true)
+ {
+ _49 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
+ }
+ else
+ {
+ _49 = false;
+ }
+ ok = _49;
+ float2x2 m3 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+ bool _58 = false;
+ if (_49)
+ {
+ _58 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
+ }
+ else
+ {
+ _58 = false;
+ }
+ ok = _58;
+ float2x2 m4 = float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f));
+ bool _71 = false;
+ if (_58)
+ {
+ _71 = all(bool2(float2(6.0f, 0.0f).x == float2(6.0f, 0.0f).x, float2(6.0f, 0.0f).y == float2(6.0f, 0.0f).y)) && all(bool2(float2(0.0f, 6.0f).x == float2(0.0f, 6.0f).x, float2(0.0f, 6.0f).y == float2(0.0f, 6.0f).y));
+ }
+ else
+ {
+ _71 = false;
+ }
+ ok = _71;
+ float2x2 _72 = mul(float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f)), float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)));
+ m3 = _72;
+ bool _88 = false;
+ if (_71)
+ {
+ float2 _81 = _72[0];
+ float2 _84 = _72[1];
+ _88 = all(bool2(_81.x == float2(6.0f, 12.0f).x, _81.y == float2(6.0f, 12.0f).y)) && all(bool2(_84.x == float2(18.0f, 24.0f).x, _84.y == float2(18.0f, 24.0f).y));
+ }
+ else
+ {
+ _88 = false;
+ }
+ ok = _88;
+ float2 _93 = m1[1];
+ float2 _95 = float2(_93.y, 0.0f);
+ float2 _96 = float2(0.0f, _93.y);
+ float2x2 m5 = float2x2(_95, _96);
+ bool _108 = false;
+ if (_88)
+ {
+ _108 = all(bool2(_95.x == float2(4.0f, 0.0f).x, _95.y == float2(4.0f, 0.0f).y)) && all(bool2(_96.x == float2(0.0f, 4.0f).x, _96.y == float2(0.0f, 4.0f).y));
+ }
+ else
+ {
+ _108 = false;
+ }
+ ok = _108;
+ float2 _109 = float2(1.0f, 2.0f) + _95;
+ float2 _110 = float2(3.0f, 4.0f) + _96;
+ m1 = float2x2(_109, _110);
+ bool _124 = false;
+ if (_108)
+ {
+ _124 = all(bool2(_109.x == float2(5.0f, 2.0f).x, _109.y == float2(5.0f, 2.0f).y)) && all(bool2(_110.x == float2(3.0f, 8.0f).x, _110.y == float2(3.0f, 8.0f).y));
+ }
+ else
+ {
+ _124 = false;
+ }
+ ok = _124;
+ float2x2 m7 = float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f));
+ bool _137 = false;
+ if (_124)
+ {
+ _137 = all(bool2(float2(5.0f, 6.0f).x == float2(5.0f, 6.0f).x, float2(5.0f, 6.0f).y == float2(5.0f, 6.0f).y)) && all(bool2(float2(7.0f, 8.0f).x == float2(7.0f, 8.0f).x, float2(7.0f, 8.0f).y == float2(7.0f, 8.0f).y));
+ }
+ else
+ {
+ _137 = false;
+ }
+ ok = _137;
+ float3x3 m9 = float3x3(float3(9.0f, 0.0f, 0.0f), float3(0.0f, 9.0f, 0.0f), float3(0.0f, 0.0f, 9.0f));
+ bool _158 = false;
+ if (_137)
+ {
+ _158 = (all(bool3(float3(9.0f, 0.0f, 0.0f).x == float3(9.0f, 0.0f, 0.0f).x, float3(9.0f, 0.0f, 0.0f).y == float3(9.0f, 0.0f, 0.0f).y, float3(9.0f, 0.0f, 0.0f).z == float3(9.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 9.0f, 0.0f).x == float3(0.0f, 9.0f, 0.0f).x, float3(0.0f, 9.0f, 0.0f).y == float3(0.0f, 9.0f, 0.0f).y, float3(0.0f, 9.0f, 0.0f).z == float3(0.0f, 9.0f, 0.0f).z))) && all(bool3(float3(0.0f, 0.0f, 9.0f).x == float3(0.0f, 0.0f, 9.0f).x, float3(0.0f, 0.0f, 9.0f).y == float3(0.0f, 0.0f, 9.0f).y, float3(0.0f, 0.0f, 9.0f).z == float3(0.0f, 0.0f, 9.0f).z));
+ }
+ else
+ {
+ _158 = false;
+ }
+ ok = _158;
+ float4x4 m10 = float4x4(float4(11.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 11.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 11.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 11.0f));
+ bool _182 = false;
+ if (_158)
+ {
+ _182 = ((all(bool4(float4(11.0f, 0.0f, 0.0f, 0.0f).x == float4(11.0f, 0.0f, 0.0f, 0.0f).x, float4(11.0f, 0.0f, 0.0f, 0.0f).y == float4(11.0f, 0.0f, 0.0f, 0.0f).y, float4(11.0f, 0.0f, 0.0f, 0.0f).z == float4(11.0f, 0.0f, 0.0f, 0.0f).z, float4(11.0f, 0.0f, 0.0f, 0.0f).w == float4(11.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 11.0f, 0.0f, 0.0f).x == float4(0.0f, 11.0f, 0.0f, 0.0f).x, float4(0.0f, 11.0f, 0.0f, 0.0f).y == float4(0.0f, 11.0f, 0.0f, 0.0f).y, float4(0.0f, 11.0f, 0.0f, 0.0f).z == float4(0.0f, 11.0f, 0.0f, 0.0f).z, float4(0.0f, 11.0f, 0.0f, 0.0f).w == float4(0.0f, 11.0f, 0.0f, 0.0f).w))) && all(bool4(float4(0.0f, 0.0f, 11.0f, 0.0f).x == float4(0.0f, 0.0f, 11.0f, 0.0f).x, float4(0.0f, 0.0f, 11.0f, 0.0f).y == float4(0.0f, 0.0f, 11.0f, 0.0f).y, float4(0.0f, 0.0f, 11.0f, 0.0f).z == float4(0.0f, 0.0f, 11.0f, 0.0f).z, float4(0.0f, 0.0f, 11.0f, 0.0f).w == float4(0.0f, 0.0f, 11.0f, 0.0f).w))) && all(bool4(float4(0.0f, 0.0f, 0.0f, 11.0f).x == float4(0.0f, 0.0f, 0.0f, 11.0f).x, float4(0.0f, 0.0f, 0.0f, 11.0f).y == float4(0.0f, 0.0f, 0.0f, 11.0f).y, float4(0.0f, 0.0f, 0.0f, 11.0f).z == float4(0.0f, 0.0f, 0.0f, 11.0f).z, float4(0.0f, 0.0f, 0.0f, 11.0f).w == float4(0.0f, 0.0f, 0.0f, 11.0f).w));
+ }
+ else
+ {
+ _182 = false;
+ }
+ ok = _182;
+ float4x4 m11 = float4x4(20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx);
+ float4 _187 = 20.0f.xxxx - float4(11.0f, 0.0f, 0.0f, 0.0f);
+ float4 _188 = 20.0f.xxxx - float4(0.0f, 11.0f, 0.0f, 0.0f);
+ float4 _189 = 20.0f.xxxx - float4(0.0f, 0.0f, 11.0f, 0.0f);
+ float4 _190 = 20.0f.xxxx - float4(0.0f, 0.0f, 0.0f, 11.0f);
+ m11 = float4x4(_187, _188, _189, _190);
+ bool _210 = false;
+ if (_182)
+ {
+ _210 = ((all(bool4(_187.x == float4(9.0f, 20.0f, 20.0f, 20.0f).x, _187.y == float4(9.0f, 20.0f, 20.0f, 20.0f).y, _187.z == float4(9.0f, 20.0f, 20.0f, 20.0f).z, _187.w == float4(9.0f, 20.0f, 20.0f, 20.0f).w)) && all(bool4(_188.x == float4(20.0f, 9.0f, 20.0f, 20.0f).x, _188.y == float4(20.0f, 9.0f, 20.0f, 20.0f).y, _188.z == float4(20.0f, 9.0f, 20.0f, 20.0f).z, _188.w == float4(20.0f, 9.0f, 20.0f, 20.0f).w))) && all(bool4(_189.x == float4(20.0f, 20.0f, 9.0f, 20.0f).x, _189.y == float4(20.0f, 20.0f, 9.0f, 20.0f).y, _189.z == float4(20.0f, 20.0f, 9.0f, 20.0f).z, _189.w == float4(20.0f, 20.0f, 9.0f, 20.0f).w))) && all(bool4(_190.x == float4(20.0f, 20.0f, 20.0f, 9.0f).x, _190.y == float4(20.0f, 20.0f, 20.0f, 9.0f).y, _190.z == float4(20.0f, 20.0f, 20.0f, 9.0f).z, _190.w == float4(20.0f, 20.0f, 20.0f, 9.0f).w));
+ }
+ else
+ {
+ _210 = false;
+ }
+ ok = _210;
+ return _210;
+}
+
+bool test_comma_b()
+{
+ float2x2 x = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+ float2x2 y = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+ return all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
+}
+
+float4 main(float2 _220)
+{
+ bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_1_m1 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+ bool _231 = false;
+ if (true)
+ {
+ _231 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
+ }
+ else
+ {
+ _231 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _231;
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_2_m3 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+ bool _240 = false;
+ if (_231)
+ {
+ _240 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
+ }
+ else
+ {
+ _240 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _240;
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_3_m4 = float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f));
+ float2x2 _242 = mul(float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f)), float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)));
+ _RESERVED_IDENTIFIER_FIXUP_2_m3 = _242;
+ bool _252 = false;
+ if (_240)
+ {
+ float2 _245 = _242[0];
+ float2 _248 = _242[1];
+ _252 = all(bool2(_245.x == float2(6.0f, 12.0f).x, _245.y == float2(6.0f, 12.0f).y)) && all(bool2(_248.x == float2(18.0f, 24.0f).x, _248.y == float2(18.0f, 24.0f).y));
+ }
+ else
+ {
+ _252 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _252;
+ float2 _255 = _RESERVED_IDENTIFIER_FIXUP_1_m1[1];
+ float2 _257 = float2(_255.y, 0.0f);
+ float2 _258 = float2(0.0f, _255.y);
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_4_m5 = float2x2(_257, _258);
+ bool _267 = false;
+ if (_252)
+ {
+ _267 = all(bool2(_257.x == float2(4.0f, 0.0f).x, _257.y == float2(4.0f, 0.0f).y)) && all(bool2(_258.x == float2(0.0f, 4.0f).x, _258.y == float2(0.0f, 4.0f).y));
+ }
+ else
+ {
+ _267 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _267;
+ float2 _268 = float2(1.0f, 2.0f) + _257;
+ float2 _269 = float2(3.0f, 4.0f) + _258;
+ _RESERVED_IDENTIFIER_FIXUP_1_m1 = float2x2(_268, _269);
+ bool _278 = false;
+ if (_267)
+ {
+ _278 = all(bool2(_268.x == float2(5.0f, 2.0f).x, _268.y == float2(5.0f, 2.0f).y)) && all(bool2(_269.x == float2(3.0f, 8.0f).x, _269.y == float2(3.0f, 8.0f).y));
+ }
+ else
+ {
+ _278 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _278;
+ float4x4 _RESERVED_IDENTIFIER_FIXUP_7_m10 = float4x4(float4(11.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 11.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 11.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 11.0f));
+ float4x4 _RESERVED_IDENTIFIER_FIXUP_8_m11 = float4x4(20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx);
+ float4 _281 = 20.0f.xxxx - float4(11.0f, 0.0f, 0.0f, 0.0f);
+ float4 _282 = 20.0f.xxxx - float4(0.0f, 11.0f, 0.0f, 0.0f);
+ float4 _283 = 20.0f.xxxx - float4(0.0f, 0.0f, 11.0f, 0.0f);
+ float4 _284 = 20.0f.xxxx - float4(0.0f, 0.0f, 0.0f, 11.0f);
+ _RESERVED_IDENTIFIER_FIXUP_8_m11 = float4x4(_281, _282, _283, _284);
+ bool _299 = false;
+ if (_278)
+ {
+ _299 = ((all(bool4(_281.x == float4(9.0f, 20.0f, 20.0f, 20.0f).x, _281.y == float4(9.0f, 20.0f, 20.0f, 20.0f).y, _281.z == float4(9.0f, 20.0f, 20.0f, 20.0f).z, _281.w == float4(9.0f, 20.0f, 20.0f, 20.0f).w)) && all(bool4(_282.x == float4(20.0f, 9.0f, 20.0f, 20.0f).x, _282.y == float4(20.0f, 9.0f, 20.0f, 20.0f).y, _282.z == float4(20.0f, 9.0f, 20.0f, 20.0f).z, _282.w == float4(20.0f, 9.0f, 20.0f, 20.0f).w))) && all(bool4(_283.x == float4(20.0f, 20.0f, 9.0f, 20.0f).x, _283.y == float4(20.0f, 20.0f, 9.0f, 20.0f).y, _283.z == float4(20.0f, 20.0f, 9.0f, 20.0f).z, _283.w == float4(20.0f, 20.0f, 9.0f, 20.0f).w))) && all(bool4(_284.x == float4(20.0f, 20.0f, 20.0f, 9.0f).x, _284.y == float4(20.0f, 20.0f, 20.0f, 9.0f).y, _284.z == float4(20.0f, 20.0f, 20.0f, 9.0f).z, _284.w == float4(20.0f, 20.0f, 20.0f, 9.0f).w));
+ }
+ else
+ {
+ _299 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _299;
+ bool _303 = false;
+ if (_299)
+ {
+ _303 = test_half_b();
+ }
+ else
+ {
+ _303 = false;
+ }
+ bool _307 = false;
+ if (_303)
+ {
+ _307 = test_comma_b();
+ }
+ else
+ {
+ _307 = false;
+ }
+ float4 _308 = 0.0f.xxxx;
+ if (_307)
+ {
+ _308 = _12_colorGreen;
+ }
+ else
+ {
+ _308 = _12_colorRed;
+ }
+ return _308;
+}
+
+void frag_main()
+{
+ float2 _22 = 0.0f.xx;
+ sk_FragColor = main(_22);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatricesNonsquare.hlsl b/tests/sksl/shared/MatricesNonsquare.hlsl
new file mode 100644
index 0000000..dad6e4e
--- /dev/null
+++ b/tests/sksl/shared/MatricesNonsquare.hlsl
@@ -0,0 +1,279 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_half_b()
+{
+ bool ok = true;
+ float2x3 m23 = float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f));
+ bool _46 = false;
+ if (true)
+ {
+ _46 = all(bool3(float3(2.0f, 0.0f, 0.0f).x == float3(2.0f, 0.0f, 0.0f).x, float3(2.0f, 0.0f, 0.0f).y == float3(2.0f, 0.0f, 0.0f).y, float3(2.0f, 0.0f, 0.0f).z == float3(2.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 2.0f, 0.0f).x == float3(0.0f, 2.0f, 0.0f).x, float3(0.0f, 2.0f, 0.0f).y == float3(0.0f, 2.0f, 0.0f).y, float3(0.0f, 2.0f, 0.0f).z == float3(0.0f, 2.0f, 0.0f).z));
+ }
+ else
+ {
+ _46 = false;
+ }
+ ok = _46;
+ float2x4 m24 = float2x4(float4(3.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 3.0f, 0.0f, 0.0f));
+ bool _62 = false;
+ if (_46)
+ {
+ _62 = all(bool4(float4(3.0f, 0.0f, 0.0f, 0.0f).x == float4(3.0f, 0.0f, 0.0f, 0.0f).x, float4(3.0f, 0.0f, 0.0f, 0.0f).y == float4(3.0f, 0.0f, 0.0f, 0.0f).y, float4(3.0f, 0.0f, 0.0f, 0.0f).z == float4(3.0f, 0.0f, 0.0f, 0.0f).z, float4(3.0f, 0.0f, 0.0f, 0.0f).w == float4(3.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 3.0f, 0.0f, 0.0f).x == float4(0.0f, 3.0f, 0.0f, 0.0f).x, float4(0.0f, 3.0f, 0.0f, 0.0f).y == float4(0.0f, 3.0f, 0.0f, 0.0f).y, float4(0.0f, 3.0f, 0.0f, 0.0f).z == float4(0.0f, 3.0f, 0.0f, 0.0f).z, float4(0.0f, 3.0f, 0.0f, 0.0f).w == float4(0.0f, 3.0f, 0.0f, 0.0f).w));
+ }
+ else
+ {
+ _62 = false;
+ }
+ ok = _62;
+ float3x2 m32 = float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx);
+ bool _81 = false;
+ if (_62)
+ {
+ _81 = (all(bool2(float2(4.0f, 0.0f).x == float2(4.0f, 0.0f).x, float2(4.0f, 0.0f).y == float2(4.0f, 0.0f).y)) && all(bool2(float2(0.0f, 4.0f).x == float2(0.0f, 4.0f).x, float2(0.0f, 4.0f).y == float2(0.0f, 4.0f).y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _81 = false;
+ }
+ ok = _81;
+ float3x4 m34 = float3x4(float4(5.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 5.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 5.0f, 0.0f));
+ bool _100 = false;
+ if (_81)
+ {
+ _100 = (all(bool4(float4(5.0f, 0.0f, 0.0f, 0.0f).x == float4(5.0f, 0.0f, 0.0f, 0.0f).x, float4(5.0f, 0.0f, 0.0f, 0.0f).y == float4(5.0f, 0.0f, 0.0f, 0.0f).y, float4(5.0f, 0.0f, 0.0f, 0.0f).z == float4(5.0f, 0.0f, 0.0f, 0.0f).z, float4(5.0f, 0.0f, 0.0f, 0.0f).w == float4(5.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 5.0f, 0.0f, 0.0f).x == float4(0.0f, 5.0f, 0.0f, 0.0f).x, float4(0.0f, 5.0f, 0.0f, 0.0f).y == float4(0.0f, 5.0f, 0.0f, 0.0f).y, float4(0.0f, 5.0f, 0.0f, 0.0f).z == float4(0.0f, 5.0f, 0.0f, 0.0f).z, float4(0.0f, 5.0f, 0.0f, 0.0f).w == float4(0.0f, 5.0f, 0.0f, 0.0f).w))) && all(bool4(float4(0.0f, 0.0f, 5.0f, 0.0f).x == float4(0.0f, 0.0f, 5.0f, 0.0f).x, float4(0.0f, 0.0f, 5.0f, 0.0f).y == float4(0.0f, 0.0f, 5.0f, 0.0f).y, float4(0.0f, 0.0f, 5.0f, 0.0f).z == float4(0.0f, 0.0f, 5.0f, 0.0f).z, float4(0.0f, 0.0f, 5.0f, 0.0f).w == float4(0.0f, 0.0f, 5.0f, 0.0f).w));
+ }
+ else
+ {
+ _100 = false;
+ }
+ ok = _100;
+ float4x2 m42 = float4x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f), 0.0f.xx, 0.0f.xx);
+ bool _121 = false;
+ if (_100)
+ {
+ _121 = ((all(bool2(float2(6.0f, 0.0f).x == float2(6.0f, 0.0f).x, float2(6.0f, 0.0f).y == float2(6.0f, 0.0f).y)) && all(bool2(float2(0.0f, 6.0f).x == float2(0.0f, 6.0f).x, float2(0.0f, 6.0f).y == float2(0.0f, 6.0f).y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _121 = false;
+ }
+ ok = _121;
+ float4x3 m43 = float4x3(float3(7.0f, 0.0f, 0.0f), float3(0.0f, 7.0f, 0.0f), float3(0.0f, 0.0f, 7.0f), 0.0f.xxx);
+ bool _144 = false;
+ if (_121)
+ {
+ _144 = ((all(bool3(float3(7.0f, 0.0f, 0.0f).x == float3(7.0f, 0.0f, 0.0f).x, float3(7.0f, 0.0f, 0.0f).y == float3(7.0f, 0.0f, 0.0f).y, float3(7.0f, 0.0f, 0.0f).z == float3(7.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 7.0f, 0.0f).x == float3(0.0f, 7.0f, 0.0f).x, float3(0.0f, 7.0f, 0.0f).y == float3(0.0f, 7.0f, 0.0f).y, float3(0.0f, 7.0f, 0.0f).z == float3(0.0f, 7.0f, 0.0f).z))) && all(bool3(float3(0.0f, 0.0f, 7.0f).x == float3(0.0f, 0.0f, 7.0f).x, float3(0.0f, 0.0f, 7.0f).y == float3(0.0f, 0.0f, 7.0f).y, float3(0.0f, 0.0f, 7.0f).z == float3(0.0f, 0.0f, 7.0f).z))) && all(bool3(0.0f.xxx.x == 0.0f.xxx.x, 0.0f.xxx.y == 0.0f.xxx.y, 0.0f.xxx.z == 0.0f.xxx.z));
+ }
+ else
+ {
+ _144 = false;
+ }
+ ok = _144;
+ float2x2 _148 = mul(float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f)), float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx));
+ float2x2 m22 = _148;
+ bool _162 = false;
+ if (_144)
+ {
+ float2 _155 = _148[0];
+ float2 _158 = _148[1];
+ _162 = all(bool2(_155.x == float2(8.0f, 0.0f).x, _155.y == float2(8.0f, 0.0f).y)) && all(bool2(_158.x == float2(0.0f, 8.0f).x, _158.y == float2(0.0f, 8.0f).y));
+ }
+ else
+ {
+ _162 = false;
+ }
+ ok = _162;
+ float3x3 _166 = mul(float3x4(float4(5.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 5.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 5.0f, 0.0f)), float4x3(float3(7.0f, 0.0f, 0.0f), float3(0.0f, 7.0f, 0.0f), float3(0.0f, 0.0f, 7.0f), 0.0f.xxx));
+ float3x3 m33 = _166;
+ bool _185 = false;
+ if (_162)
+ {
+ float3 _174 = _166[0];
+ float3 _177 = _166[1];
+ float3 _181 = _166[2];
+ _185 = (all(bool3(_174.x == float3(35.0f, 0.0f, 0.0f).x, _174.y == float3(35.0f, 0.0f, 0.0f).y, _174.z == float3(35.0f, 0.0f, 0.0f).z)) && all(bool3(_177.x == float3(0.0f, 35.0f, 0.0f).x, _177.y == float3(0.0f, 35.0f, 0.0f).y, _177.z == float3(0.0f, 35.0f, 0.0f).z))) && all(bool3(_181.x == float3(0.0f, 0.0f, 35.0f).x, _181.y == float3(0.0f, 0.0f, 35.0f).y, _181.z == float3(0.0f, 0.0f, 35.0f).z));
+ }
+ else
+ {
+ _185 = false;
+ }
+ ok = _185;
+ float3 _189 = float3(2.0f, 0.0f, 0.0f) + 1.0f.xxx;
+ float3 _190 = float3(0.0f, 2.0f, 0.0f) + 1.0f.xxx;
+ m23 = float2x3(_189, _190);
+ bool _202 = false;
+ if (_185)
+ {
+ _202 = all(bool3(_189.x == float3(3.0f, 1.0f, 1.0f).x, _189.y == float3(3.0f, 1.0f, 1.0f).y, _189.z == float3(3.0f, 1.0f, 1.0f).z)) && all(bool3(_190.x == float3(1.0f, 3.0f, 1.0f).x, _190.y == float3(1.0f, 3.0f, 1.0f).y, _190.z == float3(1.0f, 3.0f, 1.0f).z));
+ }
+ else
+ {
+ _202 = false;
+ }
+ ok = _202;
+ float2 _205 = float2(4.0f, 0.0f) - 2.0f.xx;
+ float2 _206 = float2(0.0f, 4.0f) - 2.0f.xx;
+ float2 _207 = 0.0f.xx - 2.0f.xx;
+ m32 = float3x2(_205, _206, _207);
+ bool _224 = false;
+ if (_202)
+ {
+ _224 = (all(bool2(_205.x == float2(2.0f, -2.0f).x, _205.y == float2(2.0f, -2.0f).y)) && all(bool2(_206.x == float2(-2.0f, 2.0f).x, _206.y == float2(-2.0f, 2.0f).y))) && all(bool2(_207.x == (-2.0f).xx.x, _207.y == (-2.0f).xx.y));
+ }
+ else
+ {
+ _224 = false;
+ }
+ ok = _224;
+ float4 _227 = float4(3.0f, 0.0f, 0.0f, 0.0f) / 4.0f.xxxx;
+ float4 _228 = float4(0.0f, 3.0f, 0.0f, 0.0f) / 4.0f.xxxx;
+ m24 = float2x4(_227, _228);
+ bool _241 = false;
+ if (_224)
+ {
+ _241 = all(bool4(_227.x == float4(0.75f, 0.0f, 0.0f, 0.0f).x, _227.y == float4(0.75f, 0.0f, 0.0f, 0.0f).y, _227.z == float4(0.75f, 0.0f, 0.0f, 0.0f).z, _227.w == float4(0.75f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(_228.x == float4(0.0f, 0.75f, 0.0f, 0.0f).x, _228.y == float4(0.0f, 0.75f, 0.0f, 0.0f).y, _228.z == float4(0.0f, 0.75f, 0.0f, 0.0f).z, _228.w == float4(0.0f, 0.75f, 0.0f, 0.0f).w));
+ }
+ else
+ {
+ _241 = false;
+ }
+ ok = _241;
+ return _241;
+}
+
+float4 main(float2 _243)
+{
+ bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
+ float2x3 _RESERVED_IDENTIFIER_FIXUP_1_m23 = float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f));
+ bool _254 = false;
+ if (true)
+ {
+ _254 = all(bool3(float3(2.0f, 0.0f, 0.0f).x == float3(2.0f, 0.0f, 0.0f).x, float3(2.0f, 0.0f, 0.0f).y == float3(2.0f, 0.0f, 0.0f).y, float3(2.0f, 0.0f, 0.0f).z == float3(2.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 2.0f, 0.0f).x == float3(0.0f, 2.0f, 0.0f).x, float3(0.0f, 2.0f, 0.0f).y == float3(0.0f, 2.0f, 0.0f).y, float3(0.0f, 2.0f, 0.0f).z == float3(0.0f, 2.0f, 0.0f).z));
+ }
+ else
+ {
+ _254 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _254;
+ float2x4 _RESERVED_IDENTIFIER_FIXUP_2_m24 = float2x4(float4(3.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 3.0f, 0.0f, 0.0f));
+ bool _263 = false;
+ if (_254)
+ {
+ _263 = all(bool4(float4(3.0f, 0.0f, 0.0f, 0.0f).x == float4(3.0f, 0.0f, 0.0f, 0.0f).x, float4(3.0f, 0.0f, 0.0f, 0.0f).y == float4(3.0f, 0.0f, 0.0f, 0.0f).y, float4(3.0f, 0.0f, 0.0f, 0.0f).z == float4(3.0f, 0.0f, 0.0f, 0.0f).z, float4(3.0f, 0.0f, 0.0f, 0.0f).w == float4(3.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 3.0f, 0.0f, 0.0f).x == float4(0.0f, 3.0f, 0.0f, 0.0f).x, float4(0.0f, 3.0f, 0.0f, 0.0f).y == float4(0.0f, 3.0f, 0.0f, 0.0f).y, float4(0.0f, 3.0f, 0.0f, 0.0f).z == float4(0.0f, 3.0f, 0.0f, 0.0f).z, float4(0.0f, 3.0f, 0.0f, 0.0f).w == float4(0.0f, 3.0f, 0.0f, 0.0f).w));
+ }
+ else
+ {
+ _263 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _263;
+ float3x2 _RESERVED_IDENTIFIER_FIXUP_3_m32 = float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx);
+ bool _275 = false;
+ if (_263)
+ {
+ _275 = (all(bool2(float2(4.0f, 0.0f).x == float2(4.0f, 0.0f).x, float2(4.0f, 0.0f).y == float2(4.0f, 0.0f).y)) && all(bool2(float2(0.0f, 4.0f).x == float2(0.0f, 4.0f).x, float2(0.0f, 4.0f).y == float2(0.0f, 4.0f).y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _275 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _275;
+ float2x2 _277 = mul(float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f)), float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx));
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_7_m22 = _277;
+ bool _287 = false;
+ if (_275)
+ {
+ float2 _280 = _277[0];
+ float2 _283 = _277[1];
+ _287 = all(bool2(_280.x == float2(8.0f, 0.0f).x, _280.y == float2(8.0f, 0.0f).y)) && all(bool2(_283.x == float2(0.0f, 8.0f).x, _283.y == float2(0.0f, 8.0f).y));
+ }
+ else
+ {
+ _287 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _287;
+ float3 _288 = float3(2.0f, 0.0f, 0.0f) + 1.0f.xxx;
+ float3 _289 = float3(0.0f, 2.0f, 0.0f) + 1.0f.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_1_m23 = float2x3(_288, _289);
+ bool _298 = false;
+ if (_287)
+ {
+ _298 = all(bool3(_288.x == float3(3.0f, 1.0f, 1.0f).x, _288.y == float3(3.0f, 1.0f, 1.0f).y, _288.z == float3(3.0f, 1.0f, 1.0f).z)) && all(bool3(_289.x == float3(1.0f, 3.0f, 1.0f).x, _289.y == float3(1.0f, 3.0f, 1.0f).y, _289.z == float3(1.0f, 3.0f, 1.0f).z));
+ }
+ else
+ {
+ _298 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _298;
+ float2 _299 = float2(4.0f, 0.0f) - 2.0f.xx;
+ float2 _300 = float2(0.0f, 4.0f) - 2.0f.xx;
+ float2 _301 = 0.0f.xx - 2.0f.xx;
+ _RESERVED_IDENTIFIER_FIXUP_3_m32 = float3x2(_299, _300, _301);
+ bool _313 = false;
+ if (_298)
+ {
+ _313 = (all(bool2(_299.x == float2(2.0f, -2.0f).x, _299.y == float2(2.0f, -2.0f).y)) && all(bool2(_300.x == float2(-2.0f, 2.0f).x, _300.y == float2(-2.0f, 2.0f).y))) && all(bool2(_301.x == (-2.0f).xx.x, _301.y == (-2.0f).xx.y));
+ }
+ else
+ {
+ _313 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _313;
+ float4 _314 = float4(3.0f, 0.0f, 0.0f, 0.0f) / 4.0f.xxxx;
+ float4 _315 = float4(0.0f, 3.0f, 0.0f, 0.0f) / 4.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_2_m24 = float2x4(_314, _315);
+ bool _324 = false;
+ if (_313)
+ {
+ _324 = all(bool4(_314.x == float4(0.75f, 0.0f, 0.0f, 0.0f).x, _314.y == float4(0.75f, 0.0f, 0.0f, 0.0f).y, _314.z == float4(0.75f, 0.0f, 0.0f, 0.0f).z, _314.w == float4(0.75f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(_315.x == float4(0.0f, 0.75f, 0.0f, 0.0f).x, _315.y == float4(0.0f, 0.75f, 0.0f, 0.0f).y, _315.z == float4(0.0f, 0.75f, 0.0f, 0.0f).z, _315.w == float4(0.0f, 0.75f, 0.0f, 0.0f).w));
+ }
+ else
+ {
+ _324 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _324;
+ bool _328 = false;
+ if (_324)
+ {
+ _328 = test_half_b();
+ }
+ else
+ {
+ _328 = false;
+ }
+ float4 _329 = 0.0f.xxxx;
+ if (_328)
+ {
+ _329 = _11_colorGreen;
+ }
+ else
+ {
+ _329 = _11_colorRed;
+ }
+ return _329;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixConstructorsES2.hlsl b/tests/sksl/shared/MatrixConstructorsES2.hlsl
new file mode 100644
index 0000000..e71f8af
--- /dev/null
+++ b/tests/sksl/shared/MatrixConstructorsES2.hlsl
@@ -0,0 +1,78 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _38 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
+ float4 f4 = _38;
+ float3 _41 = _38.xyz;
+ float2 _46 = float2(_41.xy);
+ float2 _48 = float2(_41.z, 4.0f);
+ bool _61 = all(bool2(_46.x == float2(1.0f, 2.0f).x, _46.y == float2(1.0f, 2.0f).y)) && all(bool2(_48.x == float2(3.0f, 4.0f).x, _48.y == float2(3.0f, 4.0f).y));
+ bool ok = _61;
+ bool _89 = false;
+ if (_61)
+ {
+ float2 _66 = _38.zw;
+ float3 _70 = float3(_38.xy, _66.x);
+ float3 _72 = float3(_66.y, _10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y);
+ float3 _73 = float3(_10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y, _10_testMatrix2x2[0].x);
+ _89 = (all(bool3(_70.x == float3(1.0f, 2.0f, 3.0f).x, _70.y == float3(1.0f, 2.0f, 3.0f).y, _70.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_72.x == float3(4.0f, 1.0f, 2.0f).x, _72.y == float3(4.0f, 1.0f, 2.0f).y, _72.z == float3(4.0f, 1.0f, 2.0f).z))) && all(bool3(_73.x == float3(3.0f, 4.0f, 1.0f).x, _73.y == float3(3.0f, 4.0f, 1.0f).y, _73.z == float3(3.0f, 4.0f, 1.0f).z));
+ }
+ else
+ {
+ _89 = false;
+ }
+ ok = _89;
+ bool _127 = false;
+ if (_89)
+ {
+ float3 _93 = _38.wxy;
+ float4 _94 = _38.zwxy;
+ float4 _100 = float4(_38.xyz, _93.x);
+ float4 _105 = float4(_93.yz, _94.xy);
+ float4 _110 = float4(_94.zw, _38.zw);
+ _127 = ((all(bool4(_100.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _100.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _100.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _100.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_105.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _105.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _105.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _105.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w))) && all(bool4(_110.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _110.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _110.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _110.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w))) && all(bool4(_38.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _38.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _38.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _38.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
+ }
+ else
+ {
+ _127 = false;
+ }
+ ok = _127;
+ float4 _128 = 0.0f.xxxx;
+ if (_127)
+ {
+ _128 = _10_colorGreen;
+ }
+ else
+ {
+ _128 = _10_colorRed;
+ }
+ return _128;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixConstructorsES3.hlsl b/tests/sksl/shared/MatrixConstructorsES3.hlsl
new file mode 100644
index 0000000..917742a
--- /dev/null
+++ b/tests/sksl/shared/MatrixConstructorsES3.hlsl
@@ -0,0 +1,107 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ float4 _38 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
+ float4 f4 = _38;
+ float3 _43 = float3(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x);
+ float3 _46 = float3(_10_testMatrix2x2[1].y, _38.xy);
+ bool _61 = all(bool3(_43.x == float3(1.0f, 2.0f, 3.0f).x, _43.y == float3(1.0f, 2.0f, 3.0f).y, _43.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_46.x == float3(4.0f, 1.0f, 2.0f).x, _46.y == float3(4.0f, 1.0f, 2.0f).y, _46.z == float3(4.0f, 1.0f, 2.0f).z));
+ bool ok = _61;
+ bool _86 = false;
+ if (_61)
+ {
+ float4 _66 = _38.wxyz;
+ float4 _71 = float4(_38.xyz, _66.x);
+ float4 _75 = float4(_66.yzw, _10_testMatrix2x2[1].y);
+ _86 = all(bool4(_71.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _71.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _71.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _71.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_75.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _75.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _75.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _75.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
+ }
+ else
+ {
+ _86 = false;
+ }
+ ok = _86;
+ bool _110 = false;
+ if (_86)
+ {
+ float2 _90 = _38.zw;
+ float3 _94 = float3(_38.xy, _90.x);
+ float3 _96 = float3(_90.y, _10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y);
+ float3 _97 = float3(_10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y, _10_testMatrix2x2[0].x);
+ _110 = (all(bool3(_94.x == float3(1.0f, 2.0f, 3.0f).x, _94.y == float3(1.0f, 2.0f, 3.0f).y, _94.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_96.x == float3(4.0f, 1.0f, 2.0f).x, _96.y == float3(4.0f, 1.0f, 2.0f).y, _96.z == float3(4.0f, 1.0f, 2.0f).z))) && all(bool3(_97.x == float3(3.0f, 4.0f, 1.0f).x, _97.y == float3(3.0f, 4.0f, 1.0f).y, _97.z == float3(3.0f, 4.0f, 1.0f).z));
+ }
+ else
+ {
+ _110 = false;
+ }
+ ok = _110;
+ bool _143 = false;
+ if (_110)
+ {
+ float3 _113 = _38.xyz;
+ float4 _114 = _38.wxyz;
+ float2 _117 = float2(_113.xy);
+ float2 _120 = float2(_113.z, _114.x);
+ float2 _123 = float2(_114.yz);
+ float2 _125 = float2(_114.w, _10_testMatrix2x2[1].y);
+ _143 = ((all(bool2(_117.x == float2(1.0f, 2.0f).x, _117.y == float2(1.0f, 2.0f).y)) && all(bool2(_120.x == float2(3.0f, 4.0f).x, _120.y == float2(3.0f, 4.0f).y))) && all(bool2(_123.x == float2(1.0f, 2.0f).x, _123.y == float2(1.0f, 2.0f).y))) && all(bool2(_125.x == float2(3.0f, 4.0f).x, _125.y == float2(3.0f, 4.0f).y));
+ }
+ else
+ {
+ _143 = false;
+ }
+ ok = _143;
+ bool _175 = false;
+ if (_143)
+ {
+ float4 _146 = _38.yzwx;
+ float4 _147 = _38.yzwx;
+ float3 _148 = _38.yzw;
+ float3 _151 = float3(_10_testMatrix2x2[0].x, _146.xy);
+ float3 _155 = float3(_146.zw, _147.x);
+ float3 _159 = float3(_147.yzw);
+ _175 = ((all(bool3(_151.x == float3(1.0f, 2.0f, 3.0f).x, _151.y == float3(1.0f, 2.0f, 3.0f).y, _151.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_155.x == float3(4.0f, 1.0f, 2.0f).x, _155.y == float3(4.0f, 1.0f, 2.0f).y, _155.z == float3(4.0f, 1.0f, 2.0f).z))) && all(bool3(_159.x == float3(3.0f, 4.0f, 1.0f).x, _159.y == float3(3.0f, 4.0f, 1.0f).y, _159.z == float3(3.0f, 4.0f, 1.0f).z))) && all(bool3(_148.x == float3(2.0f, 3.0f, 4.0f).x, _148.y == float3(2.0f, 3.0f, 4.0f).y, _148.z == float3(2.0f, 3.0f, 4.0f).z));
+ }
+ else
+ {
+ _175 = false;
+ }
+ ok = _175;
+ float4 _176 = 0.0f.xxxx;
+ if (_175)
+ {
+ _176 = _10_colorGreen;
+ }
+ else
+ {
+ _176 = _10_colorRed;
+ }
+ return _176;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixEquality.hlsl b/tests/sksl/shared/MatrixEquality.hlsl
new file mode 100644
index 0000000..7fb2bc0
--- /dev/null
+++ b/tests/sksl/shared/MatrixEquality.hlsl
@@ -0,0 +1,84 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
+ row_major float3x3 _10_testMatrix3x3 : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
+ bool _55 = false;
+ if (true)
+ {
+ _55 = all(bool2(_10_testMatrix2x2[0].x == float2(1.0f, 2.0f).x, _10_testMatrix2x2[0].y == float2(1.0f, 2.0f).y)) && all(bool2(_10_testMatrix2x2[1].x == float2(3.0f, 4.0f).x, _10_testMatrix2x2[1].y == float2(3.0f, 4.0f).y));
+ }
+ else
+ {
+ _55 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _55;
+ bool _83 = false;
+ if (_55)
+ {
+ _83 = (all(bool3(_10_testMatrix3x3[0].x == float3(1.0f, 2.0f, 3.0f).x, _10_testMatrix3x3[0].y == float3(1.0f, 2.0f, 3.0f).y, _10_testMatrix3x3[0].z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_10_testMatrix3x3[1].x == float3(4.0f, 5.0f, 6.0f).x, _10_testMatrix3x3[1].y == float3(4.0f, 5.0f, 6.0f).y, _10_testMatrix3x3[1].z == float3(4.0f, 5.0f, 6.0f).z))) && all(bool3(_10_testMatrix3x3[2].x == float3(7.0f, 8.0f, 9.0f).x, _10_testMatrix3x3[2].y == float3(7.0f, 8.0f, 9.0f).y, _10_testMatrix3x3[2].z == float3(7.0f, 8.0f, 9.0f).z));
+ }
+ else
+ {
+ _83 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _83;
+ bool _99 = false;
+ if (_83)
+ {
+ _99 = any(bool2(_10_testMatrix2x2[0].x != float2(100.0f, 0.0f).x, _10_testMatrix2x2[0].y != float2(100.0f, 0.0f).y)) || any(bool2(_10_testMatrix2x2[1].x != float2(0.0f, 100.0f).x, _10_testMatrix2x2[1].y != float2(0.0f, 100.0f).y));
+ }
+ else
+ {
+ _99 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _99;
+ bool _119 = false;
+ if (_99)
+ {
+ _119 = (any(bool3(_10_testMatrix3x3[0].x != float3(9.0f, 8.0f, 7.0f).x, _10_testMatrix3x3[0].y != float3(9.0f, 8.0f, 7.0f).y, _10_testMatrix3x3[0].z != float3(9.0f, 8.0f, 7.0f).z)) || any(bool3(_10_testMatrix3x3[1].x != float3(6.0f, 5.0f, 4.0f).x, _10_testMatrix3x3[1].y != float3(6.0f, 5.0f, 4.0f).y, _10_testMatrix3x3[1].z != float3(6.0f, 5.0f, 4.0f).z))) || any(bool3(_10_testMatrix3x3[2].x != float3(3.0f, 2.0f, 1.0f).x, _10_testMatrix3x3[2].y != float3(3.0f, 2.0f, 1.0f).y, _10_testMatrix3x3[2].z != float3(3.0f, 2.0f, 1.0f).z));
+ }
+ else
+ {
+ _119 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _119;
+ float4 _120 = 0.0f.xxxx;
+ if (_119)
+ {
+ _120 = _10_colorGreen;
+ }
+ else
+ {
+ _120 = _10_colorRed;
+ }
+ return _120;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixOpEqualsES3.hlsl b/tests/sksl/shared/MatrixOpEqualsES3.hlsl
new file mode 100644
index 0000000..9467d34
--- /dev/null
+++ b/tests/sksl/shared/MatrixOpEqualsES3.hlsl
@@ -0,0 +1,357 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorRed : packoffset(c0);
+ float4 _11_colorGreen : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_matrix_op_matrix_half_b()
+{
+ bool ok = true;
+ float3x2 splat_4 = float3x2(4.0f.xx, 4.0f.xx, 4.0f.xx);
+ float3x2 m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
+ float2 _40 = float2(2.0f, 0.0f) + 4.0f.xx;
+ float2 _41 = float2(0.0f, 2.0f) + 4.0f.xx;
+ float2 _42 = 0.0f.xx + 4.0f.xx;
+ m = float3x2(_40, _41, _42);
+ bool _60 = false;
+ if (true)
+ {
+ _60 = (all(bool2(_40.x == float2(6.0f, 4.0f).x, _40.y == float2(6.0f, 4.0f).y)) && all(bool2(_41.x == float2(4.0f, 6.0f).x, _41.y == float2(4.0f, 6.0f).y))) && all(bool2(_42.x == 4.0f.xx.x, _42.y == 4.0f.xx.y));
+ }
+ else
+ {
+ _60 = false;
+ }
+ ok = _60;
+ m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
+ float2 _61 = float2(2.0f, 0.0f) - 4.0f.xx;
+ float2 _62 = float2(0.0f, 2.0f) - 4.0f.xx;
+ float2 _63 = 0.0f.xx - 4.0f.xx;
+ m = float3x2(_61, _62, _63);
+ bool _81 = false;
+ if (_60)
+ {
+ _81 = (all(bool2(_61.x == float2(-2.0f, -4.0f).x, _61.y == float2(-2.0f, -4.0f).y)) && all(bool2(_62.x == float2(-4.0f, -2.0f).x, _62.y == float2(-4.0f, -2.0f).y))) && all(bool2(_63.x == (-4.0f).xx.x, _63.y == (-4.0f).xx.y));
+ }
+ else
+ {
+ _81 = false;
+ }
+ ok = _81;
+ m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
+ float2 _82 = float2(2.0f, 0.0f) / 4.0f.xx;
+ float2 _83 = float2(0.0f, 2.0f) / 4.0f.xx;
+ float2 _84 = 0.0f.xx / 4.0f.xx;
+ m = float3x2(_82, _83, _84);
+ bool _100 = false;
+ if (_81)
+ {
+ _100 = (all(bool2(_82.x == float2(0.5f, 0.0f).x, _82.y == float2(0.5f, 0.0f).y)) && all(bool2(_83.x == float2(0.0f, 0.5f).x, _83.y == float2(0.0f, 0.5f).y))) && all(bool2(_84.x == 0.0f.xx.x, _84.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _100 = false;
+ }
+ ok = _100;
+ float2x3 splat_4_1 = float2x3(4.0f.xxx, 4.0f.xxx);
+ float2x3 m_1 = float2x3(4.0f.xxx, 4.0f.xxx);
+ float3 _111 = 4.0f.xxx + float3(2.0f, 0.0f, 0.0f);
+ float3 _112 = 4.0f.xxx + float3(0.0f, 2.0f, 0.0f);
+ m_1 = float2x3(_111, _112);
+ bool _125 = false;
+ if (_100)
+ {
+ _125 = all(bool3(_111.x == float3(6.0f, 4.0f, 4.0f).x, _111.y == float3(6.0f, 4.0f, 4.0f).y, _111.z == float3(6.0f, 4.0f, 4.0f).z)) && all(bool3(_112.x == float3(4.0f, 6.0f, 4.0f).x, _112.y == float3(4.0f, 6.0f, 4.0f).y, _112.z == float3(4.0f, 6.0f, 4.0f).z));
+ }
+ else
+ {
+ _125 = false;
+ }
+ ok = _125;
+ m_1 = float2x3(4.0f.xxx, 4.0f.xxx);
+ float3 _126 = 4.0f.xxx - float3(2.0f, 0.0f, 0.0f);
+ float3 _127 = 4.0f.xxx - float3(0.0f, 2.0f, 0.0f);
+ m_1 = float2x3(_126, _127);
+ bool _139 = false;
+ if (_125)
+ {
+ _139 = all(bool3(_126.x == float3(2.0f, 4.0f, 4.0f).x, _126.y == float3(2.0f, 4.0f, 4.0f).y, _126.z == float3(2.0f, 4.0f, 4.0f).z)) && all(bool3(_127.x == float3(4.0f, 2.0f, 4.0f).x, _127.y == float3(4.0f, 2.0f, 4.0f).y, _127.z == float3(4.0f, 2.0f, 4.0f).z));
+ }
+ else
+ {
+ _139 = false;
+ }
+ ok = _139;
+ m_1 = float2x3(4.0f.xxx, 4.0f.xxx);
+ float3 _142 = 4.0f.xxx / 2.0f.xxx;
+ float3 _143 = 4.0f.xxx / 2.0f.xxx;
+ m_1 = float2x3(_142, _143);
+ bool _152 = false;
+ if (_139)
+ {
+ _152 = all(bool3(_142.x == 2.0f.xxx.x, _142.y == 2.0f.xxx.y, _142.z == 2.0f.xxx.z)) && all(bool3(_143.x == 2.0f.xxx.x, _143.y == 2.0f.xxx.y, _143.z == 2.0f.xxx.z));
+ }
+ else
+ {
+ _152 = false;
+ }
+ ok = _152;
+ float4x3 m_2 = float4x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), float3(10.0f, 11.0f, 12.0f));
+ float3 _179 = float3(1.0f, 2.0f, 3.0f) + float3(16.0f, 15.0f, 14.0f);
+ float3 _180 = float3(4.0f, 5.0f, 6.0f) + float3(13.0f, 12.0f, 11.0f);
+ float3 _181 = float3(7.0f, 8.0f, 9.0f) + float3(10.0f, 9.0f, 8.0f);
+ float3 _182 = float3(10.0f, 11.0f, 12.0f) + float3(7.0f, 6.0f, 5.0f);
+ m_2 = float4x3(_179, _180, _181, _182);
+ bool _200 = false;
+ if (_152)
+ {
+ _200 = ((all(bool3(_179.x == 17.0f.xxx.x, _179.y == 17.0f.xxx.y, _179.z == 17.0f.xxx.z)) && all(bool3(_180.x == 17.0f.xxx.x, _180.y == 17.0f.xxx.y, _180.z == 17.0f.xxx.z))) && all(bool3(_181.x == 17.0f.xxx.x, _181.y == 17.0f.xxx.y, _181.z == 17.0f.xxx.z))) && all(bool3(_182.x == 17.0f.xxx.x, _182.y == 17.0f.xxx.y, _182.z == 17.0f.xxx.z));
+ }
+ else
+ {
+ _200 = false;
+ }
+ ok = _200;
+ float4x2 m_3 = float4x2(float2(10.0f, 20.0f), float2(30.0f, 40.0f), float2(50.0f, 60.0f), float2(70.0f, 80.0f));
+ float2 _221 = float2(10.0f, 20.0f) - float2(1.0f, 2.0f);
+ float2 _222 = float2(30.0f, 40.0f) - float2(3.0f, 4.0f);
+ float2 _223 = float2(50.0f, 60.0f) - float2(5.0f, 6.0f);
+ float2 _224 = float2(70.0f, 80.0f) - float2(7.0f, 8.0f);
+ m_3 = float4x2(_221, _222, _223, _224);
+ bool _251 = false;
+ if (_200)
+ {
+ _251 = ((all(bool2(_221.x == float2(9.0f, 18.0f).x, _221.y == float2(9.0f, 18.0f).y)) && all(bool2(_222.x == float2(27.0f, 36.0f).x, _222.y == float2(27.0f, 36.0f).y))) && all(bool2(_223.x == float2(45.0f, 54.0f).x, _223.y == float2(45.0f, 54.0f).y))) && all(bool2(_224.x == float2(63.0f, 72.0f).x, _224.y == float2(63.0f, 72.0f).y));
+ }
+ else
+ {
+ _251 = false;
+ }
+ ok = _251;
+ float2x4 m_4 = float2x4(float4(10.0f, 20.0f, 30.0f, 40.0f), float4(10.0f, 20.0f, 30.0f, 40.0f));
+ float4 _260 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 10.0f.xxxx;
+ float4 _261 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 5.0f.xxxx;
+ m_4 = float2x4(_260, _261);
+ bool _274 = false;
+ if (_251)
+ {
+ _274 = all(bool4(_260.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _260.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _260.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _260.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_261.x == float4(2.0f, 4.0f, 6.0f, 8.0f).x, _261.y == float4(2.0f, 4.0f, 6.0f, 8.0f).y, _261.z == float4(2.0f, 4.0f, 6.0f, 8.0f).z, _261.w == float4(2.0f, 4.0f, 6.0f, 8.0f).w));
+ }
+ else
+ {
+ _274 = false;
+ }
+ ok = _274;
+ float2x3 m_5 = float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f));
+ float2x3 _283 = mul(float2x2(float2(1.0f, 4.0f), float2(2.0f, 5.0f)), float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f)));
+ m_5 = _283;
+ bool _301 = false;
+ if (_274)
+ {
+ float3 _294 = _283[0];
+ float3 _297 = _283[1];
+ _301 = all(bool3(_294.x == float3(39.0f, 49.0f, 59.0f).x, _294.y == float3(39.0f, 49.0f, 59.0f).y, _294.z == float3(39.0f, 49.0f, 59.0f).z)) && all(bool3(_297.x == float3(54.0f, 68.0f, 82.0f).x, _297.y == float3(54.0f, 68.0f, 82.0f).y, _297.z == float3(54.0f, 68.0f, 82.0f).z));
+ }
+ else
+ {
+ _301 = false;
+ }
+ ok = _301;
+ return _301;
+}
+
+float4 main(float2 _303)
+{
+ bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
+ float3x2 _RESERVED_IDENTIFIER_FIXUP_1_splat_4 = float3x2(4.0f.xx, 4.0f.xx, 4.0f.xx);
+ float3x2 _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
+ float2 _308 = float2(2.0f, 0.0f) + 4.0f.xx;
+ float2 _309 = float2(0.0f, 2.0f) + 4.0f.xx;
+ float2 _310 = 0.0f.xx + 4.0f.xx;
+ _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(_308, _309, _310);
+ bool _322 = false;
+ if (true)
+ {
+ _322 = (all(bool2(_308.x == float2(6.0f, 4.0f).x, _308.y == float2(6.0f, 4.0f).y)) && all(bool2(_309.x == float2(4.0f, 6.0f).x, _309.y == float2(4.0f, 6.0f).y))) && all(bool2(_310.x == 4.0f.xx.x, _310.y == 4.0f.xx.y));
+ }
+ else
+ {
+ _322 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _322;
+ _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
+ float2 _323 = float2(2.0f, 0.0f) - 4.0f.xx;
+ float2 _324 = float2(0.0f, 2.0f) - 4.0f.xx;
+ float2 _325 = 0.0f.xx - 4.0f.xx;
+ _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(_323, _324, _325);
+ bool _337 = false;
+ if (_322)
+ {
+ _337 = (all(bool2(_323.x == float2(-2.0f, -4.0f).x, _323.y == float2(-2.0f, -4.0f).y)) && all(bool2(_324.x == float2(-4.0f, -2.0f).x, _324.y == float2(-4.0f, -2.0f).y))) && all(bool2(_325.x == (-4.0f).xx.x, _325.y == (-4.0f).xx.y));
+ }
+ else
+ {
+ _337 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _337;
+ _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
+ float2 _338 = float2(2.0f, 0.0f) / 4.0f.xx;
+ float2 _339 = float2(0.0f, 2.0f) / 4.0f.xx;
+ float2 _340 = 0.0f.xx / 4.0f.xx;
+ _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(_338, _339, _340);
+ bool _352 = false;
+ if (_337)
+ {
+ _352 = (all(bool2(_338.x == float2(0.5f, 0.0f).x, _338.y == float2(0.5f, 0.0f).y)) && all(bool2(_339.x == float2(0.0f, 0.5f).x, _339.y == float2(0.0f, 0.5f).y))) && all(bool2(_340.x == 0.0f.xx.x, _340.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _352 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _352;
+ float2x3 _RESERVED_IDENTIFIER_FIXUP_3_splat_4 = float2x3(4.0f.xxx, 4.0f.xxx);
+ float2x3 _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(4.0f.xxx, 4.0f.xxx);
+ float3 _355 = 4.0f.xxx + float3(2.0f, 0.0f, 0.0f);
+ float3 _356 = 4.0f.xxx + float3(0.0f, 2.0f, 0.0f);
+ _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(_355, _356);
+ bool _365 = false;
+ if (_352)
+ {
+ _365 = all(bool3(_355.x == float3(6.0f, 4.0f, 4.0f).x, _355.y == float3(6.0f, 4.0f, 4.0f).y, _355.z == float3(6.0f, 4.0f, 4.0f).z)) && all(bool3(_356.x == float3(4.0f, 6.0f, 4.0f).x, _356.y == float3(4.0f, 6.0f, 4.0f).y, _356.z == float3(4.0f, 6.0f, 4.0f).z));
+ }
+ else
+ {
+ _365 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _365;
+ _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(4.0f.xxx, 4.0f.xxx);
+ float3 _366 = 4.0f.xxx - float3(2.0f, 0.0f, 0.0f);
+ float3 _367 = 4.0f.xxx - float3(0.0f, 2.0f, 0.0f);
+ _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(_366, _367);
+ bool _376 = false;
+ if (_365)
+ {
+ _376 = all(bool3(_366.x == float3(2.0f, 4.0f, 4.0f).x, _366.y == float3(2.0f, 4.0f, 4.0f).y, _366.z == float3(2.0f, 4.0f, 4.0f).z)) && all(bool3(_367.x == float3(4.0f, 2.0f, 4.0f).x, _367.y == float3(4.0f, 2.0f, 4.0f).y, _367.z == float3(4.0f, 2.0f, 4.0f).z));
+ }
+ else
+ {
+ _376 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _376;
+ _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(4.0f.xxx, 4.0f.xxx);
+ float3 _377 = 4.0f.xxx / 2.0f.xxx;
+ float3 _378 = 4.0f.xxx / 2.0f.xxx;
+ _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(_377, _378);
+ bool _387 = false;
+ if (_376)
+ {
+ _387 = all(bool3(_377.x == 2.0f.xxx.x, _377.y == 2.0f.xxx.y, _377.z == 2.0f.xxx.z)) && all(bool3(_378.x == 2.0f.xxx.x, _378.y == 2.0f.xxx.y, _378.z == 2.0f.xxx.z));
+ }
+ else
+ {
+ _387 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _387;
+ float4x3 _RESERVED_IDENTIFIER_FIXUP_5_m = float4x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), float3(10.0f, 11.0f, 12.0f));
+ float3 _389 = float3(1.0f, 2.0f, 3.0f) + float3(16.0f, 15.0f, 14.0f);
+ float3 _390 = float3(4.0f, 5.0f, 6.0f) + float3(13.0f, 12.0f, 11.0f);
+ float3 _391 = float3(7.0f, 8.0f, 9.0f) + float3(10.0f, 9.0f, 8.0f);
+ float3 _392 = float3(10.0f, 11.0f, 12.0f) + float3(7.0f, 6.0f, 5.0f);
+ _RESERVED_IDENTIFIER_FIXUP_5_m = float4x3(_389, _390, _391, _392);
+ bool _407 = false;
+ if (_387)
+ {
+ _407 = ((all(bool3(_389.x == 17.0f.xxx.x, _389.y == 17.0f.xxx.y, _389.z == 17.0f.xxx.z)) && all(bool3(_390.x == 17.0f.xxx.x, _390.y == 17.0f.xxx.y, _390.z == 17.0f.xxx.z))) && all(bool3(_391.x == 17.0f.xxx.x, _391.y == 17.0f.xxx.y, _391.z == 17.0f.xxx.z))) && all(bool3(_392.x == 17.0f.xxx.x, _392.y == 17.0f.xxx.y, _392.z == 17.0f.xxx.z));
+ }
+ else
+ {
+ _407 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _407;
+ float4x2 _RESERVED_IDENTIFIER_FIXUP_6_m = float4x2(float2(10.0f, 20.0f), float2(30.0f, 40.0f), float2(50.0f, 60.0f), float2(70.0f, 80.0f));
+ float2 _409 = float2(10.0f, 20.0f) - float2(1.0f, 2.0f);
+ float2 _410 = float2(30.0f, 40.0f) - float2(3.0f, 4.0f);
+ float2 _411 = float2(50.0f, 60.0f) - float2(5.0f, 6.0f);
+ float2 _412 = float2(70.0f, 80.0f) - float2(7.0f, 8.0f);
+ _RESERVED_IDENTIFIER_FIXUP_6_m = float4x2(_409, _410, _411, _412);
+ bool _427 = false;
+ if (_407)
+ {
+ _427 = ((all(bool2(_409.x == float2(9.0f, 18.0f).x, _409.y == float2(9.0f, 18.0f).y)) && all(bool2(_410.x == float2(27.0f, 36.0f).x, _410.y == float2(27.0f, 36.0f).y))) && all(bool2(_411.x == float2(45.0f, 54.0f).x, _411.y == float2(45.0f, 54.0f).y))) && all(bool2(_412.x == float2(63.0f, 72.0f).x, _412.y == float2(63.0f, 72.0f).y));
+ }
+ else
+ {
+ _427 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _427;
+ float2x4 _RESERVED_IDENTIFIER_FIXUP_7_m = float2x4(float4(10.0f, 20.0f, 30.0f, 40.0f), float4(10.0f, 20.0f, 30.0f, 40.0f));
+ float4 _429 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 10.0f.xxxx;
+ float4 _430 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 5.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_7_m = float2x4(_429, _430);
+ bool _439 = false;
+ if (_427)
+ {
+ _439 = all(bool4(_429.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _429.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _429.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _429.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_430.x == float4(2.0f, 4.0f, 6.0f, 8.0f).x, _430.y == float4(2.0f, 4.0f, 6.0f, 8.0f).y, _430.z == float4(2.0f, 4.0f, 6.0f, 8.0f).z, _430.w == float4(2.0f, 4.0f, 6.0f, 8.0f).w));
+ }
+ else
+ {
+ _439 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _439;
+ float2x3 _RESERVED_IDENTIFIER_FIXUP_8_m = float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f));
+ float2x3 _441 = mul(float2x2(float2(1.0f, 4.0f), float2(2.0f, 5.0f)), float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f)));
+ _RESERVED_IDENTIFIER_FIXUP_8_m = _441;
+ bool _451 = false;
+ if (_439)
+ {
+ float3 _444 = _441[0];
+ float3 _447 = _441[1];
+ _451 = all(bool3(_444.x == float3(39.0f, 49.0f, 59.0f).x, _444.y == float3(39.0f, 49.0f, 59.0f).y, _444.z == float3(39.0f, 49.0f, 59.0f).z)) && all(bool3(_447.x == float3(54.0f, 68.0f, 82.0f).x, _447.y == float3(54.0f, 68.0f, 82.0f).y, _447.z == float3(54.0f, 68.0f, 82.0f).z));
+ }
+ else
+ {
+ _451 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _451;
+ bool _455 = false;
+ if (_451)
+ {
+ _455 = test_matrix_op_matrix_half_b();
+ }
+ else
+ {
+ _455 = false;
+ }
+ float4 _456 = 0.0f.xxxx;
+ if (_455)
+ {
+ _456 = _11_colorGreen;
+ }
+ else
+ {
+ _456 = _11_colorRed;
+ }
+ return _456;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixScalarMath.hlsl b/tests/sksl/shared/MatrixScalarMath.hlsl
new file mode 100644
index 0000000..297ee8b
--- /dev/null
+++ b/tests/sksl/shared/MatrixScalarMath.hlsl
@@ -0,0 +1,185 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_bifffff22(int _30, float _31, float _32, float _33, float _34, float2x2 _35)
+{
+ float one = _11_colorRed.x;
+ float2 _52 = float2(_31 * _11_colorRed.x, _32 * _11_colorRed.x);
+ float2 _53 = float2(_33 * _11_colorRed.x, _34 * _11_colorRed.x);
+ float2x2 m2 = float2x2(_52, _53);
+ switch (_30)
+ {
+ case 1:
+ {
+ m2 = float2x2(_52 + 1.0f.xx, _53 + 1.0f.xx);
+ break;
+ }
+ case 2:
+ {
+ m2 = float2x2(m2[0] - 1.0f.xx, m2[1] - 1.0f.xx);
+ break;
+ }
+ case 3:
+ {
+ m2 = m2 * 2.0f;
+ break;
+ }
+ case 4:
+ {
+ m2 = float2x2(m2[0] / 2.0f.xx, m2[1] / 2.0f.xx);
+ break;
+ }
+ }
+ bool _102 = false;
+ if (m2[0].x == _35[0].x)
+ {
+ _102 = m2[0].y == _35[0].y;
+ }
+ else
+ {
+ _102 = false;
+ }
+ bool _112 = false;
+ if (_102)
+ {
+ _112 = m2[1].x == _35[1].x;
+ }
+ else
+ {
+ _112 = false;
+ }
+ bool _122 = false;
+ if (_112)
+ {
+ _122 = m2[1].y == _35[1].y;
+ }
+ else
+ {
+ _122 = false;
+ }
+ return _122;
+}
+
+float4 main(float2 _124)
+{
+ float f1 = _11_colorGreen.y;
+ float _134 = 2.0f * _11_colorGreen.y;
+ float f2 = _134;
+ float _140 = 3.0f * _11_colorGreen.y;
+ float f3 = _140;
+ float _146 = 4.0f * _11_colorGreen.y;
+ float f4 = _146;
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_0_expected = float2x2(float2(_11_colorGreen.y + 1.0f, _134 + 1.0f), float2(_140 + 1.0f, _146 + 1.0f));
+ float _RESERVED_IDENTIFIER_FIXUP_1_one = _11_colorRed.x;
+ float2 _164 = float2(_11_colorGreen.y * _11_colorRed.x, _134 * _11_colorRed.x);
+ float2 _165 = float2(_140 * _11_colorRed.x, _146 * _11_colorRed.x);
+ float2x2 _RESERVED_IDENTIFIER_FIXUP_2_m2 = float2x2(_164, _165);
+ _RESERVED_IDENTIFIER_FIXUP_2_m2 = float2x2(_164 + 1.0f.xx, _165 + 1.0f.xx);
+ bool _186 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_2_m2[0].x == _RESERVED_IDENTIFIER_FIXUP_0_expected[0].x)
+ {
+ _186 = _RESERVED_IDENTIFIER_FIXUP_2_m2[0].y == _RESERVED_IDENTIFIER_FIXUP_0_expected[0].y;
+ }
+ else
+ {
+ _186 = false;
+ }
+ bool _196 = false;
+ if (_186)
+ {
+ _196 = _RESERVED_IDENTIFIER_FIXUP_2_m2[1].x == _RESERVED_IDENTIFIER_FIXUP_0_expected[1].x;
+ }
+ else
+ {
+ _196 = false;
+ }
+ bool _206 = false;
+ if (_196)
+ {
+ _206 = _RESERVED_IDENTIFIER_FIXUP_2_m2[1].y == _RESERVED_IDENTIFIER_FIXUP_0_expected[1].y;
+ }
+ else
+ {
+ _206 = false;
+ }
+ bool _224 = false;
+ if (_206)
+ {
+ int _210 = 2;
+ float _211 = _11_colorGreen.y;
+ float _212 = _134;
+ float _213 = _140;
+ float _214 = _146;
+ float2x2 _222 = float2x2(float2(_11_colorGreen.y - 1.0f, _134 - 1.0f), float2(_140 - 1.0f, _146 - 1.0f));
+ _224 = test_bifffff22(_210, _211, _212, _213, _214, _222);
+ }
+ else
+ {
+ _224 = false;
+ }
+ bool _242 = false;
+ if (_224)
+ {
+ int _228 = 3;
+ float _229 = _11_colorGreen.y;
+ float _230 = _134;
+ float _231 = _140;
+ float _232 = _146;
+ float2x2 _240 = float2x2(float2(_11_colorGreen.y * 2.0f, _134 * 2.0f), float2(_140 * 2.0f, _146 * 2.0f));
+ _242 = test_bifffff22(_228, _229, _230, _231, _232, _240);
+ }
+ else
+ {
+ _242 = false;
+ }
+ bool _261 = false;
+ if (_242)
+ {
+ int _246 = 4;
+ float _247 = _11_colorGreen.y;
+ float _248 = _134;
+ float _249 = _140;
+ float _250 = _146;
+ float2x2 _259 = float2x2(float2(_11_colorGreen.y * 0.5f, _134 * 0.5f), float2(_140 * 0.5f, _146 * 0.5f));
+ _261 = test_bifffff22(_246, _247, _248, _249, _250, _259);
+ }
+ else
+ {
+ _261 = false;
+ }
+ float4 _262 = 0.0f.xxxx;
+ if (_261)
+ {
+ _262 = _11_colorGreen;
+ }
+ else
+ {
+ _262 = _11_colorRed;
+ }
+ return _262;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixScalarSplat.hlsl b/tests/sksl/shared/MatrixScalarSplat.hlsl
new file mode 100644
index 0000000..7653483
--- /dev/null
+++ b/tests/sksl/shared/MatrixScalarSplat.hlsl
@@ -0,0 +1,371 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_half_b()
+{
+ bool ok = true;
+ bool _73 = false;
+ if (ok)
+ {
+ float3x3 _34 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _41 = 4.0f.xxx;
+ float3x3 _42 = float3x3(_41, _41, _41);
+ float3x3 _52 = float3x3(_34[0] + _42[0], _34[1] + _42[1], _34[2] + _42[2]);
+ float3x3 _57 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
+ float3 _59 = _52[0];
+ float3 _60 = _57[0];
+ float3 _63 = _52[1];
+ float3 _64 = _57[1];
+ float3 _68 = _52[2];
+ float3 _69 = _57[2];
+ _73 = (all(bool3(_59.x == _60.x, _59.y == _60.y, _59.z == _60.z)) && all(bool3(_63.x == _64.x, _63.y == _64.y, _63.z == _64.z))) && all(bool3(_68.x == _69.x, _68.y == _69.y, _68.z == _69.z));
+ }
+ else
+ {
+ _73 = false;
+ }
+ ok = _73;
+ bool _113 = false;
+ if (ok)
+ {
+ float3x3 _77 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _81 = 4.0f.xxx;
+ float3x3 _82 = float3x3(_81, _81, _81);
+ float3x3 _92 = float3x3(_77[0] - _82[0], _77[1] - _82[1], _77[2] - _82[2]);
+ float3x3 _98 = float3x3(float3(-2.0f, -4.0f, -4.0f), float3(-4.0f, -2.0f, -4.0f), float3(-4.0f, -4.0f, -2.0f));
+ float3 _99 = _92[0];
+ float3 _100 = _98[0];
+ float3 _103 = _92[1];
+ float3 _104 = _98[1];
+ float3 _108 = _92[2];
+ float3 _109 = _98[2];
+ _113 = (all(bool3(_99.x == _100.x, _99.y == _100.y, _99.z == _100.z)) && all(bool3(_103.x == _104.x, _103.y == _104.y, _103.z == _104.z))) && all(bool3(_108.x == _109.x, _108.y == _109.y, _108.z == _109.z));
+ }
+ else
+ {
+ _113 = false;
+ }
+ ok = _113;
+ bool _141 = false;
+ if (ok)
+ {
+ float3x3 _121 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
+ float3x3 _123 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
+ float3 _127 = _121[0];
+ float3 _128 = _123[0];
+ float3 _131 = _121[1];
+ float3 _132 = _123[1];
+ float3 _136 = _121[2];
+ float3 _137 = _123[2];
+ _141 = (all(bool3(_127.x == _128.x, _127.y == _128.y, _127.z == _128.z)) && all(bool3(_131.x == _132.x, _131.y == _132.y, _131.z == _132.z))) && all(bool3(_136.x == _137.x, _136.y == _137.y, _136.z == _137.z));
+ }
+ else
+ {
+ _141 = false;
+ }
+ ok = _141;
+ bool _170 = false;
+ if (ok)
+ {
+ float3x3 _150 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 0.25f;
+ float3x3 _152 = float3x3(float3(0.5f, 0.0f, 0.0f), float3(0.0f, 0.5f, 0.0f), float3(0.0f, 0.0f, 0.5f));
+ float3 _156 = _150[0];
+ float3 _157 = _152[0];
+ float3 _160 = _150[1];
+ float3 _161 = _152[1];
+ float3 _165 = _150[2];
+ float3 _166 = _152[2];
+ _170 = (all(bool3(_156.x == _157.x, _156.y == _157.y, _156.z == _157.z)) && all(bool3(_160.x == _161.x, _160.y == _161.y, _160.z == _161.z))) && all(bool3(_165.x == _166.x, _165.y == _166.y, _165.z == _166.z));
+ }
+ else
+ {
+ _170 = false;
+ }
+ ok = _170;
+ bool _208 = false;
+ if (ok)
+ {
+ float3x3 _174 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _178 = 4.0f.xxx;
+ float3x3 _179 = float3x3(_178, _178, _178);
+ float3x3 _189 = float3x3(_179[0] + _174[0], _179[1] + _174[1], _179[2] + _174[2]);
+ float3x3 _193 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
+ float3 _194 = _189[0];
+ float3 _195 = _193[0];
+ float3 _198 = _189[1];
+ float3 _199 = _193[1];
+ float3 _203 = _189[2];
+ float3 _204 = _193[2];
+ _208 = (all(bool3(_194.x == _195.x, _194.y == _195.y, _194.z == _195.z)) && all(bool3(_198.x == _199.x, _198.y == _199.y, _198.z == _199.z))) && all(bool3(_203.x == _204.x, _203.y == _204.y, _203.z == _204.z));
+ }
+ else
+ {
+ _208 = false;
+ }
+ ok = _208;
+ bool _246 = false;
+ if (ok)
+ {
+ float3x3 _212 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _216 = 4.0f.xxx;
+ float3x3 _217 = float3x3(_216, _216, _216);
+ float3x3 _227 = float3x3(_217[0] - _212[0], _217[1] - _212[1], _217[2] - _212[2]);
+ float3x3 _231 = float3x3(float3(2.0f, 4.0f, 4.0f), float3(4.0f, 2.0f, 4.0f), float3(4.0f, 4.0f, 2.0f));
+ float3 _232 = _227[0];
+ float3 _233 = _231[0];
+ float3 _236 = _227[1];
+ float3 _237 = _231[1];
+ float3 _241 = _227[2];
+ float3 _242 = _231[2];
+ _246 = (all(bool3(_232.x == _233.x, _232.y == _233.y, _232.z == _233.z)) && all(bool3(_236.x == _237.x, _236.y == _237.y, _236.z == _237.z))) && all(bool3(_241.x == _242.x, _241.y == _242.y, _241.z == _242.z));
+ }
+ else
+ {
+ _246 = false;
+ }
+ ok = _246;
+ bool _273 = false;
+ if (ok)
+ {
+ float3x3 _254 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
+ float3x3 _255 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
+ float3 _259 = _254[0];
+ float3 _260 = _255[0];
+ float3 _263 = _254[1];
+ float3 _264 = _255[1];
+ float3 _268 = _254[2];
+ float3 _269 = _255[2];
+ _273 = (all(bool3(_259.x == _260.x, _259.y == _260.y, _259.z == _260.z)) && all(bool3(_263.x == _264.x, _263.y == _264.y, _263.z == _264.z))) && all(bool3(_268.x == _269.x, _268.y == _269.y, _268.z == _269.z));
+ }
+ else
+ {
+ _273 = false;
+ }
+ ok = _273;
+ bool _303 = false;
+ if (ok)
+ {
+ float2x2 _279 = float2x2(2.0f.xx, 2.0f.xx);
+ float2 _281 = 4.0f.xx;
+ float2x2 _282 = float2x2(_281, _281);
+ float2x2 _289 = float2x2(_282[0] / _279[0], _282[1] / _279[1]);
+ float2x2 _292 = float2x2(2.0f.xx, 2.0f.xx);
+ float2 _294 = _289[0];
+ float2 _295 = _292[0];
+ float2 _298 = _289[1];
+ float2 _299 = _292[1];
+ _303 = all(bool2(_294.x == _295.x, _294.y == _295.y)) && all(bool2(_298.x == _299.x, _298.y == _299.y));
+ }
+ else
+ {
+ _303 = false;
+ }
+ ok = _303;
+ return ok;
+}
+
+float4 main(float2 _306)
+{
+ bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
+ bool _346 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _312 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _316 = 4.0f.xxx;
+ float3x3 _317 = float3x3(_316, _316, _316);
+ float3x3 _327 = float3x3(_312[0] + _317[0], _312[1] + _317[1], _312[2] + _317[2]);
+ float3x3 _331 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
+ float3 _332 = _327[0];
+ float3 _333 = _331[0];
+ float3 _336 = _327[1];
+ float3 _337 = _331[1];
+ float3 _341 = _327[2];
+ float3 _342 = _331[2];
+ _346 = (all(bool3(_332.x == _333.x, _332.y == _333.y, _332.z == _333.z)) && all(bool3(_336.x == _337.x, _336.y == _337.y, _336.z == _337.z))) && all(bool3(_341.x == _342.x, _341.y == _342.y, _341.z == _342.z));
+ }
+ else
+ {
+ _346 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _346;
+ bool _384 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _350 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _354 = 4.0f.xxx;
+ float3x3 _355 = float3x3(_354, _354, _354);
+ float3x3 _365 = float3x3(_350[0] - _355[0], _350[1] - _355[1], _350[2] - _355[2]);
+ float3x3 _369 = float3x3(float3(-2.0f, -4.0f, -4.0f), float3(-4.0f, -2.0f, -4.0f), float3(-4.0f, -4.0f, -2.0f));
+ float3 _370 = _365[0];
+ float3 _371 = _369[0];
+ float3 _374 = _365[1];
+ float3 _375 = _369[1];
+ float3 _379 = _365[2];
+ float3 _380 = _369[2];
+ _384 = (all(bool3(_370.x == _371.x, _370.y == _371.y, _370.z == _371.z)) && all(bool3(_374.x == _375.x, _374.y == _375.y, _374.z == _375.z))) && all(bool3(_379.x == _380.x, _379.y == _380.y, _379.z == _380.z));
+ }
+ else
+ {
+ _384 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _384;
+ bool _411 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _392 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
+ float3x3 _393 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
+ float3 _397 = _392[0];
+ float3 _398 = _393[0];
+ float3 _401 = _392[1];
+ float3 _402 = _393[1];
+ float3 _406 = _392[2];
+ float3 _407 = _393[2];
+ _411 = (all(bool3(_397.x == _398.x, _397.y == _398.y, _397.z == _398.z)) && all(bool3(_401.x == _402.x, _401.y == _402.y, _401.z == _402.z))) && all(bool3(_406.x == _407.x, _406.y == _407.y, _406.z == _407.z));
+ }
+ else
+ {
+ _411 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _411;
+ bool _438 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _419 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 0.25f;
+ float3x3 _420 = float3x3(float3(0.5f, 0.0f, 0.0f), float3(0.0f, 0.5f, 0.0f), float3(0.0f, 0.0f, 0.5f));
+ float3 _424 = _419[0];
+ float3 _425 = _420[0];
+ float3 _428 = _419[1];
+ float3 _429 = _420[1];
+ float3 _433 = _419[2];
+ float3 _434 = _420[2];
+ _438 = (all(bool3(_424.x == _425.x, _424.y == _425.y, _424.z == _425.z)) && all(bool3(_428.x == _429.x, _428.y == _429.y, _428.z == _429.z))) && all(bool3(_433.x == _434.x, _433.y == _434.y, _433.z == _434.z));
+ }
+ else
+ {
+ _438 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _438;
+ bool _476 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _442 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _446 = 4.0f.xxx;
+ float3x3 _447 = float3x3(_446, _446, _446);
+ float3x3 _457 = float3x3(_447[0] + _442[0], _447[1] + _442[1], _447[2] + _442[2]);
+ float3x3 _461 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
+ float3 _462 = _457[0];
+ float3 _463 = _461[0];
+ float3 _466 = _457[1];
+ float3 _467 = _461[1];
+ float3 _471 = _457[2];
+ float3 _472 = _461[2];
+ _476 = (all(bool3(_462.x == _463.x, _462.y == _463.y, _462.z == _463.z)) && all(bool3(_466.x == _467.x, _466.y == _467.y, _466.z == _467.z))) && all(bool3(_471.x == _472.x, _471.y == _472.y, _471.z == _472.z));
+ }
+ else
+ {
+ _476 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _476;
+ bool _514 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _480 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
+ float3 _484 = 4.0f.xxx;
+ float3x3 _485 = float3x3(_484, _484, _484);
+ float3x3 _495 = float3x3(_485[0] - _480[0], _485[1] - _480[1], _485[2] - _480[2]);
+ float3x3 _499 = float3x3(float3(2.0f, 4.0f, 4.0f), float3(4.0f, 2.0f, 4.0f), float3(4.0f, 4.0f, 2.0f));
+ float3 _500 = _495[0];
+ float3 _501 = _499[0];
+ float3 _504 = _495[1];
+ float3 _505 = _499[1];
+ float3 _509 = _495[2];
+ float3 _510 = _499[2];
+ _514 = (all(bool3(_500.x == _501.x, _500.y == _501.y, _500.z == _501.z)) && all(bool3(_504.x == _505.x, _504.y == _505.y, _504.z == _505.z))) && all(bool3(_509.x == _510.x, _509.y == _510.y, _509.z == _510.z));
+ }
+ else
+ {
+ _514 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _514;
+ bool _541 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float3x3 _522 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
+ float3x3 _523 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
+ float3 _527 = _522[0];
+ float3 _528 = _523[0];
+ float3 _531 = _522[1];
+ float3 _532 = _523[1];
+ float3 _536 = _522[2];
+ float3 _537 = _523[2];
+ _541 = (all(bool3(_527.x == _528.x, _527.y == _528.y, _527.z == _528.z)) && all(bool3(_531.x == _532.x, _531.y == _532.y, _531.z == _532.z))) && all(bool3(_536.x == _537.x, _536.y == _537.y, _536.z == _537.z));
+ }
+ else
+ {
+ _541 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _541;
+ bool _569 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ float2x2 _547 = float2x2(2.0f.xx, 2.0f.xx);
+ float2 _548 = 4.0f.xx;
+ float2x2 _549 = float2x2(_548, _548);
+ float2x2 _556 = float2x2(_549[0] / _547[0], _549[1] / _547[1]);
+ float2x2 _559 = float2x2(2.0f.xx, 2.0f.xx);
+ float2 _560 = _556[0];
+ float2 _561 = _559[0];
+ float2 _564 = _556[1];
+ float2 _565 = _559[1];
+ _569 = all(bool2(_560.x == _561.x, _560.y == _561.y)) && all(bool2(_564.x == _565.x, _564.y == _565.y));
+ }
+ else
+ {
+ _569 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _569;
+ bool _574 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
+ {
+ _574 = test_half_b();
+ }
+ else
+ {
+ _574 = false;
+ }
+ float4 _575 = 0.0f.xxxx;
+ if (_574)
+ {
+ _575 = _11_colorGreen;
+ }
+ else
+ {
+ _575 = _11_colorRed;
+ }
+ return _575;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MatrixToVectorCast.hlsl b/tests/sksl/shared/MatrixToVectorCast.hlsl
new file mode 100644
index 0000000..1eecbcd
--- /dev/null
+++ b/tests/sksl/shared/MatrixToVectorCast.hlsl
@@ -0,0 +1,87 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _25)
+{
+ bool ok = true;
+ bool _51 = false;
+ if (true)
+ {
+ float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
+ _51 = all(bool4(_42.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _42.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _42.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _42.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
+ }
+ else
+ {
+ _51 = false;
+ }
+ ok = _51;
+ bool _63 = false;
+ if (_51)
+ {
+ float4 _60 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
+ _63 = all(bool4(_60.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _60.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _60.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _60.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
+ }
+ else
+ {
+ _63 = false;
+ }
+ ok = _63;
+ bool _85 = false;
+ if (_63)
+ {
+ int4 _78 = int4(int(_10_testMatrix2x2[0].x), int(_10_testMatrix2x2[0].y), int(_10_testMatrix2x2[1].x), int(_10_testMatrix2x2[1].y));
+ _85 = all(bool4(_78.x == int4(1, 2, 3, 4).x, _78.y == int4(1, 2, 3, 4).y, _78.z == int4(1, 2, 3, 4).z, _78.w == int4(1, 2, 3, 4).w));
+ }
+ else
+ {
+ _85 = false;
+ }
+ ok = _85;
+ bool _103 = false;
+ if (_85)
+ {
+ bool4 _99 = bool4(_10_testMatrix2x2[0].x != 0.0f, _10_testMatrix2x2[0].y != 0.0f, _10_testMatrix2x2[1].x != 0.0f, _10_testMatrix2x2[1].y != 0.0f);
+ _103 = all(bool4(_99.x == bool4(true, true, true, true).x, _99.y == bool4(true, true, true, true).y, _99.z == bool4(true, true, true, true).z, _99.w == bool4(true, true, true, true).w));
+ }
+ else
+ {
+ _103 = false;
+ }
+ ok = _103;
+ float4 _104 = 0.0f.xxxx;
+ if (_103)
+ {
+ _104 = _10_colorGreen;
+ }
+ else
+ {
+ _104 = _10_colorRed;
+ }
+ return _104;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/MultipleAssignments.hlsl b/tests/sksl/shared/MultipleAssignments.hlsl
new file mode 100644
index 0000000..19c7e2f
--- /dev/null
+++ b/tests/sksl/shared/MultipleAssignments.hlsl
@@ -0,0 +1,30 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float y = 1.0f;
+ float x = 1.0f;
+ float c = 0.0f;
+ float b = 0.0f;
+ float a = 0.0f;
+ return float4(0.0f * 0.0f, 1.0f, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Negation.hlsl b/tests/sksl/shared/Negation.hlsl
new file mode 100644
index 0000000..d712440
--- /dev/null
+++ b/tests/sksl/shared/Negation.hlsl
@@ -0,0 +1,111 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_colorGreen : packoffset(c0);
+ float4 _12_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_ivec_b()
+{
+ int one = 1;
+ int two = 2;
+ bool ok = true;
+ bool _56 = false;
+ if (ok)
+ {
+ int2 _40 = -int2(-one, one + one);
+ int2 _48 = -int2(one - two, 2);
+ _56 = all(bool2(_40.x == _48.x, _40.y == _48.y));
+ }
+ else
+ {
+ _56 = false;
+ }
+ ok = _56;
+ return ok;
+}
+
+bool test_mat_b()
+{
+ bool ok = true;
+ return ok;
+}
+
+float4 main(float2 _62)
+{
+ float _RESERVED_IDENTIFIER_FIXUP_0_one = 1.0f;
+ float _RESERVED_IDENTIFIER_FIXUP_1_two = 2.0f;
+ bool _RESERVED_IDENTIFIER_FIXUP_4_ok = true;
+ bool _89 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_4_ok)
+ {
+ float4 _73 = -_RESERVED_IDENTIFIER_FIXUP_1_two.xxxx;
+ float4 _85 = float4(-_RESERVED_IDENTIFIER_FIXUP_1_two, (-_RESERVED_IDENTIFIER_FIXUP_1_two).xxx);
+ _89 = all(bool4(_73.x == _85.x, _73.y == _85.y, _73.z == _85.z, _73.w == _85.w));
+ }
+ else
+ {
+ _89 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_4_ok = _89;
+ bool _103 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_4_ok)
+ {
+ float2 _95 = -float2(_RESERVED_IDENTIFIER_FIXUP_0_one - _RESERVED_IDENTIFIER_FIXUP_1_two, _RESERVED_IDENTIFIER_FIXUP_1_two);
+ _103 = all(bool2(float2(1.0f, -2.0f).x == _95.x, float2(1.0f, -2.0f).y == _95.y));
+ }
+ else
+ {
+ _103 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_4_ok = _103;
+ bool _108 = false;
+ if (_RESERVED_IDENTIFIER_FIXUP_4_ok)
+ {
+ _108 = test_ivec_b();
+ }
+ else
+ {
+ _108 = false;
+ }
+ bool _112 = false;
+ if (_108)
+ {
+ _112 = test_mat_b();
+ }
+ else
+ {
+ _112 = false;
+ }
+ float4 _113 = 0.0f.xxxx;
+ if (_112)
+ {
+ _113 = _12_colorGreen;
+ }
+ else
+ {
+ _113 = _12_colorRed;
+ }
+ return _113;
+}
+
+void frag_main()
+{
+ float2 _22 = 0.0f.xx;
+ sk_FragColor = main(_22);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/NoFragCoordsPos.hlsl b/tests/sksl/shared/NoFragCoordsPos.hlsl
new file mode 100644
index 0000000..10867c9
--- /dev/null
+++ b/tests/sksl/shared/NoFragCoordsPos.hlsl
@@ -0,0 +1,26 @@
+static float4 gl_Position;
+static float4 pos;
+
+struct SPIRV_Cross_Input
+{
+ float4 pos : TEXCOORD0;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 gl_Position : SV_Position;
+};
+
+void vert_main()
+{
+ gl_Position = pos;
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ pos = stage_input.pos;
+ vert_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.gl_Position = gl_Position;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/NoFragCoordsPosRT.hlsl b/tests/sksl/shared/NoFragCoordsPosRT.hlsl
new file mode 100644
index 0000000..5590eee
--- /dev/null
+++ b/tests/sksl/shared/NoFragCoordsPosRT.hlsl
@@ -0,0 +1,33 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_sk_RTAdjust : packoffset(c0);
+};
+
+
+static float4 gl_Position;
+static float4 pos;
+
+struct SPIRV_Cross_Input
+{
+ float4 pos : TEXCOORD0;
+};
+
+struct SPIRV_Cross_Output
+{
+ float4 gl_Position : SV_Position;
+};
+
+void vert_main()
+{
+ gl_Position = pos;
+ gl_Position = float4((gl_Position.xy * _10_sk_RTAdjust.xz) + (gl_Position.ww * _10_sk_RTAdjust.yw), 0.0f, gl_Position.w);
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ pos = stage_input.pos;
+ vert_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.gl_Position = gl_Position;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/NormalizationVert.hlsl b/tests/sksl/shared/NormalizationVert.hlsl
new file mode 100644
index 0000000..49fddb6
--- /dev/null
+++ b/tests/sksl/shared/NormalizationVert.hlsl
@@ -0,0 +1,25 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _8_sk_RTAdjust : packoffset(c0);
+};
+
+
+static float4 gl_Position;
+struct SPIRV_Cross_Output
+{
+ float4 gl_Position : SV_Position;
+};
+
+void vert_main()
+{
+ gl_Position = 1.0f.xxxx;
+ gl_Position = float4((gl_Position.xy * _8_sk_RTAdjust.xz) + (gl_Position.ww * _8_sk_RTAdjust.yw), 0.0f, gl_Position.w);
+}
+
+SPIRV_Cross_Output main()
+{
+ vert_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.gl_Position = gl_Position;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/NumberCasts.hlsl b/tests/sksl/shared/NumberCasts.hlsl
new file mode 100644
index 0000000..c17cb5a
--- /dev/null
+++ b/tests/sksl/shared/NumberCasts.hlsl
@@ -0,0 +1,55 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ bool3 B = bool3(false, false, false);
+ B.x = true;
+ B.y = true;
+ B.z = true;
+ float3 F = 0.0f.xxx;
+ F.x = 1.230000019073486328125f;
+ F.y = 0.0f;
+ F.z = 1.0f;
+ int3 I = int3(0, 0, 0);
+ I.x = 1;
+ I.y = 1;
+ I.z = 1;
+ bool _66 = false;
+ if (B.x)
+ {
+ _66 = B.y;
+ }
+ else
+ {
+ _66 = false;
+ }
+ bool _71 = false;
+ if (_66)
+ {
+ _71 = B.z;
+ }
+ else
+ {
+ _71 = false;
+ }
+ return float4((F.x * F.y) * F.z, float(_71), 0.0f, float((I.x * I.y) * I.z));
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/NumberConversions.hlsl b/tests/sksl/shared/NumberConversions.hlsl
new file mode 100644
index 0000000..0cc92f9
--- /dev/null
+++ b/tests/sksl/shared/NumberConversions.hlsl
@@ -0,0 +1,84 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ bool b = true;
+ int _26 = int(_10_unknownInput);
+ int s = _26;
+ int _30 = int(_10_unknownInput);
+ int i = _30;
+ uint _36 = uint(_10_unknownInput);
+ uint us = _36;
+ uint _40 = uint(_10_unknownInput);
+ uint ui = _40;
+ float h = _10_unknownInput;
+ float f = _10_unknownInput;
+ int s2s = _26;
+ int i2s = _30;
+ int _51 = int(_36);
+ int us2s = _51;
+ int _53 = int(_40);
+ int ui2s = _53;
+ int _55 = int(_10_unknownInput);
+ int h2s = _55;
+ int _57 = int(_10_unknownInput);
+ int f2s = _57;
+ int _59 = int(true);
+ int b2s = _59;
+ int s2i = _26;
+ int i2i = _30;
+ int _64 = int(_36);
+ int us2i = _64;
+ int _66 = int(_40);
+ int ui2i = _66;
+ int _68 = int(_10_unknownInput);
+ int h2i = _68;
+ int _70 = int(_10_unknownInput);
+ int f2i = _70;
+ int _72 = int(true);
+ int b2i = _72;
+ uint _74 = uint(_26);
+ uint s2us = _74;
+ uint _76 = uint(_30);
+ uint i2us = _76;
+ uint us2us = _36;
+ uint ui2us = _40;
+ uint h2us = uint(_10_unknownInput);
+ uint f2us = uint(_10_unknownInput);
+ uint b2us = uint(true);
+ uint s2ui = uint(_26);
+ uint i2ui = uint(_30);
+ uint us2ui = _36;
+ uint ui2ui = _40;
+ uint h2ui = uint(_10_unknownInput);
+ uint f2ui = uint(_10_unknownInput);
+ uint b2ui = uint(true);
+ float s2f = float(_26);
+ float i2f = float(_30);
+ float us2f = float(_36);
+ float ui2f = float(_40);
+ float h2f = _10_unknownInput;
+ float f2f = _10_unknownInput;
+ float b2f = float(true);
+ sk_FragColor.x = (((((((((((((((((((((float(_26) + float(_30)) + float(_36)) + float(_40)) + _10_unknownInput) + _10_unknownInput) + float(_26)) + float(_30)) + float(_51)) + float(_53)) + float(_55)) + float(_57)) + float(_59)) + float(_26)) + float(_30)) + float(_64)) + float(_66)) + float(_68)) + float(_70)) + float(_72)) + float(_74)) + float(_76)) + float(_36);
+ sk_FragColor.x += (((((((((((((((((float(ui2us) + float(h2us)) + float(f2us)) + float(b2us)) + float(s2ui)) + float(i2ui)) + float(us2ui)) + float(ui2ui)) + float(h2ui)) + float(f2ui)) + float(b2ui)) + s2f) + i2f) + us2f) + ui2f) + h2f) + f2f) + b2f);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Octal.hlsl b/tests/sksl/shared/Octal.hlsl
new file mode 100644
index 0000000..0454677
--- /dev/null
+++ b/tests/sksl/shared/Octal.hlsl
@@ -0,0 +1,72 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int i1 = 1;
+ int i2 = 342391;
+ int i3 = 2000000000;
+ int i4 = -2000000000;
+ bool _40 = false;
+ if (true)
+ {
+ _40 = true;
+ }
+ else
+ {
+ _40 = false;
+ }
+ bool _43 = false;
+ if (_40)
+ {
+ _43 = true;
+ }
+ else
+ {
+ _43 = false;
+ }
+ bool _46 = false;
+ if (_43)
+ {
+ _46 = true;
+ }
+ else
+ {
+ _46 = false;
+ }
+ float4 _47 = 0.0f.xxxx;
+ if (_46)
+ {
+ _47 = _10_colorGreen;
+ }
+ else
+ {
+ _47 = _10_colorRed;
+ }
+ return _47;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Offset.hlsl b/tests/sksl/shared/Offset.hlsl
new file mode 100644
index 0000000..a97967c
--- /dev/null
+++ b/tests/sksl/shared/Offset.hlsl
@@ -0,0 +1,28 @@
+struct Test
+{
+ int x;
+ int y;
+ int z;
+};
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ Test t = { 0, 0, 0 };
+ t.x = 0;
+ sk_FragColor.x = float(t.x);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/OperatorsES2.hlsl b/tests/sksl/shared/OperatorsES2.hlsl
new file mode 100644
index 0000000..7a1d40d
--- /dev/null
+++ b/tests/sksl/shared/OperatorsES2.hlsl
@@ -0,0 +1,124 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float _10_unknownInput : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float x = 1.0f;
+ float y = 2.0f;
+ int z = 3;
+ float _40 = (1.0f - 1.0f) + (((2.0f * 1.0f) * 1.0f) * (2.0f - 1.0f));
+ x = _40;
+ float _42 = (_40 / 2.0f) / _40;
+ y = _42;
+ int _48 = (((3 / 2) * 3) + 4) - 2;
+ z = _48;
+ bool _67 = false;
+ if ((_40 > 4.0f) == (_40 < 2.0f))
+ {
+ _67 = true;
+ }
+ else
+ {
+ bool _66 = false;
+ if (2.0f >= _10_unknownInput)
+ {
+ _66 = _42 <= _40;
+ }
+ else
+ {
+ _66 = false;
+ }
+ _67 = _66;
+ }
+ bool b = _67;
+ bool _71 = _10_unknownInput > 2.0f;
+ bool c = _71;
+ bool _73 = _67 != _71;
+ bool d = _73;
+ bool _77 = false;
+ if (_67)
+ {
+ _77 = _71;
+ }
+ else
+ {
+ _77 = false;
+ }
+ bool e = _77;
+ bool _81 = false;
+ if (_67)
+ {
+ _81 = true;
+ }
+ else
+ {
+ _81 = _71;
+ }
+ bool f = _81;
+ float _83 = _40 + 12.0f;
+ x = _83;
+ float _84 = _83 - 12.0f;
+ x = _84;
+ float _86 = _42 / 10.0f;
+ y = _86;
+ x = _84 * _86;
+ x = 6.0f;
+ y = (((float(_67) * float(_71)) * float(_73)) * float(_77)) * float(_81);
+ y = 6.0f;
+ z = _48 - 1;
+ z = 6;
+ bool _103 = false;
+ if (true)
+ {
+ _103 = true;
+ }
+ else
+ {
+ _103 = false;
+ }
+ bool _106 = false;
+ if (_103)
+ {
+ _106 = true;
+ }
+ else
+ {
+ _106 = false;
+ }
+ float4 _107 = 0.0f.xxxx;
+ if (_106)
+ {
+ _107 = _10_colorGreen;
+ }
+ else
+ {
+ _107 = _10_colorRed;
+ }
+ return _107;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/OperatorsES3.hlsl b/tests/sksl/shared/OperatorsES3.hlsl
new file mode 100644
index 0000000..d591cc2
--- /dev/null
+++ b/tests/sksl/shared/OperatorsES3.hlsl
@@ -0,0 +1,156 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float _10_unknownInput : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float x = 1.0f;
+ float y = 2.0f;
+ int z = 3;
+ float _40 = (1.0f - 1.0f) + (((2.0f * 1.0f) * 1.0f) * (2.0f - 1.0f));
+ x = _40;
+ float _42 = (_40 / 2.0f) / _40;
+ y = _42;
+ int _50 = ((((3 / 2) % 3) << 4) >> 2) << 1;
+ z = _50;
+ bool _69 = false;
+ if ((_40 > 4.0f) == (_40 < 2.0f))
+ {
+ _69 = true;
+ }
+ else
+ {
+ bool _68 = false;
+ if (2.0f >= _10_unknownInput)
+ {
+ _68 = _42 <= _40;
+ }
+ else
+ {
+ _68 = false;
+ }
+ _69 = _68;
+ }
+ bool b = _69;
+ bool _73 = _10_unknownInput > 2.0f;
+ bool c = _73;
+ bool _75 = _69 != _73;
+ bool d = _75;
+ bool _79 = false;
+ if (_69)
+ {
+ _79 = _73;
+ }
+ else
+ {
+ _79 = false;
+ }
+ bool e = _79;
+ bool _83 = false;
+ if (_69)
+ {
+ _83 = true;
+ }
+ else
+ {
+ _83 = _73;
+ }
+ bool f = _83;
+ float _85 = _40 + 12.0f;
+ x = _85;
+ float _86 = _85 - 12.0f;
+ x = _86;
+ float _88 = _42 / 10.0f;
+ y = _88;
+ x = _86 * _88;
+ int _91 = _50 | 0;
+ z = _91;
+ int _93 = _91 & (-1);
+ z = _93;
+ int _94 = _93 ^ 0;
+ z = _94;
+ int _95 = _94 >> 2;
+ z = _95;
+ int _96 = _95 << 4;
+ z = _96;
+ z = _96 % 5;
+ float _104 = float(6);
+ x = _104;
+ y = 6.0f;
+ z = 6;
+ int2 _122 = (~5).xx;
+ int2 w = _122;
+ int2 _123 = ~_122;
+ w = _123;
+ bool _130 = false;
+ if (_123.x == 5)
+ {
+ _130 = _123.y == 5;
+ }
+ else
+ {
+ _130 = false;
+ }
+ bool _134 = false;
+ if (_130)
+ {
+ _134 = _104 == 6.0f;
+ }
+ else
+ {
+ _134 = false;
+ }
+ bool _137 = false;
+ if (_134)
+ {
+ _137 = true;
+ }
+ else
+ {
+ _137 = false;
+ }
+ bool _140 = false;
+ if (_137)
+ {
+ _140 = true;
+ }
+ else
+ {
+ _140 = false;
+ }
+ float4 _141 = 0.0f.xxxx;
+ if (_140)
+ {
+ _141 = _10_colorGreen;
+ }
+ else
+ {
+ _141 = _10_colorRed;
+ }
+ return _141;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Ossfuzz26167.hlsl b/tests/sksl/shared/Ossfuzz26167.hlsl
new file mode 100644
index 0000000..3b50282
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz26167.hlsl
@@ -0,0 +1,8 @@
+void frag_main()
+{
+}
+
+void main()
+{
+ frag_main();
+}
diff --git a/tests/sksl/shared/Ossfuzz26759.hlsl b/tests/sksl/shared/Ossfuzz26759.hlsl
new file mode 100644
index 0000000..db67767
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz26759.hlsl
@@ -0,0 +1,11 @@
+void frag_main()
+{
+ int i = 0;
+ int _12 = i;
+ i = _12 - 1;
+}
+
+void main()
+{
+ frag_main();
+}
diff --git a/tests/sksl/shared/Ossfuzz28794.hlsl b/tests/sksl/shared/Ossfuzz28794.hlsl
new file mode 100644
index 0000000..5b43dda
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz28794.hlsl
@@ -0,0 +1,21 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ int i = 1;
+ i = 3;
+ sk_FragColor.x = float(3);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Ossfuzz28904.hlsl b/tests/sksl/shared/Ossfuzz28904.hlsl
new file mode 100644
index 0000000..22761f4
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz28904.hlsl
@@ -0,0 +1,19 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = 0.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Ossfuzz29085.hlsl b/tests/sksl/shared/Ossfuzz29085.hlsl
new file mode 100644
index 0000000..3b50282
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz29085.hlsl
@@ -0,0 +1,8 @@
+void frag_main()
+{
+}
+
+void main()
+{
+ frag_main();
+}
diff --git a/tests/sksl/shared/Ossfuzz29494.hlsl b/tests/sksl/shared/Ossfuzz29494.hlsl
new file mode 100644
index 0000000..22761f4
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz29494.hlsl
@@ -0,0 +1,19 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = 0.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Ossfuzz36770.hlsl b/tests/sksl/shared/Ossfuzz36770.hlsl
new file mode 100644
index 0000000..cc3e16b
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz36770.hlsl
@@ -0,0 +1,32 @@
+### Compilation failed:
+
+error: SPIR-V validation error: [VUID-StandaloneSpirv-Location-04919] Member index 0 is missing a location assignment
+ %T = OpTypeStruct %int
+
+OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main" %3 %sk_Clockwise
+OpExecutionMode %main OriginUpperLeft
+OpName %T "T"
+OpMemberName %T 0 "x"
+OpName %sk_Clockwise "sk_Clockwise"
+OpName %main "main"
+OpMemberDecorate %T 0 Offset 0
+OpDecorate %T Block
+OpDecorate %sk_Clockwise BuiltIn FrontFacing
+%int = OpTypeInt 32 1
+%T = OpTypeStruct %int
+%_ptr_Input_T = OpTypePointer Input %T
+%3 = OpVariable %_ptr_Input_T Input
+%bool = OpTypeBool
+%_ptr_Input_bool = OpTypePointer Input %bool
+%sk_Clockwise = OpVariable %_ptr_Input_bool Input
+%void = OpTypeVoid
+%11 = OpTypeFunction %void
+%main = OpFunction %void None %11
+%12 = OpLabel
+OpReturn
+OpFunctionEnd
+
+1 error
diff --git a/tests/sksl/shared/Ossfuzz36852.hlsl b/tests/sksl/shared/Ossfuzz36852.hlsl
new file mode 100644
index 0000000..dd639db
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz36852.hlsl
@@ -0,0 +1,27 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float2x2 x = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
+ float2 y = float4(0.0f, 1.0f, 2.0f, 3.0f).xy;
+ return float4(float4(0.0f, 1.0f, 2.0f, 3.0f).xy, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Ossfuzz37466.hlsl b/tests/sksl/shared/Ossfuzz37466.hlsl
new file mode 100644
index 0000000..513ff19
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz37466.hlsl
@@ -0,0 +1,11 @@
+void frag_main()
+{
+ float y[2] = { 0.0f, 0.0f };
+ float _RESERVED_IDENTIFIER_FIXUP_0_v[2] = y;
+ _RESERVED_IDENTIFIER_FIXUP_0_v[0] = _RESERVED_IDENTIFIER_FIXUP_0_v[1];
+}
+
+void main()
+{
+ frag_main();
+}
diff --git a/tests/sksl/shared/Ossfuzz37677.hlsl b/tests/sksl/shared/Ossfuzz37677.hlsl
new file mode 100644
index 0000000..c2d4bfa
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz37677.hlsl
@@ -0,0 +1,31 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Ossfuzz37900.hlsl b/tests/sksl/shared/Ossfuzz37900.hlsl
new file mode 100644
index 0000000..9751821
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz37900.hlsl
@@ -0,0 +1,6 @@
+### Compilation failed:
+
+error: 2: variable 'a' exceeds the stack size limit
+ int[2147483646] a, b=a, c=a, d=a, e=a, f=a, g=a, h=a, i=a, j=a, k=a;
+ ^^^^^^^^^^^^^^^^^
+1 error
diff --git a/tests/sksl/shared/Ossfuzz41000.hlsl b/tests/sksl/shared/Ossfuzz41000.hlsl
new file mode 100644
index 0000000..06d568d
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz41000.hlsl
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: program does not contain a main() function
+1 error
diff --git a/tests/sksl/shared/Ossfuzz50636.hlsl b/tests/sksl/shared/Ossfuzz50636.hlsl
new file mode 100644
index 0000000..06d568d
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz50636.hlsl
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: program does not contain a main() function
+1 error
diff --git a/tests/sksl/shared/OutParams.hlsl b/tests/sksl/shared/OutParams.hlsl
new file mode 100644
index 0000000..f817ab0
--- /dev/null
+++ b/tests/sksl/shared/OutParams.hlsl
@@ -0,0 +1,325 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _32_colorGreen : packoffset(c0);
+ float4 _32_colorRed : packoffset(c1);
+ float4 _32_colorWhite : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void out_half_vh(out float _47)
+{
+ _47 = _32_colorWhite.x;
+}
+
+void out_half2_vh2(out float2 _56)
+{
+ _56 = _32_colorWhite.y.xx;
+}
+
+void out_half3_vh3(out float3 _65)
+{
+ _65 = _32_colorWhite.z.xxx;
+}
+
+void out_half4_vh4(out float4 _73)
+{
+ _73 = _32_colorWhite.w.xxxx;
+}
+
+void out_half2x2_vh22(out float2x2 _82)
+{
+ _82 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
+}
+
+void out_half3x3_vh33(out float3x3 _93)
+{
+ _93 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
+}
+
+void out_half4x4_vh44(out float4x4 _105)
+{
+ _105 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
+}
+
+void out_int_vi(out int _117)
+{
+ _117 = int(_32_colorWhite.x);
+}
+
+void out_int2_vi2(out int2 _126)
+{
+ _126 = int(_32_colorWhite.y).xx;
+}
+
+void out_int3_vi3(out int3 _136)
+{
+ _136 = int(_32_colorWhite.z).xxx;
+}
+
+void out_int4_vi4(out int4 _146)
+{
+ _146 = int(_32_colorWhite.w).xxxx;
+}
+
+void out_float_vf(out float _153)
+{
+ _153 = _32_colorWhite.x;
+}
+
+void out_float2_vf2(out float2 _158)
+{
+ _158 = _32_colorWhite.y.xx;
+}
+
+void out_float3_vf3(out float3 _164)
+{
+ _164 = _32_colorWhite.z.xxx;
+}
+
+void out_float4_vf4(out float4 _170)
+{
+ _170 = _32_colorWhite.w.xxxx;
+}
+
+void out_float2x2_vf22(out float2x2 _176)
+{
+ _176 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
+}
+
+void out_float3x3_vf33(out float3x3 _184)
+{
+ _184 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
+}
+
+void out_float4x4_vf44(out float4x4 _193)
+{
+ _193 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
+}
+
+void out_bool_vb(out bool _205)
+{
+ _205 = _32_colorWhite.x != 0.0f;
+}
+
+void out_bool2_vb2(out bool2 _214)
+{
+ _214 = (_32_colorWhite.y != 0.0f).xx;
+}
+
+void out_bool3_vb3(out bool3 _224)
+{
+ _224 = (_32_colorWhite.z != 0.0f).xxx;
+}
+
+void out_bool4_vb4(out bool4 _234)
+{
+ _234 = (_32_colorWhite.w != 0.0f).xxxx;
+}
+
+float4 main(float2 _242)
+{
+ float _245 = 0.0f;
+ out_half_vh(_245);
+ float h = _245;
+ float2 _249 = 0.0f.xx;
+ out_half2_vh2(_249);
+ float2 h2 = _249;
+ float3 _253 = 0.0f.xxx;
+ out_half3_vh3(_253);
+ float3 h3 = _253;
+ float4 _257 = 0.0f.xxxx;
+ out_half4_vh4(_257);
+ float4 h4 = _257;
+ float _262 = 0.0f;
+ out_half_vh(_262);
+ h3.y = _262;
+ float2 _265 = 0.0f.xx;
+ out_half2_vh2(_265);
+ h3 = float3(_265.x, h3.y, _265.y);
+ float4 _270 = 0.0f.xxxx;
+ out_half4_vh4(_270);
+ h4 = float4(_270.z, _270.w, _270.x, _270.y);
+ float2x2 _276 = float2x2(0.0f.xx, 0.0f.xx);
+ out_half2x2_vh22(_276);
+ float2x2 h2x2 = _276;
+ float3x3 _280 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
+ out_half3x3_vh33(_280);
+ float3x3 h3x3 = _280;
+ float4x4 _284 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
+ out_half4x4_vh44(_284);
+ float4x4 h4x4 = _284;
+ float3 _288 = 0.0f.xxx;
+ out_half3_vh3(_288);
+ h3x3[1] = _288;
+ float _294 = 0.0f;
+ out_half_vh(_294);
+ h4x4[3].w = _294;
+ float _300 = 0.0f;
+ out_half_vh(_300);
+ h2x2[0].x = _300;
+ int _304 = 0;
+ out_int_vi(_304);
+ int i = _304;
+ int2 _308 = int2(0, 0);
+ out_int2_vi2(_308);
+ int2 i2 = _308;
+ int3 _312 = int3(0, 0, 0);
+ out_int3_vi3(_312);
+ int3 i3 = _312;
+ int4 _316 = int4(0, 0, 0, 0);
+ out_int4_vi4(_316);
+ int4 i4 = _316;
+ int3 _319 = int3(0, 0, 0);
+ out_int3_vi3(_319);
+ i4 = int4(_319.x, _319.y, _319.z, i4.w);
+ int _325 = 0;
+ out_int_vi(_325);
+ i2.y = _325;
+ float _329 = 0.0f;
+ out_float_vf(_329);
+ float f = _329;
+ float2 _333 = 0.0f.xx;
+ out_float2_vf2(_333);
+ float2 f2 = _333;
+ float3 _337 = 0.0f.xxx;
+ out_float3_vf3(_337);
+ float3 f3 = _337;
+ float4 _341 = 0.0f.xxxx;
+ out_float4_vf4(_341);
+ float4 f4 = _341;
+ float2 _344 = 0.0f.xx;
+ out_float2_vf2(_344);
+ f3 = float3(_344.x, _344.y, f3.z);
+ float _350 = 0.0f;
+ out_float_vf(_350);
+ f2.x = _350;
+ float2x2 _354 = float2x2(0.0f.xx, 0.0f.xx);
+ out_float2x2_vf22(_354);
+ float2x2 f2x2 = _354;
+ float3x3 _358 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
+ out_float3x3_vf33(_358);
+ float3x3 f3x3 = _358;
+ float4x4 _362 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
+ out_float4x4_vf44(_362);
+ float4x4 f4x4 = _362;
+ float _367 = 0.0f;
+ out_float_vf(_367);
+ f2x2[0].x = _367;
+ bool _371 = false;
+ out_bool_vb(_371);
+ bool b = _371;
+ bool2 _375 = bool2(false, false);
+ out_bool2_vb2(_375);
+ bool2 b2 = _375;
+ bool3 _379 = bool3(false, false, false);
+ out_bool3_vb3(_379);
+ bool3 b3 = _379;
+ bool4 _383 = bool4(false, false, false, false);
+ out_bool4_vb4(_383);
+ bool4 b4 = _383;
+ bool2 _386 = bool2(false, false);
+ out_bool2_vb2(_386);
+ b4 = bool4(_386.x, b4.y, b4.z, _386.y);
+ bool _392 = false;
+ out_bool_vb(_392);
+ b3.z = _392;
+ bool ok = true;
+ bool _424 = false;
+ if (true)
+ {
+ _424 = 1.0f == ((((((h * h2.x) * h3.x) * h4.x) * h2x2[0].x) * h3x3[0].x) * h4x4[0].x);
+ }
+ else
+ {
+ _424 = false;
+ }
+ ok = _424;
+ bool _450 = false;
+ if (_424)
+ {
+ _450 = 1.0f == ((((((f * f2.x) * f3.x) * f4.x) * f2x2[0].x) * f3x3[0].x) * f4x4[0].x);
+ }
+ else
+ {
+ _450 = false;
+ }
+ ok = _450;
+ bool _464 = false;
+ if (_450)
+ {
+ _464 = 1 == (((i * i2.x) * i3.x) * i4.x);
+ }
+ else
+ {
+ _464 = false;
+ }
+ ok = _464;
+ bool _483 = false;
+ if (_464)
+ {
+ bool _472 = false;
+ if (b)
+ {
+ _472 = b2.x;
+ }
+ else
+ {
+ _472 = false;
+ }
+ bool _477 = false;
+ if (_472)
+ {
+ _477 = b3.x;
+ }
+ else
+ {
+ _477 = false;
+ }
+ bool _482 = false;
+ if (_477)
+ {
+ _482 = b4.x;
+ }
+ else
+ {
+ _482 = false;
+ }
+ _483 = _482;
+ }
+ else
+ {
+ _483 = false;
+ }
+ ok = _483;
+ float4 _484 = 0.0f.xxxx;
+ if (_483)
+ {
+ _484 = _32_colorGreen;
+ }
+ else
+ {
+ _484 = _32_colorRed;
+ }
+ return _484;
+}
+
+void frag_main()
+{
+ float2 _42 = 0.0f.xx;
+ sk_FragColor = main(_42);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/OutParamsAreDistinct.hlsl b/tests/sksl/shared/OutParamsAreDistinct.hlsl
new file mode 100644
index 0000000..cd0bb06
--- /dev/null
+++ b/tests/sksl/shared/OutParamsAreDistinct.hlsl
@@ -0,0 +1,63 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool out_params_are_distinct_bhh(out float _26, out float _27)
+{
+ _26 = 1.0f;
+ _27 = 2.0f;
+ bool _35 = false;
+ if (true)
+ {
+ _35 = true;
+ }
+ else
+ {
+ _35 = false;
+ }
+ return _35;
+}
+
+float4 main(float2 _37)
+{
+ float x = 0.0f;
+ float _40 = 0.0f;
+ float _41 = 0.0f;
+ bool _42 = out_params_are_distinct_bhh(_40, _41);
+ x = _40;
+ x = _41;
+ float4 _45 = 0.0f.xxxx;
+ if (_42)
+ {
+ _45 = _11_colorGreen;
+ }
+ else
+ {
+ _45 = _11_colorRed;
+ }
+ return _45;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl b/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl
new file mode 100644
index 0000000..af4ccfe
--- /dev/null
+++ b/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl
@@ -0,0 +1,63 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _14_colorGreen : packoffset(c0);
+ float4 _14_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static float x = 0.0f;
+
+bool out_params_are_distinct_from_global_bh(out float _29)
+{
+ _29 = 2.0f;
+ bool _38 = false;
+ if (x == 1.0f)
+ {
+ _38 = true;
+ }
+ else
+ {
+ _38 = false;
+ }
+ return _38;
+}
+
+float4 main(float2 _40)
+{
+ x = 1.0f;
+ float _42 = 0.0f;
+ bool _43 = out_params_are_distinct_from_global_bh(_42);
+ x = _42;
+ float4 _45 = 0.0f.xxxx;
+ if (_43)
+ {
+ _45 = _14_colorGreen;
+ }
+ else
+ {
+ _45 = _14_colorRed;
+ }
+ return _45;
+}
+
+void frag_main()
+{
+ float2 _24 = 0.0f.xx;
+ float4 _26 = main(_24);
+ sk_FragColor = _26;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/OutParamsNoInline.hlsl b/tests/sksl/shared/OutParamsNoInline.hlsl
new file mode 100644
index 0000000..1e23a33
--- /dev/null
+++ b/tests/sksl/shared/OutParamsNoInline.hlsl
@@ -0,0 +1,303 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _32_colorGreen : packoffset(c0);
+ float4 _32_colorRed : packoffset(c1);
+ float4 _32_colorWhite : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void out_half_vh(out float _47)
+{
+ _47 = _32_colorWhite.x;
+}
+
+void out_half2_vh2(out float2 _56)
+{
+ _56 = _32_colorWhite.y.xx;
+}
+
+void out_half3_vh3(out float3 _65)
+{
+ _65 = _32_colorWhite.z.xxx;
+}
+
+void out_half4_vh4(out float4 _73)
+{
+ _73 = _32_colorWhite.w.xxxx;
+}
+
+void out_half2x2_vh22(out float2x2 _82)
+{
+ _82 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
+}
+
+void out_half3x3_vh33(out float3x3 _93)
+{
+ _93 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
+}
+
+void out_half4x4_vh44(out float4x4 _105)
+{
+ _105 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
+}
+
+void out_int_vi(out int _117)
+{
+ _117 = int(_32_colorWhite.x);
+}
+
+void out_int2_vi2(out int2 _126)
+{
+ _126 = int(_32_colorWhite.y).xx;
+}
+
+void out_int3_vi3(out int3 _136)
+{
+ _136 = int(_32_colorWhite.z).xxx;
+}
+
+void out_int4_vi4(out int4 _146)
+{
+ _146 = int(_32_colorWhite.w).xxxx;
+}
+
+void out_float_vf(out float _153)
+{
+ _153 = _32_colorWhite.x;
+}
+
+void out_float2_vf2(out float2 _158)
+{
+ _158 = _32_colorWhite.y.xx;
+}
+
+void out_float3_vf3(out float3 _164)
+{
+ _164 = _32_colorWhite.z.xxx;
+}
+
+void out_float4_vf4(out float4 _170)
+{
+ _170 = _32_colorWhite.w.xxxx;
+}
+
+void out_float2x2_vf22(out float2x2 _176)
+{
+ _176 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
+}
+
+void out_float3x3_vf33(out float3x3 _184)
+{
+ _184 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
+}
+
+void out_float4x4_vf44(out float4x4 _193)
+{
+ _193 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
+}
+
+void out_bool_vb(out bool _205)
+{
+ _205 = _32_colorWhite.x != 0.0f;
+}
+
+void out_bool2_vb2(out bool2 _214)
+{
+ _214 = (_32_colorWhite.y != 0.0f).xx;
+}
+
+void out_bool3_vb3(out bool3 _224)
+{
+ _224 = (_32_colorWhite.z != 0.0f).xxx;
+}
+
+void out_bool4_vb4(out bool4 _234)
+{
+ _234 = (_32_colorWhite.w != 0.0f).xxxx;
+}
+
+float4 main(float2 _242)
+{
+ float h = 0.0f;
+ out_half_vh(h);
+ float2 h2 = 0.0f.xx;
+ out_half2_vh2(h2);
+ float3 h3 = 0.0f.xxx;
+ out_half3_vh3(h3);
+ float4 h4 = 0.0f.xxxx;
+ out_half4_vh4(h4);
+ float _254 = 0.0f;
+ out_half_vh(_254);
+ h3.y = _254;
+ float2 _257 = 0.0f.xx;
+ out_half2_vh2(_257);
+ h3 = float3(_257.x, h3.y, _257.y);
+ float4 _262 = 0.0f.xxxx;
+ out_half4_vh4(_262);
+ h4 = float4(_262.z, _262.w, _262.x, _262.y);
+ float2x2 h2x2 = float2x2(0.0f.xx, 0.0f.xx);
+ out_half2x2_vh22(h2x2);
+ float3x3 h3x3 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
+ out_half3x3_vh33(h3x3);
+ float4x4 h4x4 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
+ out_half4x4_vh44(h4x4);
+ float3 _274 = 0.0f.xxx;
+ out_half3_vh3(_274);
+ h3x3[1] = _274;
+ float _280 = 0.0f;
+ out_half_vh(_280);
+ h4x4[3].w = _280;
+ float _286 = 0.0f;
+ out_half_vh(_286);
+ h2x2[0].x = _286;
+ int i = 0;
+ out_int_vi(i);
+ int2 i2 = int2(0, 0);
+ out_int2_vi2(i2);
+ int3 i3 = int3(0, 0, 0);
+ out_int3_vi3(i3);
+ int4 i4 = int4(0, 0, 0, 0);
+ out_int4_vi4(i4);
+ int3 _297 = int3(0, 0, 0);
+ out_int3_vi3(_297);
+ i4 = int4(_297.x, _297.y, _297.z, i4.w);
+ int _303 = 0;
+ out_int_vi(_303);
+ i2.y = _303;
+ float f = 0.0f;
+ out_float_vf(f);
+ float2 f2 = 0.0f.xx;
+ out_float2_vf2(f2);
+ float3 f3 = 0.0f.xxx;
+ out_float3_vf3(f3);
+ float4 f4 = 0.0f.xxxx;
+ out_float4_vf4(f4);
+ float2 _314 = 0.0f.xx;
+ out_float2_vf2(_314);
+ f3 = float3(_314.x, _314.y, f3.z);
+ float _320 = 0.0f;
+ out_float_vf(_320);
+ f2.x = _320;
+ float2x2 f2x2 = float2x2(0.0f.xx, 0.0f.xx);
+ out_float2x2_vf22(f2x2);
+ float3x3 f3x3 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
+ out_float3x3_vf33(f3x3);
+ float4x4 f4x4 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
+ out_float4x4_vf44(f4x4);
+ float _331 = 0.0f;
+ out_float_vf(_331);
+ f2x2[0].x = _331;
+ bool b = false;
+ out_bool_vb(b);
+ bool2 b2 = bool2(false, false);
+ out_bool2_vb2(b2);
+ bool3 b3 = bool3(false, false, false);
+ out_bool3_vb3(b3);
+ bool4 b4 = bool4(false, false, false, false);
+ out_bool4_vb4(b4);
+ bool2 _342 = bool2(false, false);
+ out_bool2_vb2(_342);
+ b4 = bool4(_342.x, b4.y, b4.z, _342.y);
+ bool _348 = false;
+ out_bool_vb(_348);
+ b3.z = _348;
+ bool ok = true;
+ bool _381 = false;
+ if (ok)
+ {
+ _381 = 1.0f == ((((((h * h2.x) * h3.x) * h4.x) * h2x2[0].x) * h3x3[0].x) * h4x4[0].x);
+ }
+ else
+ {
+ _381 = false;
+ }
+ ok = _381;
+ bool _408 = false;
+ if (ok)
+ {
+ _408 = 1.0f == ((((((f * f2.x) * f3.x) * f4.x) * f2x2[0].x) * f3x3[0].x) * f4x4[0].x);
+ }
+ else
+ {
+ _408 = false;
+ }
+ ok = _408;
+ bool _423 = false;
+ if (ok)
+ {
+ _423 = 1 == (((i * i2.x) * i3.x) * i4.x);
+ }
+ else
+ {
+ _423 = false;
+ }
+ ok = _423;
+ bool _443 = false;
+ if (ok)
+ {
+ bool _432 = false;
+ if (b)
+ {
+ _432 = b2.x;
+ }
+ else
+ {
+ _432 = false;
+ }
+ bool _437 = false;
+ if (_432)
+ {
+ _437 = b3.x;
+ }
+ else
+ {
+ _437 = false;
+ }
+ bool _442 = false;
+ if (_437)
+ {
+ _442 = b4.x;
+ }
+ else
+ {
+ _442 = false;
+ }
+ _443 = _442;
+ }
+ else
+ {
+ _443 = false;
+ }
+ ok = _443;
+ float4 _445 = 0.0f.xxxx;
+ if (ok)
+ {
+ _445 = _32_colorGreen;
+ }
+ else
+ {
+ _445 = _32_colorRed;
+ }
+ return _445;
+}
+
+void frag_main()
+{
+ float2 _42 = 0.0f.xx;
+ sk_FragColor = main(_42);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/OutParamsTricky.hlsl b/tests/sksl/shared/OutParamsTricky.hlsl
new file mode 100644
index 0000000..5c87a4f
--- /dev/null
+++ b/tests/sksl/shared/OutParamsTricky.hlsl
@@ -0,0 +1,63 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _12_colorGreen : packoffset(c0);
+ float4 _12_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float2 tricky_h2hhh2h(float _27, float _28, inout float2 _29, float _30)
+{
+ _29 = _29.yx;
+ return float2(_27 + _28, _30);
+}
+
+void func_vh4(inout float4 _41)
+{
+ float _45 = 1.0f;
+ float _47 = 2.0f;
+ float2 _50 = _41.xz;
+ float _52 = 5.0f;
+ float2 _53 = tricky_h2hhh2h(_45, _47, _50, _52);
+ _41 = float4(_50.x, _41.y, _50.y, _41.w);
+ float2 t = _53;
+ _41 = float4(_41.x, _53.x, _41.z, _53.y);
+}
+
+float4 main(float2 _60)
+{
+ float4 result = float4(0.0f, 1.0f, 2.0f, 3.0f);
+ float4 _65 = float4(0.0f, 1.0f, 2.0f, 3.0f);
+ func_vh4(_65);
+ result = _65;
+ float4 _72 = 0.0f.xxxx;
+ if (all(bool4(_65.x == float4(2.0f, 3.0f, 0.0f, 5.0f).x, _65.y == float4(2.0f, 3.0f, 0.0f, 5.0f).y, _65.z == float4(2.0f, 3.0f, 0.0f, 5.0f).z, _65.w == float4(2.0f, 3.0f, 0.0f, 5.0f).w)))
+ {
+ _72 = _12_colorGreen;
+ }
+ else
+ {
+ _72 = _12_colorRed;
+ }
+ return _72;
+}
+
+void frag_main()
+{
+ float2 _22 = 0.0f.xx;
+ sk_FragColor = main(_22);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Overflow.hlsl b/tests/sksl/shared/Overflow.hlsl
new file mode 100644
index 0000000..65781c3
--- /dev/null
+++ b/tests/sksl/shared/Overflow.hlsl
@@ -0,0 +1,49 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float _39 = (((((((((9.0000007644071214079894667114892e+35f * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f;
+ float huge = _39;
+ int _64 = (((((((((((((((((((1073741824 * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
+ int hugeI = _64;
+ uint _88 = ((((((((((((((((((2147483648u * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u;
+ uint hugeU = _88;
+ int _107 = ((((((((((((((((16384 * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
+ int hugeS = _107;
+ uint _125 = (((((((((((((((32768u * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u;
+ uint hugeUS = _125;
+ int _146 = ((((((((((((((((((int(0x80000000) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
+ int hugeNI = _146;
+ int _164 = ((((((((((((((((-32768) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
+ int hugeNS = _164;
+ int4 _184 = ((((((((((((((int4(1073741824, 1073741824, 1073741824, 1073741824) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2);
+ int4 hugeIvec = _184;
+ uint4 _203 = (((((((((((((uint4(2147483648u, 2147483648u, 2147483648u, 2147483648u) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u);
+ uint4 hugeUvec = _203;
+ return ((((((((_10_colorGreen * clamp(_39, 0.0f, 1.0f)) * clamp(float(_64), 0.0f, 1.0f)) * clamp(float(_88), 0.0f, 1.0f)) * clamp(float(_107), 0.0f, 1.0f)) * clamp(float(_125), 0.0f, 1.0f)) * clamp(float(_146), 0.0f, 1.0f)) * clamp(float(_164), 0.0f, 1.0f)) * clamp(float4(float(_184.x), float(_184.y), float(_184.z), float(_184.w)), 0.0f.xxxx, 1.0f.xxxx)) * clamp(float4(float(_203.x), float(_203.y), float(_203.z), float(_203.w)), 0.0f.xxxx, 1.0f.xxxx);
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/RectangleTexture.hlsl b/tests/sksl/shared/RectangleTexture.hlsl
new file mode 100644
index 0000000..8a47a62
--- /dev/null
+++ b/tests/sksl/shared/RectangleTexture.hlsl
@@ -0,0 +1,26 @@
+Texture2D<float4> test2D : register(t0, space0);
+SamplerState _test2D_sampler : register(s0, space0);
+Texture2D<float4> test2DRect : register(t1, space0);
+SamplerState _test2DRect_sampler : register(s1, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = test2D.Sample(_test2D_sampler, 0.5f.xx);
+ sk_FragColor = test2DRect.Sample(_test2DRect_sampler, 0.5f.xx);
+ sk_FragColor = test2DRect.Sample(_test2DRect_sampler, 0.5f.xxx.xy / 0.5f.xxx.z);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ResizeMatrix.hlsl b/tests/sksl/shared/ResizeMatrix.hlsl
new file mode 100644
index 0000000..4af7952
--- /dev/null
+++ b/tests/sksl/shared/ResizeMatrix.hlsl
@@ -0,0 +1,60 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float result = 0.0f;
+ float2x2 a = float2x2(float3(1.0f, 0.0f, 0.0f).xy, float3(0.0f, 1.0f, 0.0f).xy);
+ float _46 = 0.0f + a[0].x;
+ result = _46;
+ float2x2 b = float2x2(float4(1.0f, 0.0f, 0.0f, 0.0f).xy, float4(0.0f, 1.0f, 0.0f, 0.0f).xy);
+ float _60 = _46 + b[0].x;
+ result = _60;
+ float3x3 c = float3x3(float4(1.0f, 0.0f, 0.0f, 0.0f).xyz, float4(0.0f, 1.0f, 0.0f, 0.0f).xyz, float4(0.0f, 0.0f, 1.0f, 0.0f).xyz);
+ float _71 = _60 + c[0].x;
+ result = _71;
+ float3x3 d = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+ float _79 = _71 + d[0].x;
+ result = _79;
+ float4x4 e = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
+ float _86 = _79 + e[0].x;
+ result = _86;
+ float2x2 f = float2x2(float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.xy, float4(0.0f, 1.0f, 0.0f, 0.0f).xyz.xy);
+ float _98 = _86 + f[0].x;
+ result = _98;
+ float4 _101 = 0.0f.xxxx;
+ if (_98 == 6.0f)
+ {
+ _101 = _10_colorGreen;
+ }
+ else
+ {
+ _101 = _10_colorRed;
+ }
+ return _101;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ResizeMatrixNonsquare.hlsl b/tests/sksl/shared/ResizeMatrixNonsquare.hlsl
new file mode 100644
index 0000000..2696269
--- /dev/null
+++ b/tests/sksl/shared/ResizeMatrixNonsquare.hlsl
@@ -0,0 +1,60 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float result = 0.0f;
+ float3x3 g = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+ float _45 = 0.0f + g[0].x;
+ result = _45;
+ float3x3 h = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+ float _54 = _45 + h[0].x;
+ result = _54;
+ float4x4 i = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
+ float _72 = _54 + i[0].x;
+ result = _72;
+ float4x4 j = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
+ float _81 = _72 + j[0].x;
+ result = _81;
+ float2x4 k = float2x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f));
+ float _87 = _81 + k[0].x;
+ result = _87;
+ float4x2 l = float4x2(float4(1.0f, 0.0f, 0.0f, 0.0f).xy, float4(0.0f, 1.0f, 0.0f, 0.0f).xy, 0.0f.xx, 0.0f.xx);
+ float _96 = _87 + l[0].x;
+ result = _96;
+ float4 _99 = 0.0f.xxxx;
+ if (_96 == 6.0f)
+ {
+ _99 = _10_colorGreen;
+ }
+ else
+ {
+ _99 = _10_colorRed;
+ }
+ return _99;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ReturnBadTypeFromMain.hlsl b/tests/sksl/shared/ReturnBadTypeFromMain.hlsl
new file mode 100644
index 0000000..a149e76
--- /dev/null
+++ b/tests/sksl/shared/ReturnBadTypeFromMain.hlsl
@@ -0,0 +1,29 @@
+### Compilation failed:
+
+error: SPIR-V validation error: [VUID-StandaloneSpirv-None-04633] OpEntryPoint Entry Point <id> '2[%main]'s function return type is not void.
+ OpEntryPoint Fragment %main "main" %sk_Clockwise
+
+OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main" %sk_Clockwise
+OpExecutionMode %main OriginUpperLeft
+OpName %sk_Clockwise "sk_Clockwise"
+OpName %main "main"
+OpDecorate %sk_Clockwise BuiltIn FrontFacing
+%bool = OpTypeBool
+%_ptr_Input_bool = OpTypePointer Input %bool
+%sk_Clockwise = OpVariable %_ptr_Input_bool Input
+%int = OpTypeInt 32 1
+%v3int = OpTypeVector %int 3
+%8 = OpTypeFunction %v3int
+%int_1 = OpConstant %int 1
+%int_2 = OpConstant %int 2
+%int_3 = OpConstant %int 3
+%13 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%main = OpFunction %v3int None %8
+%9 = OpLabel
+OpReturnValue %13
+OpFunctionEnd
+
+1 error
diff --git a/tests/sksl/shared/ReturnColorFromMain.hlsl b/tests/sksl/shared/ReturnColorFromMain.hlsl
new file mode 100644
index 0000000..3edcf24
--- /dev/null
+++ b/tests/sksl/shared/ReturnColorFromMain.hlsl
@@ -0,0 +1,25 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ return float4(1.0f, 2.0f, 3.0f, 4.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl b/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl
new file mode 100644
index 0000000..bb2612c
--- /dev/null
+++ b/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl
@@ -0,0 +1,163 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _15_colorGreen : packoffset(c0);
+ float4 _15_colorRed : packoffset(c1);
+ float _15_unknownInput : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool return_on_both_sides_b()
+{
+ if (_15_unknownInput == 1.0f)
+ {
+ return true;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+bool for_inside_body_b()
+{
+ for (int x = 0; x <= 10; x++)
+ {
+ return true;
+ }
+}
+
+bool after_for_body_b()
+{
+ for (int x = 0; x <= 10; x++)
+ {
+ }
+ return true;
+}
+
+bool for_with_double_sided_conditional_return_b()
+{
+ for (int x = 0; x <= 10; x++)
+ {
+ if (_15_unknownInput == 1.0f)
+ {
+ return true;
+ }
+ else
+ {
+ return true;
+ }
+ }
+}
+
+bool if_else_chain_b()
+{
+ if (_15_unknownInput == 1.0f)
+ {
+ return true;
+ }
+ else
+ {
+ if (_15_unknownInput == 2.0f)
+ {
+ return false;
+ }
+ else
+ {
+ if (_15_unknownInput == 3.0f)
+ {
+ return true;
+ }
+ else
+ {
+ if (_15_unknownInput == 4.0f)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+ }
+}
+
+float4 main(float2 _114)
+{
+ bool _119 = false;
+ if (true)
+ {
+ _119 = return_on_both_sides_b();
+ }
+ else
+ {
+ _119 = false;
+ }
+ bool _123 = false;
+ if (_119)
+ {
+ _123 = for_inside_body_b();
+ }
+ else
+ {
+ _123 = false;
+ }
+ bool _127 = false;
+ if (_123)
+ {
+ _127 = after_for_body_b();
+ }
+ else
+ {
+ _127 = false;
+ }
+ bool _131 = false;
+ if (_127)
+ {
+ _131 = for_with_double_sided_conditional_return_b();
+ }
+ else
+ {
+ _131 = false;
+ }
+ bool _135 = false;
+ if (_131)
+ {
+ _135 = if_else_chain_b();
+ }
+ else
+ {
+ _135 = false;
+ }
+ float4 _136 = 0.0f.xxxx;
+ if (_135)
+ {
+ _136 = _15_colorGreen;
+ }
+ else
+ {
+ _136 = _15_colorRed;
+ }
+ return _136;
+}
+
+void frag_main()
+{
+ float2 _25 = 0.0f.xx;
+ sk_FragColor = main(_25);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl b/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl
new file mode 100644
index 0000000..ef14708
--- /dev/null
+++ b/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl
@@ -0,0 +1,320 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _22_colorGreen : packoffset(c0);
+ float4 _22_colorRed : packoffset(c1);
+ float _22_unknownInput : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool inside_while_loop_b()
+{
+ while (_22_unknownInput == 123.0f)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool inside_infinite_do_loop_b()
+{
+ do
+ {
+ return true;
+ } while (true);
+}
+
+bool inside_infinite_while_loop_b()
+{
+ while (true)
+ {
+ return true;
+ }
+}
+
+bool after_do_loop_b()
+{
+ do
+ {
+ break;
+ } while (true);
+ return true;
+}
+
+bool after_while_loop_b()
+{
+ while (!true)
+ {
+ break;
+ }
+ return true;
+}
+
+bool switch_with_all_returns_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ return true;
+ }
+ case 2:
+ {
+ return false;
+ }
+ default:
+ {
+ return false;
+ }
+ }
+}
+
+bool switch_fallthrough_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ return true;
+ }
+ case 2:
+ {
+ return false;
+ }
+ default:
+ {
+ return false;
+ }
+ }
+}
+
+bool switch_fallthrough_twice_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ return true;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool switch_with_break_in_loop_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ for (int x = 0; !(x <= 10); x++)
+ {
+ break;
+ }
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool switch_with_continue_in_loop_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ for (int x = 0; x <= 10; x++)
+ {
+ }
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool switch_with_if_that_returns_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ if (_22_unknownInput == 123.0f)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool switch_with_one_sided_if_then_fallthrough_b()
+{
+ switch (int(_22_unknownInput))
+ {
+ case 1:
+ {
+ if (_22_unknownInput == 123.0f)
+ {
+ return false;
+ }
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+float4 main(float2 _163)
+{
+ bool _169 = false;
+ if (inside_while_loop_b())
+ {
+ _169 = inside_infinite_do_loop_b();
+ }
+ else
+ {
+ _169 = false;
+ }
+ bool _173 = false;
+ if (_169)
+ {
+ _173 = inside_infinite_while_loop_b();
+ }
+ else
+ {
+ _173 = false;
+ }
+ bool _177 = false;
+ if (_173)
+ {
+ _177 = after_do_loop_b();
+ }
+ else
+ {
+ _177 = false;
+ }
+ bool _181 = false;
+ if (_177)
+ {
+ _181 = after_while_loop_b();
+ }
+ else
+ {
+ _181 = false;
+ }
+ bool _185 = false;
+ if (_181)
+ {
+ _185 = switch_with_all_returns_b();
+ }
+ else
+ {
+ _185 = false;
+ }
+ bool _189 = false;
+ if (_185)
+ {
+ _189 = switch_fallthrough_b();
+ }
+ else
+ {
+ _189 = false;
+ }
+ bool _193 = false;
+ if (_189)
+ {
+ _193 = switch_fallthrough_twice_b();
+ }
+ else
+ {
+ _193 = false;
+ }
+ bool _197 = false;
+ if (_193)
+ {
+ _197 = switch_with_break_in_loop_b();
+ }
+ else
+ {
+ _197 = false;
+ }
+ bool _201 = false;
+ if (_197)
+ {
+ _201 = switch_with_continue_in_loop_b();
+ }
+ else
+ {
+ _201 = false;
+ }
+ bool _205 = false;
+ if (_201)
+ {
+ _205 = switch_with_if_that_returns_b();
+ }
+ else
+ {
+ _205 = false;
+ }
+ bool _209 = false;
+ if (_205)
+ {
+ _209 = switch_with_one_sided_if_then_fallthrough_b();
+ }
+ else
+ {
+ _209 = false;
+ }
+ float4 _210 = 0.0f.xxxx;
+ if (_209)
+ {
+ _210 = _22_colorGreen;
+ }
+ else
+ {
+ _210 = _22_colorRed;
+ }
+ return _210;
+}
+
+void frag_main()
+{
+ float2 _32 = 0.0f.xx;
+ sk_FragColor = main(_32);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SampleLocations.hlsl b/tests/sksl/shared/SampleLocations.hlsl
new file mode 100644
index 0000000..37572a9
--- /dev/null
+++ b/tests/sksl/shared/SampleLocations.hlsl
@@ -0,0 +1,84 @@
+static float4 gl_Position;
+static int gl_VertexIndex;
+static int gl_InstanceIndex;
+static float2 vcoord_Stage0;
+
+struct SPIRV_Cross_Input
+{
+ uint gl_VertexIndex : SV_VertexID;
+ uint gl_InstanceIndex : SV_InstanceID;
+};
+
+struct SPIRV_Cross_Output
+{
+ noperspective float2 vcoord_Stage0 : TEXCOORD1;
+ float4 gl_Position : SV_Position;
+};
+
+void vert_main()
+{
+ int _22 = gl_InstanceIndex % 200;
+ int x = _22;
+ int _25 = gl_InstanceIndex / 200;
+ int y = _25;
+ int _31 = (gl_InstanceIndex * 929) % 17;
+ int ileft = _31;
+ int _40 = (_31 + 1) + ((gl_InstanceIndex * 1637) % (17 - _31));
+ int iright = _40;
+ int _45 = (gl_InstanceIndex * 313) % 17;
+ int itop = _45;
+ int _53 = (_45 + 1) + ((gl_InstanceIndex * 1901) % (17 - _45));
+ int ibot = _53;
+ float outset = 0.03125f;
+ float _63 = 0.0f;
+ if (0 == ((_22 + _25) % 2))
+ {
+ _63 = -0.03125f;
+ }
+ else
+ {
+ _63 = 0.03125f;
+ }
+ outset = _63;
+ float _73 = (float(_31) * 0.0625f) - _63;
+ float l = _73;
+ float _77 = (float(_40) * 0.0625f) + _63;
+ float r = _77;
+ float t = (float(_45) * 0.0625f) - _63;
+ float b = (float(_53) * 0.0625f) + _63;
+ float _92 = 0.0f;
+ if (0 == (gl_VertexIndex % 2))
+ {
+ _92 = _73;
+ }
+ else
+ {
+ _92 = _77;
+ }
+ float2 vertexpos = 0.0f.xx;
+ vertexpos.x = float(_22) + _92;
+ float _104 = 0.0f;
+ if (0 == (gl_VertexIndex / 2))
+ {
+ _104 = t;
+ }
+ else
+ {
+ _104 = b;
+ }
+ vertexpos.y = float(y) + _104;
+ vcoord_Stage0.x = float((0 == (gl_VertexIndex % 2)) ? (-1) : 1);
+ vcoord_Stage0.y = float((0 == (gl_VertexIndex / 2)) ? (-1) : 1);
+ gl_Position = float4(vertexpos.x, vertexpos.y, 0.0f, 1.0f);
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_VertexIndex = int(stage_input.gl_VertexIndex);
+ gl_InstanceIndex = int(stage_input.gl_InstanceIndex);
+ vert_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.gl_Position = gl_Position;
+ stage_output.vcoord_Stage0 = vcoord_Stage0;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl b/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl
new file mode 100644
index 0000000..84f9097
--- /dev/null
+++ b/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl
@@ -0,0 +1,61 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float f = _10_colorGreen.y;
+ int _39 = int(_10_colorGreen.y);
+ int i = _39;
+ bool _45 = _10_colorGreen.y != 0.0f;
+ bool b = _45;
+ float f1 = _10_colorGreen.y;
+ float _48 = float(_39);
+ float f2 = _48;
+ float _50 = float(_45);
+ float f3 = _50;
+ int _53 = int(_10_colorGreen.y);
+ int i1 = _53;
+ int i2 = _39;
+ int _56 = int(_45);
+ int i3 = _56;
+ bool _59 = _10_colorGreen.y != 0.0f;
+ bool b1 = _59;
+ bool _61 = _39 != 0;
+ bool b2 = _61;
+ bool b3 = _45;
+ float4 _79 = 0.0f.xxxx;
+ if (((((((((_10_colorGreen.y + _48) + _50) + float(_53)) + float(_39)) + float(_56)) + float(_59)) + float(_61)) + float(_45)) == 9.0f)
+ {
+ _79 = _10_colorGreen;
+ }
+ else
+ {
+ _79 = _10_colorRed;
+ }
+ return _79;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl b/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl
new file mode 100644
index 0000000..19885ce
--- /dev/null
+++ b/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl
@@ -0,0 +1,76 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float f = _10_colorGreen.y;
+ int _39 = int(_10_colorGreen.y);
+ int i = _39;
+ uint _46 = uint(_10_colorGreen.y);
+ uint u = _46;
+ bool _52 = _10_colorGreen.y != 0.0f;
+ bool b = _52;
+ float f1 = _10_colorGreen.y;
+ float _55 = float(_39);
+ float f2 = _55;
+ float _57 = float(_46);
+ float f3 = _57;
+ float _59 = float(_52);
+ float f4 = _59;
+ int _62 = int(_10_colorGreen.y);
+ int i1 = _62;
+ int i2 = _39;
+ int _65 = int(_46);
+ int i3 = _65;
+ int _67 = int(_52);
+ int i4 = _67;
+ uint _70 = uint(_10_colorGreen.y);
+ uint u1 = _70;
+ uint _72 = uint(_39);
+ uint u2 = _72;
+ uint u3 = _46;
+ uint _75 = uint(_52);
+ uint u4 = _75;
+ bool _79 = _10_colorGreen.y != 0.0f;
+ bool b1 = _79;
+ bool _81 = _39 != 0;
+ bool b2 = _81;
+ bool _83 = _46 != 0u;
+ bool b3 = _83;
+ bool b4 = _52;
+ float4 _114 = 0.0f.xxxx;
+ if ((((((((((((((((_10_colorGreen.y + _55) + _57) + _59) + float(_62)) + float(_39)) + float(_65)) + float(_67)) + float(_70)) + float(_72)) + float(_46)) + float(_75)) + float(_79)) + float(_81)) + float(_83)) + float(_52)) == 16.0f)
+ {
+ _114 = _10_colorGreen;
+ }
+ else
+ {
+ _114 = _10_colorRed;
+ }
+ return _114;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/ScopedSymbol.hlsl b/tests/sksl/shared/ScopedSymbol.hlsl
new file mode 100644
index 0000000..683e5c0
--- /dev/null
+++ b/tests/sksl/shared/ScopedSymbol.hlsl
@@ -0,0 +1,110 @@
+struct S
+{
+ int i;
+};
+
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _17_colorGreen : packoffset(c0);
+ float4 _17_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static int glob = 0;
+
+bool block_variable_hides_global_variable_b()
+{
+ return glob == 2;
+}
+
+bool local_variable_hides_struct_b()
+{
+ bool S_1 = true;
+ return true;
+}
+
+bool local_struct_variable_hides_struct_type_b()
+{
+ S _44 = { 1 };
+ S S_1 = _44;
+ return S_1.i == 1;
+}
+
+bool local_variable_hides_global_variable_b()
+{
+ int glob_1 = 1;
+ return true;
+}
+
+float4 main(float2 _53)
+{
+ glob = 2;
+ bool _59 = false;
+ if (true)
+ {
+ _59 = block_variable_hides_global_variable_b();
+ }
+ else
+ {
+ _59 = false;
+ }
+ bool _63 = false;
+ if (_59)
+ {
+ _63 = local_variable_hides_struct_b();
+ }
+ else
+ {
+ _63 = false;
+ }
+ bool _67 = false;
+ if (_63)
+ {
+ _67 = local_struct_variable_hides_struct_type_b();
+ }
+ else
+ {
+ _67 = false;
+ }
+ bool _71 = false;
+ if (_67)
+ {
+ _71 = local_variable_hides_global_variable_b();
+ }
+ else
+ {
+ _71 = false;
+ }
+ float4 _72 = 0.0f.xxxx;
+ if (_71)
+ {
+ _72 = _17_colorGreen;
+ }
+ else
+ {
+ _72 = _17_colorRed;
+ }
+ return _72;
+}
+
+void frag_main()
+{
+ float2 _27 = 0.0f.xx;
+ float4 _29 = main(_27);
+ sk_FragColor = _29;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StackingVectorCasts.hlsl b/tests/sksl/shared/StackingVectorCasts.hlsl
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/StackingVectorCasts.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticIf.hlsl b/tests/sksl/shared/StaticIf.hlsl
new file mode 100644
index 0000000..524eb58
--- /dev/null
+++ b/tests/sksl/shared/StaticIf.hlsl
@@ -0,0 +1,34 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorRed : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 result = _10_colorRed;
+ result = _10_colorGreen;
+ return result;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitch.hlsl b/tests/sksl/shared/StaticSwitch.hlsl
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitch.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithBreak.hlsl b/tests/sksl/shared/StaticSwitchWithBreak.hlsl
new file mode 100644
index 0000000..5402da6
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithBreak.hlsl
@@ -0,0 +1,21 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float x = 0.0f;
+ x = 0.0f;
+ sk_FragColor = 0.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl b/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl
new file mode 100644
index 0000000..5402da6
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl
@@ -0,0 +1,21 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float x = 0.0f;
+ x = 0.0f;
+ sk_FragColor = 0.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl b/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl
new file mode 100644
index 0000000..48352ca
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float value = 0.0f;
+ switch (0)
+ {
+ case 0:
+ {
+ value = 0.0f;
+ if (_10_unknownInput == 2.0f)
+ {
+ break;
+ }
+ value = 1.0f;
+ break;
+ }
+ case 1:
+ {
+ value = 1.0f;
+ break;
+ }
+ }
+ sk_FragColor = value.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl b/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl
new file mode 100644
index 0000000..c5a8118
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl
@@ -0,0 +1,44 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float value = 0.0f;
+ switch (0)
+ {
+ case 0:
+ {
+ value = 0.0f;
+ if (_10_unknownInput == 2.0f)
+ {
+ sk_FragColor = 0.0f.xxxx;
+ break;
+ }
+ value = 1.0f;
+ break;
+ }
+ case 1:
+ {
+ value = 1.0f;
+ break;
+ }
+ }
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithContinue.hlsl b/tests/sksl/shared/StaticSwitchWithContinue.hlsl
new file mode 100644
index 0000000..ff10238
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithContinue.hlsl
@@ -0,0 +1,46 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float result = 0.0f;
+ for (int x = 0; x <= 1; x++)
+ {
+ result = 2.0f;
+ }
+ float4 _45 = 0.0f.xxxx;
+ if (result == 2.0f)
+ {
+ _45 = _10_colorGreen;
+ }
+ else
+ {
+ _45 = _10_colorRed;
+ }
+ return _45;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl b/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl
new file mode 100644
index 0000000..522f1e4
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl
@@ -0,0 +1,22 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float x = 0.0f;
+ x = 0.0f;
+ x = 1.0f;
+ sk_FragColor = 1.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl b/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl
new file mode 100644
index 0000000..e943e26
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl
@@ -0,0 +1,21 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float x = 0.0f;
+ x = 1.0f;
+ sk_FragColor = 1.0f.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl
new file mode 100644
index 0000000..3fa6465
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl
@@ -0,0 +1,38 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float x = 0.0f;
+ switch (0)
+ {
+ case 0:
+ {
+ x = 0.0f;
+ if (0.0f < 1.0f)
+ {
+ break;
+ }
+ x = 1.0f;
+ break;
+ }
+ case 1:
+ {
+ x = 1.0f;
+ break;
+ }
+ }
+ sk_FragColor = x.xxxx;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl
new file mode 100644
index 0000000..004579f
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl
@@ -0,0 +1,38 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float x = 0.0f;
+ switch (0)
+ {
+ case 0:
+ {
+ x = 0.0f;
+ if (0.0f < 1.0f)
+ {
+ sk_FragColor = 0.0f.xxxx;
+ break;
+ }
+ x = 1.0f;
+ break;
+ }
+ case 1:
+ {
+ x = 1.0f;
+ break;
+ }
+ }
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StructArrayFollowedByScalar.hlsl b/tests/sksl/shared/StructArrayFollowedByScalar.hlsl
new file mode 100644
index 0000000..4843554
--- /dev/null
+++ b/tests/sksl/shared/StructArrayFollowedByScalar.hlsl
@@ -0,0 +1,36 @@
+struct S
+{
+ float rgb[3];
+ float a;
+};
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ S s = { { 0.0f, 0.0f, 0.0f }, 0.0f };
+ s.rgb[0] = 0.0f;
+ s.rgb[1] = 1.0f;
+ s.rgb[2] = 0.0f;
+ s.a = 1.0f;
+ return float4(s.rgb[0], s.rgb[1], s.rgb[2], s.a);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StructComparison.hlsl b/tests/sksl/shared/StructComparison.hlsl
new file mode 100644
index 0000000..e6bc15f
--- /dev/null
+++ b/tests/sksl/shared/StructComparison.hlsl
@@ -0,0 +1,67 @@
+struct S
+{
+ int x;
+ int y;
+ row_major float2x2 m;
+ float a[5];
+};
+
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float _10_testArray[5] : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ float _36[5] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
+ float array[5] = _36;
+ S _46 = { 1, 2, float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), _36 };
+ S s1 = _46;
+ S _51 = { 1, 2, float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), _10_testArray };
+ S s2 = _51;
+ S _56 = { 1, 2, float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f)), _36 };
+ S s3 = _56;
+ bool _96 = false;
+ if (((5.0f == _10_testArray[4]) && ((4.0f == _10_testArray[3]) && ((3.0f == _10_testArray[2]) && ((2.0f == _10_testArray[1]) && (1.0f == _10_testArray[0]))))) && ((all(bool2(float2(1.0f, 0.0f).x == float2(1.0f, 0.0f).x, float2(1.0f, 0.0f).y == float2(1.0f, 0.0f).y)) && all(bool2(float2(0.0f, 1.0f).x == float2(0.0f, 1.0f).x, float2(0.0f, 1.0f).y == float2(0.0f, 1.0f).y))) && (true && true)))
+ {
+ _96 = (false || (false || (false || (false || false)))) || ((any(bool2(float2(1.0f, 0.0f).x != float2(2.0f, 0.0f).x, float2(1.0f, 0.0f).y != float2(2.0f, 0.0f).y)) || any(bool2(float2(0.0f, 1.0f).x != float2(0.0f, 2.0f).x, float2(0.0f, 1.0f).y != float2(0.0f, 2.0f).y))) || (false || false));
+ }
+ else
+ {
+ _96 = false;
+ }
+ float4 _97 = 0.0f.xxxx;
+ if (_96)
+ {
+ _97 = _10_colorGreen;
+ }
+ else
+ {
+ _97 = _10_colorRed;
+ }
+ return _97;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StructMaxDepth.hlsl b/tests/sksl/shared/StructMaxDepth.hlsl
new file mode 100644
index 0000000..06d568d
--- /dev/null
+++ b/tests/sksl/shared/StructMaxDepth.hlsl
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: program does not contain a main() function
+1 error
diff --git a/tests/sksl/shared/Structs.hlsl b/tests/sksl/shared/Structs.hlsl
new file mode 100644
index 0000000..8836141
--- /dev/null
+++ b/tests/sksl/shared/Structs.hlsl
@@ -0,0 +1,37 @@
+struct A
+{
+ int x;
+ int y;
+};
+
+struct B
+{
+ float x;
+ float y[2];
+ A z;
+};
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+static A a1 = { 0, 0 };
+static B b1 = { 0.0f, { 0.0f, 0.0f }, { 0, 0 } };
+
+void frag_main()
+{
+ a1.x = 0;
+ b1.x = 0.0f;
+ sk_FragColor.x = float(a1.x) + b1.x;
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/StructsInFunctions.hlsl b/tests/sksl/shared/StructsInFunctions.hlsl
new file mode 100644
index 0000000..ebbf13c
--- /dev/null
+++ b/tests/sksl/shared/StructsInFunctions.hlsl
@@ -0,0 +1,204 @@
+struct S
+{
+ float x;
+ int y;
+};
+
+struct Nested
+{
+ S a;
+ S b;
+};
+
+struct Compound
+{
+ float4 f4;
+ int3 i3;
+};
+
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _14_colorRed : packoffset(c0);
+ float4 _14_colorGreen : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+S returns_a_struct_S()
+{
+ S s = { 0.0f, 0 };
+ s.x = 1.0f;
+ s.y = 2;
+ return s;
+}
+
+float accepts_a_struct_fS(S _47)
+{
+ return _47.x + float(_47.y);
+}
+
+void modifies_a_struct_vS(inout S _56)
+{
+ _56.x += 1.0f;
+ _56.y++;
+}
+
+S constructs_a_struct_S()
+{
+ S _45 = { 2.0f, 3 };
+ return _45;
+}
+
+float4 main(float2 _65)
+{
+ S _68 = returns_a_struct_S();
+ S s = _68;
+ S _70 = _68;
+ float x = accepts_a_struct_fS(_70);
+ S _72 = _68;
+ modifies_a_struct_vS(_72);
+ s = _72;
+ S expected = constructs_a_struct_S();
+ Nested n1 = { { 0.0f, 0 }, { 0.0f, 0 } };
+ n1.a = returns_a_struct_S();
+ n1.b = n1.a;
+ Nested n2 = n1;
+ Nested n3 = n1;
+ S _90 = n3.b;
+ modifies_a_struct_vS(_90);
+ n3.b = _90;
+ Compound _104 = { float4(1.0f, 2.0f, 3.0f, 4.0f), int3(5, 6, 7) };
+ Compound c1 = _104;
+ float4 _110 = float4(_14_colorGreen.y, 2.0f, 3.0f, 4.0f);
+ Compound _111 = { _110, int3(5, 6, 7) };
+ Compound c2 = _111;
+ float4 _116 = float4(_14_colorGreen.x, 2.0f, 3.0f, 4.0f);
+ Compound _117 = { _116, int3(5, 6, 7) };
+ Compound c3 = _117;
+ bool _128 = false;
+ if (x == 3.0f)
+ {
+ _128 = s.x == 2.0f;
+ }
+ else
+ {
+ _128 = false;
+ }
+ bool _134 = false;
+ if (_128)
+ {
+ _134 = s.y == 3;
+ }
+ else
+ {
+ _134 = false;
+ }
+ bool _146 = false;
+ if (_134)
+ {
+ _146 = (s.y == expected.y) && (s.x == expected.x);
+ }
+ else
+ {
+ _146 = false;
+ }
+ bool _156 = false;
+ if (_146)
+ {
+ S _150 = { 2.0f, 3 };
+ _156 = (s.y == 3) && (s.x == 2.0f);
+ }
+ else
+ {
+ _156 = false;
+ }
+ bool _168 = false;
+ if (_156)
+ {
+ S _160 = returns_a_struct_S();
+ _168 = (s.y != _160.y) || (s.x != _160.x);
+ }
+ else
+ {
+ _168 = false;
+ }
+ bool _192 = false;
+ if (_168)
+ {
+ _192 = ((n1.b.y == n2.b.y) && (n1.b.x == n2.b.x)) && ((n1.a.y == n2.a.y) && (n1.a.x == n2.a.x));
+ }
+ else
+ {
+ _192 = false;
+ }
+ bool _216 = false;
+ if (_192)
+ {
+ _216 = ((n1.b.y != n3.b.y) || (n1.b.x != n3.b.x)) || ((n1.a.y != n3.a.y) || (n1.a.x != n3.a.x));
+ }
+ else
+ {
+ _216 = false;
+ }
+ bool _236 = false;
+ if (_216)
+ {
+ S _220 = { 1.0f, 2 };
+ S _221 = { 2.0f, 3 };
+ Nested _222 = { _220, _221 };
+ _236 = ((n3.b.y == 3) && (n3.b.x == 2.0f)) && ((n3.a.y == 2) && (n3.a.x == 1.0f));
+ }
+ else
+ {
+ _236 = false;
+ }
+ bool _244 = false;
+ if (_236)
+ {
+ _244 = true && all(bool4(float4(1.0f, 2.0f, 3.0f, 4.0f).x == _110.x, float4(1.0f, 2.0f, 3.0f, 4.0f).y == _110.y, float4(1.0f, 2.0f, 3.0f, 4.0f).z == _110.z, float4(1.0f, 2.0f, 3.0f, 4.0f).w == _110.w));
+ }
+ else
+ {
+ _244 = false;
+ }
+ bool _250 = false;
+ if (_244)
+ {
+ _250 = false || any(bool4(_110.x != _116.x, _110.y != _116.y, _110.z != _116.z, _110.w != _116.w));
+ }
+ else
+ {
+ _250 = false;
+ }
+ bool valid = _250;
+ float4 _251 = 0.0f.xxxx;
+ if (_250)
+ {
+ _251 = _14_colorGreen;
+ }
+ else
+ {
+ _251 = _14_colorRed;
+ }
+ return _251;
+}
+
+void frag_main()
+{
+ float2 _24 = 0.0f.xx;
+ sk_FragColor = main(_24);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwitchWithEarlyReturn.hlsl b/tests/sksl/shared/SwitchWithEarlyReturn.hlsl
new file mode 100644
index 0000000..74abc03
--- /dev/null
+++ b/tests/sksl/shared/SwitchWithEarlyReturn.hlsl
@@ -0,0 +1,456 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _24_colorGreen : packoffset(c0);
+ float4 _24_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool return_in_one_case_bi(int _40)
+{
+ int val = 0;
+ switch (_40)
+ {
+ case 1:
+ {
+ val = 0 + 1;
+ return false;
+ }
+ default:
+ {
+ val++;
+ break;
+ }
+ }
+ return val == 1;
+}
+
+bool return_in_default_bi(int _55)
+{
+ do
+ {
+ return true;
+ } while(false);
+}
+
+bool return_in_every_case_bi(int _61)
+{
+ switch (_61)
+ {
+ case 1:
+ {
+ return false;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool return_in_every_case_no_default_bi(int _67)
+{
+ int val = 0;
+ switch (_67)
+ {
+ case 1:
+ {
+ return false;
+ }
+ case 2:
+ {
+ return true;
+ }
+ }
+ int _74 = 0 + 1;
+ val = _74;
+ return _74 == 1;
+}
+
+bool case_has_break_before_return_bi(int _76)
+{
+ int val = 0;
+ switch (_76)
+ {
+ case 1:
+ {
+ break;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+ int _84 = 0 + 1;
+ val = _84;
+ return _84 == 1;
+}
+
+bool case_has_break_after_return_bi(int _86)
+{
+ switch (_86)
+ {
+ case 1:
+ {
+ return false;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool no_return_in_default_bi(int _93)
+{
+ int val = 0;
+ switch (_93)
+ {
+ case 1:
+ {
+ return false;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ int _101 = 0 + 1;
+ val = _101;
+ return _101 == 1;
+}
+
+bool empty_default_bi(int _103)
+{
+ int val = 0;
+ switch (_103)
+ {
+ case 1:
+ {
+ return false;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ int _111 = 0 + 1;
+ val = _111;
+ return _111 == 1;
+}
+
+bool return_with_fallthrough_bi(int _113)
+{
+ switch (_113)
+ {
+ case 1:
+ {
+ return true;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return false;
+ }
+ }
+}
+
+bool fallthrough_ends_in_break_bi(int _120)
+{
+ int val = 0;
+ switch (_120)
+ {
+ case 1:
+ {
+ break;
+ }
+ case 2:
+ {
+ break;
+ }
+ default:
+ {
+ return false;
+ }
+ }
+ int _128 = 0 + 1;
+ val = _128;
+ return _128 == 1;
+}
+
+bool fallthrough_to_default_with_break_bi(int _130)
+{
+ int val = 0;
+ switch (_130)
+ {
+ case 1:
+ {
+ break;
+ }
+ case 2:
+ {
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ int _138 = 0 + 1;
+ val = _138;
+ return _138 == 1;
+}
+
+bool fallthrough_to_default_with_return_bi(int _140)
+{
+ switch (_140)
+ {
+ case 1:
+ {
+ return true;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool fallthrough_with_loop_break_bi(int _147)
+{
+ int val = 0;
+ switch (_147)
+ {
+ case 1:
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ val++;
+ break;
+ }
+ return true;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+bool fallthrough_with_loop_continue_bi(int _168)
+{
+ int val = 0;
+ switch (_168)
+ {
+ case 1:
+ {
+ for (int i = 0; i < 5; i++)
+ {
+ val++;
+ }
+ return true;
+ }
+ case 2:
+ {
+ return true;
+ }
+ default:
+ {
+ return true;
+ }
+ }
+}
+
+float4 main(float2 _189)
+{
+ int _196 = int(_24_colorGreen.y);
+ int x = _196;
+ int _197 = _196;
+ bool _203 = false;
+ if (return_in_one_case_bi(_197))
+ {
+ int _201 = _196;
+ _203 = return_in_default_bi(_201);
+ }
+ else
+ {
+ _203 = false;
+ }
+ bool _208 = false;
+ if (_203)
+ {
+ int _206 = _196;
+ _208 = return_in_every_case_bi(_206);
+ }
+ else
+ {
+ _208 = false;
+ }
+ bool _213 = false;
+ if (_208)
+ {
+ int _211 = _196;
+ _213 = return_in_every_case_no_default_bi(_211);
+ }
+ else
+ {
+ _213 = false;
+ }
+ bool _218 = false;
+ if (_213)
+ {
+ int _216 = _196;
+ _218 = case_has_break_before_return_bi(_216);
+ }
+ else
+ {
+ _218 = false;
+ }
+ bool _223 = false;
+ if (_218)
+ {
+ int _221 = _196;
+ _223 = case_has_break_after_return_bi(_221);
+ }
+ else
+ {
+ _223 = false;
+ }
+ bool _228 = false;
+ if (_223)
+ {
+ int _226 = _196;
+ _228 = no_return_in_default_bi(_226);
+ }
+ else
+ {
+ _228 = false;
+ }
+ bool _233 = false;
+ if (_228)
+ {
+ int _231 = _196;
+ _233 = empty_default_bi(_231);
+ }
+ else
+ {
+ _233 = false;
+ }
+ bool _238 = false;
+ if (_233)
+ {
+ int _236 = _196;
+ _238 = return_with_fallthrough_bi(_236);
+ }
+ else
+ {
+ _238 = false;
+ }
+ bool _243 = false;
+ if (_238)
+ {
+ int _241 = _196;
+ _243 = fallthrough_ends_in_break_bi(_241);
+ }
+ else
+ {
+ _243 = false;
+ }
+ bool _248 = false;
+ if (_243)
+ {
+ int _246 = _196;
+ _248 = fallthrough_to_default_with_break_bi(_246);
+ }
+ else
+ {
+ _248 = false;
+ }
+ bool _253 = false;
+ if (_248)
+ {
+ int _251 = _196;
+ _253 = fallthrough_to_default_with_return_bi(_251);
+ }
+ else
+ {
+ _253 = false;
+ }
+ bool _258 = false;
+ if (_253)
+ {
+ int _256 = _196;
+ _258 = fallthrough_with_loop_break_bi(_256);
+ }
+ else
+ {
+ _258 = false;
+ }
+ bool _263 = false;
+ if (_258)
+ {
+ int _261 = _196;
+ _263 = fallthrough_with_loop_continue_bi(_261);
+ }
+ else
+ {
+ _263 = false;
+ }
+ float4 _264 = 0.0f.xxxx;
+ if (_263)
+ {
+ _264 = _24_colorGreen;
+ }
+ else
+ {
+ _264 = _24_colorRed;
+ }
+ return _264;
+}
+
+void frag_main()
+{
+ float2 _34 = 0.0f.xx;
+ sk_FragColor = main(_34);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleBoolConstants.hlsl b/tests/sksl/shared/SwizzleBoolConstants.hlsl
new file mode 100644
index 0000000..07c250c
--- /dev/null
+++ b/tests/sksl/shared/SwizzleBoolConstants.hlsl
@@ -0,0 +1,75 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool4 _36 = (_10_colorGreen.y != 0.0f).xxxx;
+ bool4 v = _36;
+ bool _38 = _36.x;
+ bool4 result = bool4(_38, true, true, true);
+ result = bool4(_36.xy, false, true);
+ result = bool4(_38, true, true, false);
+ bool _48 = _36.y;
+ result = bool4(false, _48, true, true);
+ result = bool4(_36.xyz, true);
+ result = bool4(_36.xy, true, true);
+ bool _60 = _36.z;
+ bool4 _61 = bool4(_38, false, _60, true);
+ result = _61;
+ result = bool4(_38, true, false, false);
+ result = bool4(true, _36.yz, false);
+ result = bool4(false, _48, true, false);
+ result = bool4(true, true, _60, false);
+ result = _36;
+ result = bool4(_36.xyz, true);
+ bool _77 = _36.w;
+ result = bool4(_36.xy, false, _77);
+ result = bool4(_36.xy, true, false);
+ result = bool4(_38, true, _36.zw);
+ result = _61;
+ result = bool4(_38, true, true, _77);
+ result = bool4(_38, true, false, true);
+ result = bool4(true, _36.yzw);
+ result = bool4(false, _36.yz, true);
+ result = bool4(false, _48, true, _77);
+ result = bool4(true, _48, true, true);
+ result = bool4(false, false, _36.zw);
+ result = bool4(false, false, _60, true);
+ bool4 _105 = bool4(false, true, true, _77);
+ result = _105;
+ float4 _107 = 0.0f.xxxx;
+ if (any(_105))
+ {
+ _107 = _10_colorGreen;
+ }
+ else
+ {
+ _107 = _10_colorRed;
+ }
+ return _107;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleByConstantIndex.hlsl b/tests/sksl/shared/SwizzleByConstantIndex.hlsl
new file mode 100644
index 0000000..efb5c1f
--- /dev/null
+++ b/tests/sksl/shared/SwizzleByConstantIndex.hlsl
@@ -0,0 +1,74 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _RESERVED_IDENTIFIER_FIXUP_0_v = _10_testInputs;
+ float _RESERVED_IDENTIFIER_FIXUP_1_x = _10_testInputs.x;
+ float _RESERVED_IDENTIFIER_FIXUP_2_y = _10_testInputs.y;
+ float _RESERVED_IDENTIFIER_FIXUP_3_z = _10_testInputs.z;
+ float _RESERVED_IDENTIFIER_FIXUP_4_w = _10_testInputs.w;
+ float4 _43 = float4(_10_testInputs);
+ float4 a = _43;
+ float _RESERVED_IDENTIFIER_FIXUP_9_x = _10_testInputs.x;
+ float _RESERVED_IDENTIFIER_FIXUP_10_y = _10_testInputs.y;
+ float _RESERVED_IDENTIFIER_FIXUP_11_z = _10_testInputs.z;
+ float _RESERVED_IDENTIFIER_FIXUP_12_w = _10_testInputs.w;
+ float4 _61 = float4(_10_testInputs.x, _10_testInputs.y, _10_testInputs.z, _10_testInputs.w);
+ float4 b = _61;
+ float4 c = float4(0.0f, 1.0f, 2.0f, 3.0f);
+ bool _79 = false;
+ if (all(bool4(_43.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _43.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _43.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _43.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w)))
+ {
+ _79 = all(bool4(_61.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _61.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _61.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _61.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w));
+ }
+ else
+ {
+ _79 = false;
+ }
+ bool _83 = false;
+ if (_79)
+ {
+ _83 = true;
+ }
+ else
+ {
+ _83 = false;
+ }
+ float4 _84 = 0.0f.xxxx;
+ if (_83)
+ {
+ _84 = _10_colorGreen;
+ }
+ else
+ {
+ _84 = _10_colorRed;
+ }
+ return _84;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleByIndex.hlsl b/tests/sksl/shared/SwizzleByIndex.hlsl
new file mode 100644
index 0000000..42982fe
--- /dev/null
+++ b/tests/sksl/shared/SwizzleByIndex.hlsl
@@ -0,0 +1,55 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorBlack : packoffset(c1);
+ float4 _10_colorGreen : packoffset(c2);
+ float4 _10_colorRed : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 _RESERVED_IDENTIFIER_FIXUP_0_v = _10_testInputs;
+ int4 _47 = int4(int(_10_colorBlack.x), int(_10_colorBlack.y), int(_10_colorBlack.z), int(_10_colorBlack.w));
+ int4 _RESERVED_IDENTIFIER_FIXUP_1_i = _47;
+ float _51 = _10_testInputs[_47.x];
+ float _RESERVED_IDENTIFIER_FIXUP_2_x = _51;
+ float _54 = _10_testInputs[_47.y];
+ float _RESERVED_IDENTIFIER_FIXUP_3_y = _54;
+ float _57 = _10_testInputs[_47.z];
+ float _RESERVED_IDENTIFIER_FIXUP_4_z = _57;
+ float _60 = _10_testInputs[_47.w];
+ float _RESERVED_IDENTIFIER_FIXUP_5_w = _60;
+ float4 _61 = float4(_51, _54, _57, _60);
+ float4 _67 = 0.0f.xxxx;
+ if (all(bool4(_61.x == float4(-1.25f, -1.25f, -1.25f, 0.0f).x, _61.y == float4(-1.25f, -1.25f, -1.25f, 0.0f).y, _61.z == float4(-1.25f, -1.25f, -1.25f, 0.0f).z, _61.w == float4(-1.25f, -1.25f, -1.25f, 0.0f).w)))
+ {
+ _67 = _10_colorGreen;
+ }
+ else
+ {
+ _67 = _10_colorRed;
+ }
+ return _67;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleConstants.hlsl b/tests/sksl/shared/SwizzleConstants.hlsl
new file mode 100644
index 0000000..51e7eed
--- /dev/null
+++ b/tests/sksl/shared/SwizzleConstants.hlsl
@@ -0,0 +1,91 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_testInputs : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c1);
+ float4 _10_colorRed : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 v = _10_testInputs;
+ float4 _35 = float4(_10_testInputs.x, 1.0f, 1.0f, 1.0f);
+ v = _35;
+ float2 _36 = _35.xy;
+ float _37 = _36.x;
+ v = float4(_37, _36.y, 1.0f, 1.0f);
+ v = float4(_37, 1.0f, 1.0f, 1.0f);
+ v = float4(0.0f, 1.0f, 1.0f, 1.0f);
+ float4 _47 = float4(float4(0.0f, 1.0f, 1.0f, 1.0f).xyz, 1.0f);
+ v = _47;
+ float2 _48 = _47.xy;
+ float _49 = _48.x;
+ v = float4(_49, _48.y, 1.0f, 1.0f);
+ v = float4(_49, 0.0f, 1.0f, 1.0f);
+ float4 _53 = float4(_49, 1.0f, 0.0f, 1.0f);
+ v = _53;
+ float2 _54 = _53.yz;
+ float _55 = _54.x;
+ v = float4(1.0f, _55, _54.y, 1.0f);
+ v = float4(0.0f, _55, 1.0f, 1.0f);
+ v = 1.0f.xxxx;
+ float4 _64 = float4(1.0f.xxxx.xyz, 1.0f);
+ v = _64;
+ float4 _68 = float4(_64.xy, 0.0f, 1.0f);
+ v = _68;
+ float2 _69 = _68.xy;
+ float _70 = _69.x;
+ float4 _72 = float4(_70, _69.y, 1.0f, 0.0f);
+ v = _72;
+ float2 _73 = _72.zw;
+ float _74 = _73.x;
+ v = float4(_70, 1.0f, _74, _73.y);
+ v = float4(_70, 0.0f, _74, 1.0f);
+ v = float4(_70, 1.0f, 1.0f, 1.0f);
+ float4 _79 = float4(_70, 1.0f, 0.0f, 1.0f);
+ v = _79;
+ float4 _84 = float4(1.0f, _79.yzw);
+ v = _84;
+ float2 _85 = _84.yz;
+ float _86 = _85.x;
+ v = float4(0.0f, _86, _85.y, 1.0f);
+ v = float4(0.0f, _86, 1.0f, 1.0f);
+ float4 _90 = float4(1.0f, _86, 1.0f, 1.0f);
+ v = _90;
+ float2 _91 = _90.zw;
+ float _92 = _91.x;
+ v = float4(0.0f, 0.0f, _92, _91.y);
+ v = float4(0.0f, 0.0f, _92, 1.0f);
+ v = float4(0.0f, 1.0f, 1.0f, 1.0f);
+ float4 _97 = 0.0f.xxxx;
+ if (true)
+ {
+ _97 = _10_colorGreen;
+ }
+ else
+ {
+ _97 = _10_colorRed;
+ }
+ return _97;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleLTRB.hlsl b/tests/sksl/shared/SwizzleLTRB.hlsl
new file mode 100644
index 0000000..d92f29e
--- /dev/null
+++ b/tests/sksl/shared/SwizzleLTRB.hlsl
@@ -0,0 +1,31 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorRed : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_colorRed.zwyx;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleOpt.hlsl b/tests/sksl/shared/SwizzleOpt.hlsl
new file mode 100644
index 0000000..8682952
--- /dev/null
+++ b/tests/sksl/shared/SwizzleOpt.hlsl
@@ -0,0 +1,95 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorRed : packoffset(c0);
+ float4 _11_colorGreen : packoffset(c1);
+ float4 _11_testInputs : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float fn_hh4(float4 _26)
+{
+ for (int x = 1; x <= 2; x++)
+ {
+ return _26.x;
+ }
+}
+
+float4 main(float2 _45)
+{
+ float4 v = _11_testInputs;
+ float4 _56 = float4(0.0f, _11_testInputs.zyx);
+ v = _56;
+ float4 _60 = float4(0.0f, 0.0f, _56.xw);
+ v = _60;
+ float4 _65 = float4(1.0f, 1.0f, _60.wx);
+ v = _65;
+ float4 _69 = float4(_65.zy, 1.0f, 1.0f);
+ v = _69;
+ float4 _73 = float4(_69.xx, 1.0f, 1.0f);
+ v = _73;
+ float4 _74 = _73.wzwz;
+ v = _74;
+ float4 _75 = _74;
+ float4 _80 = float3(fn_hh4(_75), 123.0f, 456.0f).yyzz;
+ v = _80;
+ float4 _81 = _80;
+ float4 _84 = float3(fn_hh4(_81), 123.0f, 456.0f).yyzz;
+ v = _84;
+ float4 _85 = _84;
+ float4 _87 = float4(123.0f, 456.0f, 456.0f, fn_hh4(_85));
+ v = _87;
+ float4 _88 = _87;
+ float4 _90 = float4(123.0f, 456.0f, 456.0f, fn_hh4(_88));
+ v = _90;
+ float4 _91 = _90;
+ float4 _94 = float3(fn_hh4(_91), 123.0f, 456.0f).yxxz;
+ v = _94;
+ float4 _95 = _94;
+ v = float3(fn_hh4(_95), 123.0f, 456.0f).yxxz;
+ v = float4(1.0f, 1.0f, 2.0f, 3.0f);
+ v = float4(_11_colorRed.xyz, 1.0f);
+ float4 _118 = float4(_11_colorRed.x, 1.0f, _11_colorRed.yz);
+ v = _118;
+ float4 _119 = v;
+ float4 _120 = float4(_118.w, _118.z, _118.y, _118.x);
+ v = _120;
+ float2 _121 = _120.yz;
+ float4 _122 = v;
+ float4 _123 = float4(_121.x, _122.y, _122.z, _121.y);
+ v = _123;
+ float3 _127 = float3(_123.ww, 1.0f);
+ float4 _128 = v;
+ float4 _129 = float4(_127.z, _127.y, _127.x, _128.w);
+ v = _129;
+ float4 _134 = 0.0f.xxxx;
+ if (all(bool4(_129.x == 1.0f.xxxx.x, _129.y == 1.0f.xxxx.y, _129.z == 1.0f.xxxx.z, _129.w == 1.0f.xxxx.w)))
+ {
+ _134 = _11_colorGreen;
+ }
+ else
+ {
+ _134 = _11_colorRed;
+ }
+ return _134;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleScalar.hlsl b/tests/sksl/shared/SwizzleScalar.hlsl
new file mode 100644
index 0000000..f0f2d0d
--- /dev/null
+++ b/tests/sksl/shared/SwizzleScalar.hlsl
@@ -0,0 +1,36 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float4 h4 = _10_unknownInput.xxxx;
+ h4 = float4(_10_unknownInput.xx, 0.0f, 1.0f);
+ h4 = float4(0.0f, _10_unknownInput, 1.0f, 0.0f);
+ float4 _48 = float4(0.0f, _10_unknownInput, 0.0f, _10_unknownInput);
+ h4 = _48;
+ return _48;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleScalarBool.hlsl b/tests/sksl/shared/SwizzleScalarBool.hlsl
new file mode 100644
index 0000000..8e7ec38
--- /dev/null
+++ b/tests/sksl/shared/SwizzleScalarBool.hlsl
@@ -0,0 +1,38 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool _33 = _10_unknownInput != 0.0f;
+ bool b = _33;
+ bool4 b4 = _33.xxxx;
+ b4 = bool4(_33.xx, false, true);
+ b4 = bool4(false, _33, true, false);
+ bool4 _46 = bool4(false, _33, false, _33);
+ b4 = _46;
+ return float4(float(false), float(_46.y), float(_46.z), float(_46.w));
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/SwizzleScalarInt.hlsl b/tests/sksl/shared/SwizzleScalarInt.hlsl
new file mode 100644
index 0000000..07f7ff8
--- /dev/null
+++ b/tests/sksl/shared/SwizzleScalarInt.hlsl
@@ -0,0 +1,38 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ int _33 = int(_10_unknownInput);
+ int i = _33;
+ int4 i4 = _33.xxxx;
+ i4 = int4(_33.xx, 0, 1);
+ i4 = int4(0, _33, 1, 0);
+ int4 _45 = int4(0, _33, 0, _33);
+ i4 = _45;
+ return float4(float(0), float(_45.y), float(_45.z), float(_45.w));
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl b/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl
new file mode 100644
index 0000000..cb8be58
--- /dev/null
+++ b/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl
@@ -0,0 +1,27 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float r = 0.0f;
+ float g = 1.0f;
+ return float4(0.0f, 1.0f, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl b/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl
new file mode 100644
index 0000000..4e0e5f6
--- /dev/null
+++ b/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl
@@ -0,0 +1,34 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_unknownInput : packoffset(c0);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ float _35 = 1.0f - _10_unknownInput;
+ float r = _35;
+ float g = _10_unknownInput;
+ return float4(_35, _10_unknownInput, 0.0f, 1.0f);
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/TernaryExpression.hlsl b/tests/sksl/shared/TernaryExpression.hlsl
new file mode 100644
index 0000000..f40edd7
--- /dev/null
+++ b/tests/sksl/shared/TernaryExpression.hlsl
@@ -0,0 +1,62 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool ok = true;
+ bool _41 = false;
+ if (true)
+ {
+ _41 = (_10_colorGreen.y == 1.0f) ? true : false;
+ }
+ else
+ {
+ _41 = false;
+ }
+ ok = _41;
+ bool _49 = false;
+ if (_41)
+ {
+ _49 = (_10_colorGreen.x == 1.0f) ? false : true;
+ }
+ else
+ {
+ _49 = false;
+ }
+ ok = _49;
+ float4 _50 = 0.0f.xxxx;
+ if (_49)
+ {
+ _50 = _10_colorGreen;
+ }
+ else
+ {
+ _50 = _10_colorRed;
+ }
+ return _50;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Texture1D.hlsl b/tests/sksl/shared/Texture1D.hlsl
new file mode 100644
index 0000000..7be07a6
--- /dev/null
+++ b/tests/sksl/shared/Texture1D.hlsl
@@ -0,0 +1,71 @@
+### Compilation failed:
+
+error: SPIR-V validation error: Operand 3 of TypeImage requires one of these capabilities: Sampled1D Image1D
+ %13 = OpTypeImage %float 1D 0 0 0 1 Unknown
+
+OpCapability Shader
+%1 = OpExtInstImport "GLSL.std.450"
+OpMemoryModel Logical GLSL450
+OpEntryPoint Fragment %main "main" %sk_FragColor %sk_Clockwise
+OpExecutionMode %main OriginUpperLeft
+OpName %sk_FragColor "sk_FragColor"
+OpName %sk_Clockwise "sk_Clockwise"
+OpName %tex "tex"
+OpName %main "main"
+OpName %a "a"
+OpName %b "b"
+OpDecorate %sk_FragColor RelaxedPrecision
+OpDecorate %sk_FragColor Location 0
+OpDecorate %sk_FragColor Index 0
+OpDecorate %sk_Clockwise BuiltIn FrontFacing
+OpDecorate %tex RelaxedPrecision
+OpDecorate %tex Binding 0
+OpDecorate %tex DescriptorSet 0
+OpDecorate %20 RelaxedPrecision
+OpDecorate %24 RelaxedPrecision
+OpDecorate %29 RelaxedPrecision
+OpDecorate %30 RelaxedPrecision
+OpDecorate %33 RelaxedPrecision
+OpDecorate %34 RelaxedPrecision
+OpDecorate %35 RelaxedPrecision
+%float = OpTypeFloat 32
+%v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%sk_FragColor = OpVariable %_ptr_Output_v4float Output
+%bool = OpTypeBool
+%_ptr_Input_bool = OpTypePointer Input %bool
+%sk_Clockwise = OpVariable %_ptr_Input_bool Input
+%13 = OpTypeImage %float 1D 0 0 0 1 Unknown
+%12 = OpTypeSampledImage %13
+%_ptr_UniformConstant_12 = OpTypePointer UniformConstant %12
+%tex = OpVariable %_ptr_UniformConstant_12 UniformConstant
+%void = OpTypeVoid
+%15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%float_0 = OpConstant %float 0
+%v2float = OpTypeVector %float 2
+%26 = OpConstantComposite %v2float %float_0 %float_0
+%main = OpFunction %void None %15
+%16 = OpLabel
+%a = OpVariable %_ptr_Function_v4float Function
+%b = OpVariable %_ptr_Function_v4float Function
+%20 = OpLoad %12 %tex
+%19 = OpImageSampleImplicitLod %v4float %20 %float_0
+OpStore %a %19
+%24 = OpLoad %12 %tex
+%23 = OpImageSampleProjImplicitLod %v4float %24 %26
+OpStore %b %23
+%27 = OpLoad %v4float %a
+%28 = OpVectorShuffle %v2float %27 %27 0 1
+%29 = OpCompositeExtract %float %28 0
+%30 = OpCompositeExtract %float %28 1
+%31 = OpLoad %v4float %b
+%32 = OpVectorShuffle %v2float %31 %31 2 3
+%33 = OpCompositeExtract %float %32 0
+%34 = OpCompositeExtract %float %32 1
+%35 = OpCompositeConstruct %v4float %29 %30 %33 %34
+OpStore %sk_FragColor %35
+OpReturn
+OpFunctionEnd
+
+1 error
diff --git a/tests/sksl/shared/Texture2D.hlsl b/tests/sksl/shared/Texture2D.hlsl
new file mode 100644
index 0000000..1163521
--- /dev/null
+++ b/tests/sksl/shared/Texture2D.hlsl
@@ -0,0 +1,26 @@
+Texture2D<float4> tex : register(t0, space0);
+SamplerState _tex_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _19 = tex.Sample(_tex_sampler, 0.0f.xx);
+ float4 a = _19;
+ float4 _25 = tex.Sample(_tex_sampler, 0.0f.xxx.xy / 0.0f.xxx.z);
+ float4 b = _25;
+ sk_FragColor = float4(_19.xy, _25.zw);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/TextureSharpen.hlsl b/tests/sksl/shared/TextureSharpen.hlsl
new file mode 100644
index 0000000..b79e83d
--- /dev/null
+++ b/tests/sksl/shared/TextureSharpen.hlsl
@@ -0,0 +1,26 @@
+Texture2D<float4> s : register(t0, space0);
+SamplerState _s_sampler : register(s0, space0);
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ float4 _19 = s.SampleBias(_s_sampler, 0.0f.xx, -0.4749999940395355224609375f);
+ float4 a = _19;
+ float4 _26 = s.SampleBias(_s_sampler, 0.0f.xxx.xy / 0.0f.xxx.z, -0.4749999940395355224609375f);
+ float4 b = _26;
+ sk_FragColor = float4(_19.xy, _26.xy);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/UnaryPositiveNegative.hlsl b/tests/sksl/shared/UnaryPositiveNegative.hlsl
new file mode 100644
index 0000000..e96dd15
--- /dev/null
+++ b/tests/sksl/shared/UnaryPositiveNegative.hlsl
@@ -0,0 +1,161 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _16_colorWhite : packoffset(c0);
+ float4 _16_colorGreen : packoffset(c1);
+ float4 _16_colorRed : packoffset(c2);
+ row_major float2x2 _16_testMatrix2x2 : packoffset(c3);
+ row_major float3x3 _16_testMatrix3x3 : packoffset(c5);
+ row_major float4x4 _16_testMatrix4x4 : packoffset(c8);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_iscalar_b()
+{
+ int _43 = int(_16_colorWhite.x);
+ int x = _43;
+ int _44 = -_43;
+ x = _44;
+ return _44 == (-1);
+}
+
+bool test_fvec_b()
+{
+ float2 x = _16_colorWhite.xy;
+ float2 _52 = -_16_colorWhite.xy;
+ x = _52;
+ return all(bool2(_52.x == (-1.0f).xx.x, _52.y == (-1.0f).xx.y));
+}
+
+bool test_ivec_b()
+{
+ int2 _66 = int(_16_colorWhite.x).xx;
+ int2 x = _66;
+ int2 _67 = -_66;
+ x = _67;
+ return all(bool2(_67.x == int2(-1, -1).x, _67.y == int2(-1, -1).y));
+}
+
+bool test_mat2_b()
+{
+ float2x2 negated = float2x2(float2(-1.0f, -2.0f), float2(-3.0f, -4.0f));
+ float2x2 x = _16_testMatrix2x2;
+ float2 _86 = -_16_testMatrix2x2[0];
+ float2 _88 = -_16_testMatrix2x2[1];
+ x = float2x2(_86, _88);
+ return all(bool2(_86.x == float2(-1.0f, -2.0f).x, _86.y == float2(-1.0f, -2.0f).y)) && all(bool2(_88.x == float2(-3.0f, -4.0f).x, _88.y == float2(-3.0f, -4.0f).y));
+}
+
+bool test_mat3_b()
+{
+ float3x3 negated = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
+ float3x3 x = _16_testMatrix3x3;
+ float3 _113 = -_16_testMatrix3x3[0];
+ float3 _115 = -_16_testMatrix3x3[1];
+ float3 _117 = -_16_testMatrix3x3[2];
+ x = float3x3(_113, _115, _117);
+ return (all(bool3(_113.x == float3(-1.0f, -2.0f, -3.0f).x, _113.y == float3(-1.0f, -2.0f, -3.0f).y, _113.z == float3(-1.0f, -2.0f, -3.0f).z)) && all(bool3(_115.x == float3(-4.0f, -5.0f, -6.0f).x, _115.y == float3(-4.0f, -5.0f, -6.0f).y, _115.z == float3(-4.0f, -5.0f, -6.0f).z))) && all(bool3(_117.x == float3(-7.0f, -8.0f, -9.0f).x, _117.y == float3(-7.0f, -8.0f, -9.0f).y, _117.z == float3(-7.0f, -8.0f, -9.0f).z));
+}
+
+bool test_mat4_b()
+{
+ float4x4 negated = float4x4(float4(-1.0f, -2.0f, -3.0f, -4.0f), float4(-5.0f, -6.0f, -7.0f, -8.0f), float4(-9.0f, -10.0f, -11.0f, -12.0f), float4(-13.0f, -14.0f, -15.0f, -16.0f));
+ float4x4 x = _16_testMatrix4x4;
+ float4 _149 = -_16_testMatrix4x4[0];
+ float4 _151 = -_16_testMatrix4x4[1];
+ float4 _153 = -_16_testMatrix4x4[2];
+ float4 _155 = -_16_testMatrix4x4[3];
+ x = float4x4(_149, _151, _153, _155);
+ return ((all(bool4(_149.x == float4(-1.0f, -2.0f, -3.0f, -4.0f).x, _149.y == float4(-1.0f, -2.0f, -3.0f, -4.0f).y, _149.z == float4(-1.0f, -2.0f, -3.0f, -4.0f).z, _149.w == float4(-1.0f, -2.0f, -3.0f, -4.0f).w)) && all(bool4(_151.x == float4(-5.0f, -6.0f, -7.0f, -8.0f).x, _151.y == float4(-5.0f, -6.0f, -7.0f, -8.0f).y, _151.z == float4(-5.0f, -6.0f, -7.0f, -8.0f).z, _151.w == float4(-5.0f, -6.0f, -7.0f, -8.0f).w))) && all(bool4(_153.x == float4(-9.0f, -10.0f, -11.0f, -12.0f).x, _153.y == float4(-9.0f, -10.0f, -11.0f, -12.0f).y, _153.z == float4(-9.0f, -10.0f, -11.0f, -12.0f).z, _153.w == float4(-9.0f, -10.0f, -11.0f, -12.0f).w))) && all(bool4(_155.x == float4(-13.0f, -14.0f, -15.0f, -16.0f).x, _155.y == float4(-13.0f, -14.0f, -15.0f, -16.0f).y, _155.z == float4(-13.0f, -14.0f, -15.0f, -16.0f).z, _155.w == float4(-13.0f, -14.0f, -15.0f, -16.0f).w));
+}
+
+float4 main(float2 _170)
+{
+ float _RESERVED_IDENTIFIER_FIXUP_0_x = _16_colorWhite.x;
+ float _177 = -_16_colorWhite.x;
+ _RESERVED_IDENTIFIER_FIXUP_0_x = _177;
+ bool _183 = false;
+ if (_177 == (-1.0f))
+ {
+ _183 = test_iscalar_b();
+ }
+ else
+ {
+ _183 = false;
+ }
+ bool _187 = false;
+ if (_183)
+ {
+ _187 = test_fvec_b();
+ }
+ else
+ {
+ _187 = false;
+ }
+ bool _191 = false;
+ if (_187)
+ {
+ _191 = test_ivec_b();
+ }
+ else
+ {
+ _191 = false;
+ }
+ bool _195 = false;
+ if (_191)
+ {
+ _195 = test_mat2_b();
+ }
+ else
+ {
+ _195 = false;
+ }
+ bool _199 = false;
+ if (_195)
+ {
+ _199 = test_mat3_b();
+ }
+ else
+ {
+ _199 = false;
+ }
+ bool _203 = false;
+ if (_199)
+ {
+ _203 = test_mat4_b();
+ }
+ else
+ {
+ _203 = false;
+ }
+ float4 _204 = 0.0f.xxxx;
+ if (_203)
+ {
+ _204 = _16_colorGreen;
+ }
+ else
+ {
+ _204 = _16_colorRed;
+ }
+ return _204;
+}
+
+void frag_main()
+{
+ float2 _30 = 0.0f.xx;
+ sk_FragColor = main(_30);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/UniformArray.hlsl b/tests/sksl/shared/UniformArray.hlsl
new file mode 100644
index 0000000..9f55b50
--- /dev/null
+++ b/tests/sksl/shared/UniformArray.hlsl
@@ -0,0 +1,40 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_testArray[5] : packoffset(c0);
+ float4 _10_colorGreen : packoffset(c5);
+ float4 _10_colorRed : packoffset(c6);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _27)
+{
+ for (int index = 0; index < 5; index++)
+ {
+ if (_10_testArray[index] != float(index + 1))
+ {
+ return _10_colorRed;
+ }
+ }
+ return _10_colorGreen;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/UniformBuffers.hlsl b/tests/sksl/shared/UniformBuffers.hlsl
new file mode 100644
index 0000000..54dd8fc
--- /dev/null
+++ b/tests/sksl/shared/UniformBuffers.hlsl
@@ -0,0 +1,28 @@
+cbuffer testBlock : register(b0, space0)
+{
+ float _3_x : packoffset(c0);
+ int _3_w : packoffset(c0.y);
+ float _3_y[2] : packoffset(c1);
+ row_major float3x3 _3_z : packoffset(c3);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+void frag_main()
+{
+ sk_FragColor = float4(_3_x, _3_y[0], _3_y[1], 0.0f);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/UniformMatrixResize.hlsl b/tests/sksl/shared/UniformMatrixResize.hlsl
new file mode 100644
index 0000000..d3d84c5
--- /dev/null
+++ b/tests/sksl/shared/UniformMatrixResize.hlsl
@@ -0,0 +1,50 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ row_major float3x3 _11_testMatrix3x3 : packoffset(c0);
+ float4 _11_colorGreen : packoffset(c3);
+ float4 _11_colorRed : packoffset(c4);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float2x2 resizeMatrix_f22()
+{
+ return float2x2(_11_testMatrix3x3[0].xy, _11_testMatrix3x3[1].xy);
+}
+
+float4 main(float2 _41)
+{
+ float2x2 _43 = resizeMatrix_f22();
+ float2 _51 = _43[0];
+ float2 _54 = _43[1];
+ float4 _58 = 0.0f.xxxx;
+ if (all(bool2(_51.x == float2(1.0f, 2.0f).x, _51.y == float2(1.0f, 2.0f).y)) && all(bool2(_54.x == float2(4.0f, 5.0f).x, _54.y == float2(4.0f, 5.0f).y)))
+ {
+ _58 = _11_colorGreen;
+ }
+ else
+ {
+ _58 = _11_colorRed;
+ }
+ return _58;
+}
+
+void frag_main()
+{
+ float2 _23 = 0.0f.xx;
+ sk_FragColor = main(_23);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/Uniforms.hlsl b/tests/sksl/shared/Uniforms.hlsl
new file mode 100644
index 0000000..04f3e59
--- /dev/null
+++ b/tests/sksl/shared/Uniforms.hlsl
@@ -0,0 +1,32 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float _10_myHalf : packoffset(c0);
+ float4 _10_myHalf4 : packoffset(c1);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ return _10_myHalf4 * _10_myHalf;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/UnusedVariables.hlsl b/tests/sksl/shared/UnusedVariables.hlsl
new file mode 100644
index 0000000..b99a0f4
--- /dev/null
+++ b/tests/sksl/shared/UnusedVariables.hlsl
@@ -0,0 +1,48 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float userfunc_ff(float _23)
+{
+ return _23 + 1.0f;
+}
+
+float4 main(float2 _29)
+{
+ float b = 2.0f;
+ float c = 3.0f;
+ b = 2.0f;
+ b = 3.0f + 77.0f;
+ b = sin(3.0f + 77.0f);
+ float _40 = 3.0f + 77.0f;
+ float _43 = 3.0f + 77.0f;
+ b = userfunc_ff(_43);
+ float _45 = cos(3.0f);
+ b = _45;
+ b = _45;
+ for (int x = 0; x < 1; x++)
+ {
+ }
+ float d = c;
+ b = 3.0f;
+ float _62 = c + 1.0f;
+ d = _62;
+ return float4(float(3.0f == 2.0f), float(true), float(_62 == 5.0f), float(_62 == 4.0f));
+}
+
+void frag_main()
+{
+ float2 _18 = 0.0f.xx;
+ sk_FragColor = main(_18);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/VectorConstructors.hlsl b/tests/sksl/shared/VectorConstructors.hlsl
new file mode 100644
index 0000000..72860af
--- /dev/null
+++ b/tests/sksl/shared/VectorConstructors.hlsl
@@ -0,0 +1,84 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorGreen : packoffset(c0);
+ float4 _11_colorRed : packoffset(c1);
+ float _11_unknownInput : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool check_bf2f2f2f3i2i2f2f2f4i2b4f2f2f2b2b2b3(float2 _37, float2 _38, float2 _39, float3 _40, int2 _41, int2 _42, float2 _43, float2 _44, float4 _45, int2 _46, bool4 _47, float2 _48, float2 _49, float2 _50, bool2 _51, bool2 _52, bool3 _53)
+{
+ return ((((((((((((((((_37.x + _38.x) + _39.x) + _40.x) + float(_41.x)) + float(_42.x)) + _43.x) + _44.x) + _45.x) + float(_46.x)) + float(_47.x)) + _48.x) + _49.x) + _50.x) + float(_51.x)) + float(_52.x)) + float(_53.x)) == 17.0f;
+}
+
+float4 main(float2 _116)
+{
+ float2 v1 = 1.0f.xx;
+ float2 v2 = float2(1.0f, 2.0f);
+ float2 v3 = 1.0f.xx;
+ float3 v4 = 1.0f.xxx;
+ int2 v5 = int2(1, 1);
+ int2 v6 = int2(1, 2);
+ float2 v7 = float2(1.0f, 2.0f);
+ float2 _136 = float2(float(1), float(1));
+ float2 v8 = _136;
+ float4 _144 = float4(float(1), _11_unknownInput, 3.0f, 4.0f);
+ float4 v9 = _144;
+ int2 _148 = int2(3, int(1.0f));
+ int2 v10 = _148;
+ bool4 v11 = bool4(true, false, true, false);
+ float2 v12 = float2(1.0f, 0.0f);
+ float2 v13 = 0.0f.xx;
+ float2 v14 = 0.0f.xx;
+ bool2 v15 = bool2(true, true);
+ bool2 v16 = bool2(true, true);
+ bool3 v17 = bool3(true, true, true);
+ float2 _162 = 1.0f.xx;
+ float2 _163 = float2(1.0f, 2.0f);
+ float2 _164 = 1.0f.xx;
+ float3 _165 = 1.0f.xxx;
+ int2 _166 = int2(1, 1);
+ int2 _167 = int2(1, 2);
+ float2 _168 = float2(1.0f, 2.0f);
+ float2 _169 = _136;
+ float4 _170 = _144;
+ int2 _171 = _148;
+ bool4 _172 = bool4(true, false, true, false);
+ float2 _173 = float2(1.0f, 0.0f);
+ float2 _174 = 0.0f.xx;
+ float2 _175 = 0.0f.xx;
+ bool2 _176 = bool2(true, true);
+ bool2 _177 = bool2(true, true);
+ bool3 _178 = bool3(true, true, true);
+ float4 _180 = 0.0f.xxxx;
+ if (check_bf2f2f2f3i2i2f2f2f4i2b4f2f2f2b2b2b3(_162, _163, _164, _165, _166, _167, _168, _169, _170, _171, _172, _173, _174, _175, _176, _177, _178))
+ {
+ _180 = _11_colorGreen;
+ }
+ else
+ {
+ _180 = _11_colorRed;
+ }
+ return _180;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/VectorScalarMath.hlsl b/tests/sksl/shared/VectorScalarMath.hlsl
new file mode 100644
index 0000000..4bb7c7c
--- /dev/null
+++ b/tests/sksl/shared/VectorScalarMath.hlsl
@@ -0,0 +1,440 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _11_colorRed : packoffset(c0);
+ float4 _11_colorGreen : packoffset(c1);
+ float _11_unknownInput : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+bool test_int_b()
+{
+ bool ok = true;
+ int4 _45 = int4(int(_11_colorRed.x), int(_11_colorRed.y), int(_11_colorRed.z), int(_11_colorRed.w));
+ int4 inputRed = _45;
+ int4 _58 = int4(int(_11_colorGreen.x), int(_11_colorGreen.y), int(_11_colorGreen.z), int(_11_colorGreen.w));
+ int4 inputGreen = _58;
+ int4 _62 = _45 + int4(2, 2, 2, 2);
+ int4 x = _62;
+ bool _71 = false;
+ if (true)
+ {
+ _71 = all(bool4(_62.x == int4(3, 2, 2, 3).x, _62.y == int4(3, 2, 2, 3).y, _62.z == int4(3, 2, 2, 3).z, _62.w == int4(3, 2, 2, 3).w));
+ }
+ else
+ {
+ _71 = false;
+ }
+ ok = _71;
+ int4 _73 = _58.ywxz - int4(2, 2, 2, 2);
+ x = _73;
+ bool _81 = false;
+ if (_71)
+ {
+ _81 = all(bool4(_73.x == int4(-1, -1, -2, -2).x, _73.y == int4(-1, -1, -2, -2).y, _73.z == int4(-1, -1, -2, -2).z, _73.w == int4(-1, -1, -2, -2).w));
+ }
+ else
+ {
+ _81 = false;
+ }
+ ok = _81;
+ int4 _84 = _45 + _58.y.xxxx;
+ x = _84;
+ bool _90 = false;
+ if (_81)
+ {
+ _90 = all(bool4(_84.x == int4(2, 1, 1, 2).x, _84.y == int4(2, 1, 1, 2).y, _84.z == int4(2, 1, 1, 2).z, _84.w == int4(2, 1, 1, 2).w));
+ }
+ else
+ {
+ _90 = false;
+ }
+ ok = _90;
+ int3 _95 = _58.wyw * int3(9, 9, 9);
+ int4 _96 = x;
+ int4 _97 = int4(_95.x, _95.y, _95.z, _96.w);
+ x = _97;
+ bool _103 = false;
+ if (_90)
+ {
+ _103 = all(bool4(_97.x == int4(9, 9, 9, 2).x, _97.y == int4(9, 9, 9, 2).y, _97.z == int4(9, 9, 9, 2).z, _97.w == int4(9, 9, 9, 2).w));
+ }
+ else
+ {
+ _103 = false;
+ }
+ ok = _103;
+ int2 _108 = _97.zw / int2(4, 4);
+ int4 _109 = x;
+ int4 _110 = int4(_108.x, _108.y, _109.z, _109.w);
+ x = _110;
+ bool _116 = false;
+ if (_103)
+ {
+ _116 = all(bool4(_110.x == int4(2, 0, 9, 2).x, _110.y == int4(2, 0, 9, 2).y, _110.z == int4(2, 0, 9, 2).z, _110.w == int4(2, 0, 9, 2).w));
+ }
+ else
+ {
+ _116 = false;
+ }
+ ok = _116;
+ int4 _120 = (_45 * int4(5, 5, 5, 5)).yxwz;
+ x = _120;
+ bool _126 = false;
+ if (_116)
+ {
+ _126 = all(bool4(_120.x == int4(0, 5, 5, 0).x, _120.y == int4(0, 5, 5, 0).y, _120.z == int4(0, 5, 5, 0).z, _120.w == int4(0, 5, 5, 0).w));
+ }
+ else
+ {
+ _126 = false;
+ }
+ ok = _126;
+ int4 _127 = int4(2, 2, 2, 2) + _45;
+ x = _127;
+ bool _132 = false;
+ if (_126)
+ {
+ _132 = all(bool4(_127.x == int4(3, 2, 2, 3).x, _127.y == int4(3, 2, 2, 3).y, _127.z == int4(3, 2, 2, 3).z, _127.w == int4(3, 2, 2, 3).w));
+ }
+ else
+ {
+ _132 = false;
+ }
+ ok = _132;
+ int4 _136 = int4(10, 10, 10, 10) - _58.ywxz;
+ x = _136;
+ bool _142 = false;
+ if (_132)
+ {
+ _142 = all(bool4(_136.x == int4(9, 9, 10, 10).x, _136.y == int4(9, 9, 10, 10).y, _136.z == int4(9, 9, 10, 10).z, _136.w == int4(9, 9, 10, 10).w));
+ }
+ else
+ {
+ _142 = false;
+ }
+ ok = _142;
+ int4 _145 = _45.x.xxxx + _58;
+ x = _145;
+ bool _151 = false;
+ if (_142)
+ {
+ _151 = all(bool4(_145.x == int4(1, 2, 1, 2).x, _145.y == int4(1, 2, 1, 2).y, _145.z == int4(1, 2, 1, 2).z, _145.w == int4(1, 2, 1, 2).w));
+ }
+ else
+ {
+ _151 = false;
+ }
+ ok = _151;
+ int3 _155 = int3(8, 8, 8) * _58.wyw;
+ int4 _156 = x;
+ int4 _157 = int4(_155.x, _155.y, _155.z, _156.w);
+ x = _157;
+ bool _163 = false;
+ if (_151)
+ {
+ _163 = all(bool4(_157.x == int4(8, 8, 8, 2).x, _157.y == int4(8, 8, 8, 2).y, _157.z == int4(8, 8, 8, 2).z, _157.w == int4(8, 8, 8, 2).w));
+ }
+ else
+ {
+ _163 = false;
+ }
+ ok = _163;
+ int2 _167 = int2(36, 36) / _157.zw;
+ int4 _168 = x;
+ int4 _169 = int4(_167.x, _167.y, _168.z, _168.w);
+ x = _169;
+ bool _176 = false;
+ if (_163)
+ {
+ _176 = all(bool4(_169.x == int4(4, 18, 8, 2).x, _169.y == int4(4, 18, 8, 2).y, _169.z == int4(4, 18, 8, 2).z, _169.w == int4(4, 18, 8, 2).w));
+ }
+ else
+ {
+ _176 = false;
+ }
+ ok = _176;
+ int4 _180 = (int4(37, 37, 37, 37) / _169).yxwz;
+ x = _180;
+ bool _186 = false;
+ if (_176)
+ {
+ _186 = all(bool4(_180.x == int4(2, 9, 18, 4).x, _180.y == int4(2, 9, 18, 4).y, _180.z == int4(2, 9, 18, 4).z, _180.w == int4(2, 9, 18, 4).w));
+ }
+ else
+ {
+ _186 = false;
+ }
+ ok = _186;
+ int4 _187 = _180 + int4(2, 2, 2, 2);
+ x = _187;
+ int4 _188 = _187 * int4(2, 2, 2, 2);
+ x = _188;
+ int4 _190 = _188 - int4(4, 4, 4, 4);
+ x = _190;
+ int4 _191 = _190 / int4(2, 2, 2, 2);
+ x = _191;
+ bool _196 = false;
+ if (_186)
+ {
+ _196 = all(bool4(_191.x == int4(2, 9, 18, 4).x, _191.y == int4(2, 9, 18, 4).y, _191.z == int4(2, 9, 18, 4).z, _191.w == int4(2, 9, 18, 4).w));
+ }
+ else
+ {
+ _196 = false;
+ }
+ ok = _196;
+ int4 _197 = _191 + int4(2, 2, 2, 2);
+ x = _197;
+ int4 _198 = _197 * int4(2, 2, 2, 2);
+ x = _198;
+ int4 _199 = _198 - int4(4, 4, 4, 4);
+ x = _199;
+ int4 _200 = _199 / int4(2, 2, 2, 2);
+ x = _200;
+ bool _205 = false;
+ if (_196)
+ {
+ _205 = all(bool4(_200.x == int4(2, 9, 18, 4).x, _200.y == int4(2, 9, 18, 4).y, _200.z == int4(2, 9, 18, 4).z, _200.w == int4(2, 9, 18, 4).w));
+ }
+ else
+ {
+ _205 = false;
+ }
+ ok = _205;
+ return _205;
+}
+
+float4 main(float2 _207)
+{
+ bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
+ float4 _RESERVED_IDENTIFIER_FIXUP_1_inputRed = _11_colorRed;
+ float4 _RESERVED_IDENTIFIER_FIXUP_2_inputGreen = _11_colorGreen;
+ float4 _220 = _11_colorRed + 2.0f.xxxx;
+ float4 _RESERVED_IDENTIFIER_FIXUP_3_x = _220;
+ bool _227 = false;
+ if (true)
+ {
+ _227 = all(bool4(_220.x == float4(3.0f, 2.0f, 2.0f, 3.0f).x, _220.y == float4(3.0f, 2.0f, 2.0f, 3.0f).y, _220.z == float4(3.0f, 2.0f, 2.0f, 3.0f).z, _220.w == float4(3.0f, 2.0f, 2.0f, 3.0f).w));
+ }
+ else
+ {
+ _227 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _227;
+ float4 _229 = _11_colorGreen.ywxz - 2.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _229;
+ bool _237 = false;
+ if (_227)
+ {
+ _237 = all(bool4(_229.x == float4(-1.0f, -1.0f, -2.0f, -2.0f).x, _229.y == float4(-1.0f, -1.0f, -2.0f, -2.0f).y, _229.z == float4(-1.0f, -1.0f, -2.0f, -2.0f).z, _229.w == float4(-1.0f, -1.0f, -2.0f, -2.0f).w));
+ }
+ else
+ {
+ _237 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _237;
+ float4 _240 = _11_colorRed + _11_colorGreen.y.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _240;
+ bool _247 = false;
+ if (_237)
+ {
+ _247 = all(bool4(_240.x == float4(2.0f, 1.0f, 1.0f, 2.0f).x, _240.y == float4(2.0f, 1.0f, 1.0f, 2.0f).y, _240.z == float4(2.0f, 1.0f, 1.0f, 2.0f).z, _240.w == float4(2.0f, 1.0f, 1.0f, 2.0f).w));
+ }
+ else
+ {
+ _247 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _247;
+ float3 _251 = _11_colorGreen.wyw * 9.0f;
+ float4 _252 = _RESERVED_IDENTIFIER_FIXUP_3_x;
+ float4 _253 = float4(_251.x, _251.y, _251.z, _252.w);
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _253;
+ bool _259 = false;
+ if (_247)
+ {
+ _259 = all(bool4(_253.x == float4(9.0f, 9.0f, 9.0f, 2.0f).x, _253.y == float4(9.0f, 9.0f, 9.0f, 2.0f).y, _253.z == float4(9.0f, 9.0f, 9.0f, 2.0f).z, _253.w == float4(9.0f, 9.0f, 9.0f, 2.0f).w));
+ }
+ else
+ {
+ _259 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _259;
+ float2 _261 = _253.zw * 2.0f;
+ float4 _262 = _RESERVED_IDENTIFIER_FIXUP_3_x;
+ float4 _263 = float4(_261.x, _261.y, _262.z, _262.w);
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _263;
+ bool _271 = false;
+ if (_259)
+ {
+ _271 = all(bool4(_263.x == float4(18.0f, 4.0f, 9.0f, 2.0f).x, _263.y == float4(18.0f, 4.0f, 9.0f, 2.0f).y, _263.z == float4(18.0f, 4.0f, 9.0f, 2.0f).z, _263.w == float4(18.0f, 4.0f, 9.0f, 2.0f).w));
+ }
+ else
+ {
+ _271 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _271;
+ float4 _274 = (_11_colorRed * 5.0f).yxwz;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _274;
+ bool _280 = false;
+ if (_271)
+ {
+ _280 = all(bool4(_274.x == float4(0.0f, 5.0f, 5.0f, 0.0f).x, _274.y == float4(0.0f, 5.0f, 5.0f, 0.0f).y, _274.z == float4(0.0f, 5.0f, 5.0f, 0.0f).z, _274.w == float4(0.0f, 5.0f, 5.0f, 0.0f).w));
+ }
+ else
+ {
+ _280 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _280;
+ float4 _281 = 2.0f.xxxx + _11_colorRed;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _281;
+ bool _286 = false;
+ if (_280)
+ {
+ _286 = all(bool4(_281.x == float4(3.0f, 2.0f, 2.0f, 3.0f).x, _281.y == float4(3.0f, 2.0f, 2.0f, 3.0f).y, _281.z == float4(3.0f, 2.0f, 2.0f, 3.0f).z, _281.w == float4(3.0f, 2.0f, 2.0f, 3.0f).w));
+ }
+ else
+ {
+ _286 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _286;
+ float4 _290 = 10.0f.xxxx - _11_colorGreen.ywxz;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _290;
+ bool _296 = false;
+ if (_286)
+ {
+ _296 = all(bool4(_290.x == float4(9.0f, 9.0f, 10.0f, 10.0f).x, _290.y == float4(9.0f, 9.0f, 10.0f, 10.0f).y, _290.z == float4(9.0f, 9.0f, 10.0f, 10.0f).z, _290.w == float4(9.0f, 9.0f, 10.0f, 10.0f).w));
+ }
+ else
+ {
+ _296 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _296;
+ float4 _299 = _11_colorRed.x.xxxx + _11_colorGreen;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _299;
+ bool _305 = false;
+ if (_296)
+ {
+ _305 = all(bool4(_299.x == float4(1.0f, 2.0f, 1.0f, 2.0f).x, _299.y == float4(1.0f, 2.0f, 1.0f, 2.0f).y, _299.z == float4(1.0f, 2.0f, 1.0f, 2.0f).z, _299.w == float4(1.0f, 2.0f, 1.0f, 2.0f).w));
+ }
+ else
+ {
+ _305 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _305;
+ float3 _308 = _11_colorGreen.wyw * 8.0f;
+ float4 _309 = _RESERVED_IDENTIFIER_FIXUP_3_x;
+ float4 _310 = float4(_308.x, _308.y, _308.z, _309.w);
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _310;
+ bool _316 = false;
+ if (_305)
+ {
+ _316 = all(bool4(_310.x == float4(8.0f, 8.0f, 8.0f, 2.0f).x, _310.y == float4(8.0f, 8.0f, 8.0f, 2.0f).y, _310.z == float4(8.0f, 8.0f, 8.0f, 2.0f).z, _310.w == float4(8.0f, 8.0f, 8.0f, 2.0f).w));
+ }
+ else
+ {
+ _316 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _316;
+ float2 _320 = 32.0f.xx / _310.zw;
+ float4 _321 = _RESERVED_IDENTIFIER_FIXUP_3_x;
+ float4 _322 = float4(_320.x, _320.y, _321.z, _321.w);
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _322;
+ bool _329 = false;
+ if (_316)
+ {
+ _329 = all(bool4(_322.x == float4(4.0f, 16.0f, 8.0f, 2.0f).x, _322.y == float4(4.0f, 16.0f, 8.0f, 2.0f).y, _322.z == float4(4.0f, 16.0f, 8.0f, 2.0f).z, _322.w == float4(4.0f, 16.0f, 8.0f, 2.0f).w));
+ }
+ else
+ {
+ _329 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _329;
+ float4 _332 = (32.0f.xxxx / _322).yxwz;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _332;
+ bool _338 = false;
+ if (_329)
+ {
+ _338 = all(bool4(_332.x == float4(2.0f, 8.0f, 16.0f, 4.0f).x, _332.y == float4(2.0f, 8.0f, 16.0f, 4.0f).y, _332.z == float4(2.0f, 8.0f, 16.0f, 4.0f).z, _332.w == float4(2.0f, 8.0f, 16.0f, 4.0f).w));
+ }
+ else
+ {
+ _338 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _338;
+ float4 _339 = _332 + 2.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _339;
+ float4 _340 = _339 * 2.0f;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _340;
+ float4 _342 = _340 - 4.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _342;
+ float4 _344 = _342 * (1.0f / 2.0f);
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _344;
+ bool _349 = false;
+ if (_338)
+ {
+ _349 = all(bool4(_344.x == float4(2.0f, 8.0f, 16.0f, 4.0f).x, _344.y == float4(2.0f, 8.0f, 16.0f, 4.0f).y, _344.z == float4(2.0f, 8.0f, 16.0f, 4.0f).z, _344.w == float4(2.0f, 8.0f, 16.0f, 4.0f).w));
+ }
+ else
+ {
+ _349 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _349;
+ float4 _350 = _344 + 2.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _350;
+ float4 _351 = _350 * 2.0f;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _351;
+ float4 _352 = _351 - 4.0f.xxxx;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _352;
+ float4 _354 = _352 * 0.5f;
+ _RESERVED_IDENTIFIER_FIXUP_3_x = _354;
+ bool _359 = false;
+ if (_349)
+ {
+ _359 = all(bool4(_354.x == float4(2.0f, 8.0f, 16.0f, 4.0f).x, _354.y == float4(2.0f, 8.0f, 16.0f, 4.0f).y, _354.z == float4(2.0f, 8.0f, 16.0f, 4.0f).z, _354.w == float4(2.0f, 8.0f, 16.0f, 4.0f).w));
+ }
+ else
+ {
+ _359 = false;
+ }
+ _RESERVED_IDENTIFIER_FIXUP_0_ok = _359;
+ bool _363 = false;
+ if (_359)
+ {
+ _363 = test_int_b();
+ }
+ else
+ {
+ _363 = false;
+ }
+ float4 _364 = 0.0f.xxxx;
+ if (_363)
+ {
+ _364 = _11_colorGreen;
+ }
+ else
+ {
+ _364 = _11_colorRed;
+ }
+ return _364;
+}
+
+void frag_main()
+{
+ float2 _21 = 0.0f.xx;
+ sk_FragColor = main(_21);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/VectorToMatrixCast.hlsl b/tests/sksl/shared/VectorToMatrixCast.hlsl
new file mode 100644
index 0000000..bda499e
--- /dev/null
+++ b/tests/sksl/shared/VectorToMatrixCast.hlsl
@@ -0,0 +1,169 @@
+cbuffer _UniformBuffer : register(b0, space0)
+{
+ float4 _10_colorGreen : packoffset(c0);
+ float4 _10_colorRed : packoffset(c1);
+ float4 _10_testInputs : packoffset(c2);
+};
+
+
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _24)
+{
+ bool ok = true;
+ bool _57 = false;
+ if (true)
+ {
+ float2 _41 = float2(_10_testInputs.xy);
+ float2 _42 = float2(_10_testInputs.zw);
+ _57 = all(bool2(_41.x == float2(-1.25f, 0.0f).x, _41.y == float2(-1.25f, 0.0f).y)) && all(bool2(_42.x == float2(0.75f, 2.25f).x, _42.y == float2(0.75f, 2.25f).y));
+ }
+ else
+ {
+ _57 = false;
+ }
+ ok = _57;
+ bool _74 = false;
+ if (_57)
+ {
+ float2 _66 = float2(_10_testInputs.xy);
+ float2 _67 = float2(_10_testInputs.zw);
+ _74 = all(bool2(_66.x == float2(-1.25f, 0.0f).x, _66.y == float2(-1.25f, 0.0f).y)) && all(bool2(_67.x == float2(0.75f, 2.25f).x, _67.y == float2(0.75f, 2.25f).y));
+ }
+ else
+ {
+ _74 = false;
+ }
+ ok = _74;
+ bool _95 = false;
+ if (_74)
+ {
+ float2 _84 = float2(_10_colorGreen.xy);
+ float2 _85 = float2(_10_colorGreen.zw);
+ _95 = all(bool2(_84.x == float2(0.0f, 1.0f).x, _84.y == float2(0.0f, 1.0f).y)) && all(bool2(_85.x == float2(0.0f, 1.0f).x, _85.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _95 = false;
+ }
+ ok = _95;
+ bool _112 = false;
+ if (_95)
+ {
+ float2 _104 = float2(_10_colorGreen.xy);
+ float2 _105 = float2(_10_colorGreen.zw);
+ _112 = all(bool2(_104.x == float2(0.0f, 1.0f).x, _104.y == float2(0.0f, 1.0f).y)) && all(bool2(_105.x == float2(0.0f, 1.0f).x, _105.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _112 = false;
+ }
+ ok = _112;
+ bool _148 = false;
+ if (_112)
+ {
+ int4 _126 = int4(int(_10_colorGreen.x), int(_10_colorGreen.y), int(_10_colorGreen.z), int(_10_colorGreen.w));
+ float4 _135 = float4(float(_126.x), float(_126.y), float(_126.z), float(_126.w));
+ float2 _140 = float2(_135.xy);
+ float2 _141 = float2(_135.zw);
+ _148 = all(bool2(_140.x == float2(0.0f, 1.0f).x, _140.y == float2(0.0f, 1.0f).y)) && all(bool2(_141.x == float2(0.0f, 1.0f).x, _141.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _148 = false;
+ }
+ ok = _148;
+ bool _165 = false;
+ if (_148)
+ {
+ float2 _157 = float2(_10_colorGreen.xy);
+ float2 _158 = float2(_10_colorGreen.zw);
+ _165 = all(bool2(_157.x == float2(0.0f, 1.0f).x, _157.y == float2(0.0f, 1.0f).y)) && all(bool2(_158.x == float2(0.0f, 1.0f).x, _158.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _165 = false;
+ }
+ ok = _165;
+ bool _182 = false;
+ if (_165)
+ {
+ float2 _174 = float2(_10_colorGreen.xy);
+ float2 _175 = float2(_10_colorGreen.zw);
+ _182 = all(bool2(_174.x == float2(0.0f, 1.0f).x, _174.y == float2(0.0f, 1.0f).y)) && all(bool2(_175.x == float2(0.0f, 1.0f).x, _175.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _182 = false;
+ }
+ ok = _182;
+ bool _218 = false;
+ if (_182)
+ {
+ bool4 _196 = bool4(_10_colorGreen.x != 0.0f, _10_colorGreen.y != 0.0f, _10_colorGreen.z != 0.0f, _10_colorGreen.w != 0.0f);
+ float4 _205 = float4(float(_196.x), float(_196.y), float(_196.z), float(_196.w));
+ float2 _210 = float2(_205.xy);
+ float2 _211 = float2(_205.zw);
+ _218 = all(bool2(_210.x == float2(0.0f, 1.0f).x, _210.y == float2(0.0f, 1.0f).y)) && all(bool2(_211.x == float2(0.0f, 1.0f).x, _211.y == float2(0.0f, 1.0f).y));
+ }
+ else
+ {
+ _218 = false;
+ }
+ ok = _218;
+ bool _242 = false;
+ if (_218)
+ {
+ float4 _226 = _10_colorGreen - _10_colorRed;
+ float2 _231 = float2(_226.xy);
+ float2 _232 = float2(_226.zw);
+ _242 = all(bool2(_231.x == float2(-1.0f, 1.0f).x, _231.y == float2(-1.0f, 1.0f).y)) && all(bool2(_232.x == 0.0f.xx.x, _232.y == 0.0f.xx.y));
+ }
+ else
+ {
+ _242 = false;
+ }
+ ok = _242;
+ bool _265 = false;
+ if (_242)
+ {
+ float4 _249 = _10_colorGreen + 5.0f.xxxx;
+ float2 _254 = float2(_249.xy);
+ float2 _255 = float2(_249.zw);
+ _265 = all(bool2(_254.x == float2(5.0f, 6.0f).x, _254.y == float2(5.0f, 6.0f).y)) && all(bool2(_255.x == float2(5.0f, 6.0f).x, _255.y == float2(5.0f, 6.0f).y));
+ }
+ else
+ {
+ _265 = false;
+ }
+ ok = _265;
+ float4 _266 = 0.0f.xxxx;
+ if (_265)
+ {
+ _266 = _10_colorGreen;
+ }
+ else
+ {
+ _266 = _10_colorRed;
+ }
+ return _266;
+}
+
+void frag_main()
+{
+ float2 _20 = 0.0f.xx;
+ sk_FragColor = main(_20);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/VertexID.hlsl b/tests/sksl/shared/VertexID.hlsl
new file mode 100644
index 0000000..c8ad185
--- /dev/null
+++ b/tests/sksl/shared/VertexID.hlsl
@@ -0,0 +1,26 @@
+static int gl_VertexIndex;
+static int id;
+
+struct SPIRV_Cross_Input
+{
+ uint gl_VertexIndex : SV_VertexID;
+};
+
+struct SPIRV_Cross_Output
+{
+ int id : TEXCOORD1;
+};
+
+void vert_main()
+{
+ id = gl_VertexIndex;
+}
+
+SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
+{
+ gl_VertexIndex = int(stage_input.gl_VertexIndex);
+ vert_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.id = id;
+ return stage_output;
+}
diff --git a/tests/sksl/shared/WhileLoopControlFlow.hlsl b/tests/sksl/shared/WhileLoopControlFlow.hlsl
new file mode 100644
index 0000000..3dcb6d7
--- /dev/null
+++ b/tests/sksl/shared/WhileLoopControlFlow.hlsl
@@ -0,0 +1,43 @@
+static float4 sk_FragColor;
+
+struct SPIRV_Cross_Output
+{
+ float4 sk_FragColor : SV_Target0;
+};
+
+float4 main(float2 _21)
+{
+ float4 x = 1.0f.xxxx;
+ while (x.w == 1.0f)
+ {
+ x.x -= 0.25f;
+ if (x.x <= 0.0f)
+ {
+ break;
+ }
+ }
+ while (x.z > 0.0f)
+ {
+ x.z -= 0.25f;
+ if (x.w == 1.0f)
+ {
+ continue;
+ }
+ x.y = 0.0f;
+ }
+ return x;
+}
+
+void frag_main()
+{
+ float2 _17 = 0.0f.xx;
+ sk_FragColor = main(_17);
+}
+
+SPIRV_Cross_Output main()
+{
+ frag_main();
+ SPIRV_Cross_Output stage_output;
+ stage_output.sk_FragColor = sk_FragColor;
+ return stage_output;
+}
diff --git a/tools/skslc/BUILD.bazel b/tools/skslc/BUILD.bazel
index a84a448..4d5eb36 100644
--- a/tools/skslc/BUILD.bazel
+++ b/tools/skslc/BUILD.bazel
@@ -78,6 +78,12 @@
)
compile_sksl(
+ name = "hlsl_tests",
+ inputs = "//resources/sksl:sksl_hlsl_tests_sources",
+ lang = "hlsl",
+)
+
+compile_sksl(
name = "wgsl_tests",
inputs = "//resources/sksl:sksl_wgsl_tests_sources",
lang = "wgsl",
diff --git a/tools/skslc/Makefile b/tools/skslc/Makefile
index 35c7bcd..e01b594 100644
--- a/tools/skslc/Makefile
+++ b/tools/skslc/Makefile
@@ -6,4 +6,5 @@
bazel run //tools/skslc:compile_skvm_tests --config=release
bazel run //tools/skslc:compile_stage_tests --config=release
bazel run //tools/skslc:compile_spirv_tests --config=release
- bazel run //tools/skslc:compile_wgsl_tests --config=release
\ No newline at end of file
+ bazel run //tools/skslc:compile_wgsl_tests --config=release
+ bazel run //tools/skslc:compile_hlsl_tests --config=release