-- v5: tests: Test entry point semantics on function declarations. tests: Add more tests for early return from the entry point. tests: Add some tests for early return from user-defined functions.
From: Zebediah Figura zfigura@codeweavers.com
--- Makefile.am | 1 + tests/function-return.shader_test | 315 ++++++++++++++++++++++++++++++ 2 files changed, 316 insertions(+) create mode 100644 tests/function-return.shader_test
diff --git a/Makefile.am b/Makefile.am index a2625a5c..a8f91ca4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -62,6 +62,7 @@ vkd3d_shader_tests = \ tests/exp.shader_test \ tests/floor.shader_test \ tests/frac.shader_test \ + tests/function-return.shader_test \ tests/hlsl-array-dimension.shader_test \ tests/hlsl-attributes.shader_test \ tests/hlsl-bool-cast.shader_test \ diff --git a/tests/function-return.shader_test b/tests/function-return.shader_test new file mode 100644 index 00000000..32fd01f9 --- /dev/null +++ b/tests/function-return.shader_test @@ -0,0 +1,315 @@ +% Test early return from a user-defined function. + +[pixel shader todo] + +float func(out float o) +{ + o = 0.1; + return 0.2; + o = 0.3; + return 0.4; +} + +void func2(out float o) +{ + o = 0.5; + return; + o = 0.6; +} + +float4 main() : sv_target +{ + float4 ret; + + ret.z = 0.7; + ret.x = func(ret.y); + func2(ret.w); + ret.z = 0.8; + return ret; +} + +[test] +todo draw quad +probe all rgba (0.2, 0.1, 0.8, 0.5); + +[pixel shader todo] + +uniform float f; + +float func(out float o) +{ + o = 0.1; + if (f < 0.3) + { + return 0.2; + o = 0.3; + } + else if (f < 0.7) + { + o = 0.4; + return 0.5; + } + o = 0.6; + return 0.7; +} + +float func2(out float o) +{ + o = 0.1; + if (f < 0.5) + { + o = 0.2; + } + else + { + o = 0.4; + return 0.3; + } + return 0.5; +} + +float4 main() : sv_target +{ + float4 ret; + + ret.x = func(ret.y); + ret.z = func2(ret.w); + ret += 0.1; + return ret; +} + +[test] +uniform 0 float 0.1 +todo draw quad +probe all rgba (0.3, 0.2, 0.6, 0.3) 1 +uniform 0 float 0.4 +todo draw quad +probe all rgba (0.6, 0.5, 0.6, 0.3) 1 +uniform 0 float 0.6 +todo draw quad +probe all rgba (0.6, 0.5, 0.4, 0.5) 1 +uniform 0 float 0.8 +todo draw quad +probe all rgba (0.8, 0.7, 0.4, 0.5) 1 + +[pixel shader todo] + +uniform float f; + +float func(out float o) +{ + o = 0.1; + if (f < 0.3) + { + return 0.2; + } + o += 0.3; + if (f < 0.7) + { + return 0.5; + } + o += 0.5; + return 1.0; +} + +float func2(out float o) +{ + o = 0.1; + if (f < 0.7) + { + if (f < 0.3) + return 0.2; + o += 0.3; + } + o += 0.5; + return 1.0; +} + +float4 main() : sv_target +{ + float4 ret; + + ret.x = func(ret.y); + ret.z = func2(ret.w); + return ret; +} + +[test] +uniform 0 float 0.1 +todo draw quad +probe all rgba (0.2, 0.1, 0.2, 0.1) 1 +uniform 0 float 0.5 +todo draw quad +probe all rgba (0.5, 0.4, 1.0, 0.9) 1 +uniform 0 float 0.9 +todo draw quad +probe all rgba (1.0, 0.9, 1.0, 0.6) 1 + +[pixel shader todo] + +float func(out float o) +{ + o = 0.1; + for (;;) + { + o *= 2; + return 0.3; + o *= 3; + } + o = 0; + return 0.4; +} + +float func2(out float o) +{ + o = 0.1; + for (;;) + { + if (o > 0.5) + return 0.2; + o *= 2; + } + o = 0; + return 0.3; +} + +float4 main() : sv_target +{ + float4 ret; + + ret.x = func(ret.y); + ret.z = func2(ret.w); + ret += 0.1; + return ret; +} + +[test] +todo draw quad +probe all rgba (0.4, 0.3, 0.3, 0.9) 1 + +[pixel shader todo] + +uniform float f; + +float func(out float o) +{ + int i; + + o = 0.1; + for (i = 0; i < 4; ++i) + { + if (o > f) + return 0.2; + o *= 2; + } + o = 0; + return 0.3; +} + +float func2(out float o) +{ + if (f < 0.5) + { + o = 0.1; + for (;;) + { + o *= 2; + return 0.2; + } + o *= 3; + return 0.3; + } + else + { + o = 0.4; + } + o = 0.5; + return 0.6; +} + +float4 main() : sv_target +{ + float4 ret; + + ret.x = func(ret.y); + ret.z = func2(ret.w); + ret += 0.1; + return ret; +} + +[test] +uniform 0 float 0.0 +todo draw quad +probe all rgba (0.3, 0.2, 0.3, 0.3) 1 + +uniform 0 float 0.1 +todo draw quad +probe all rgba (0.3, 0.3, 0.3, 0.3) 1 + +uniform 0 float 0.3 +todo draw quad +probe all rgba (0.3, 0.5, 0.3, 0.3) 1 + +uniform 0 float 0.7 +todo draw quad +probe all rgba (0.3, 0.9, 0.7, 0.6) 1 + +uniform 0 float 0.9 +todo draw quad +probe all rgba (0.4, 0.1, 0.7, 0.6) 1 + +[pixel shader todo] + +uniform float4 f[3]; + +float func(out float o) +{ + int i, j; + + o = 0.1; + for (i = 0; i < 3; ++i) + { + for (j = 0; j < 3; ++j) + { + if (o > f[j].x) + return 0.2; + } + o *= 2; + } + o = 0; + return 0.3; +} + +float4 main() : sv_target +{ + float4 ret; + + ret.x = func(ret.y); + ret.zw = 0.5; + ret += 0.1; + return ret; +} + +[test] + +uniform 0 float4 0.3 0.0 0.0 0.0 +uniform 4 float4 0.0 0.0 0.0 0.0 +uniform 8 float4 0.1 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.3, 0.2, 0.6, 0.6) 1 + +uniform 4 float4 0.35 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.3, 0.3, 0.6, 0.6) 1 + +uniform 8 float4 0.5 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.3, 0.5, 0.6, 0.6) 1 + +uniform 0 float4 1.0 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.3, 0.5, 0.6, 0.6) 1 + +uniform 4 float4 2.0 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.4, 0.1, 0.6, 0.6) 1
From: Zebediah Figura zfigura@codeweavers.com
--- Makefile.am | 2 +- tests/hlsl-return-void.shader_test | 11 -- tests/return.shader_test | 263 +++++++++++++++++++++++++++++ 3 files changed, 264 insertions(+), 12 deletions(-) delete mode 100644 tests/hlsl-return-void.shader_test create mode 100644 tests/return.shader_test
diff --git a/Makefile.am b/Makefile.am index a8f91ca4..959da8f5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -102,7 +102,6 @@ vkd3d_shader_tests = \ tests/hlsl-numeric-types.shader_test \ tests/hlsl-numthreads.shader_test \ tests/hlsl-return-implicit-conversion.shader_test \ - tests/hlsl-return-void.shader_test \ tests/hlsl-shape.shader_test \ tests/hlsl-single-numeric-initializer.shader_test \ tests/hlsl-smoothstep.shader_test \ @@ -130,6 +129,7 @@ vkd3d_shader_tests = \ tests/preproc-invalid.shader_test \ tests/preproc-macro.shader_test \ tests/preproc-misc.shader_test \ + tests/return.shader_test \ tests/round.shader_test \ tests/sampler.shader_test \ tests/sampler-offset.shader_test \ diff --git a/tests/hlsl-return-void.shader_test b/tests/hlsl-return-void.shader_test deleted file mode 100644 index d7231d6c..00000000 --- a/tests/hlsl-return-void.shader_test +++ /dev/null @@ -1,11 +0,0 @@ -[pixel shader] -void main(out float4 ret : sv_target) -{ - ret = float4(0.1, 0.2, 0.3, 0.4); - return; - ret = float4(0.5, 0.6, 0.7, 0.8); -} - -[test] -draw quad -todo probe all rgba (0.1, 0.2, 0.3, 0.4) diff --git a/tests/return.shader_test b/tests/return.shader_test new file mode 100644 index 00000000..e913d15d --- /dev/null +++ b/tests/return.shader_test @@ -0,0 +1,263 @@ +% Test early return from the entry point. + +[pixel shader] + +float4 main() : sv_target +{ + return float4(0.1, 0.2, 0.3, 0.4); + return float4(0.5, 0.6, 0.7, 0.8); +} + +[test] +draw quad +todo probe all rgba (0.1, 0.2, 0.3, 0.4) + +[pixel shader] + +void main(out float4 ret : sv_target) +{ + ret = float4(0.1, 0.2, 0.3, 0.4); + return; + ret = float4(0.5, 0.6, 0.7, 0.8); +} + +[test] +draw quad +todo probe all rgba (0.1, 0.2, 0.3, 0.4) + +[pixel shader] + +uniform float f; + +float4 main() : sv_target +{ + if (f < 0.5) + return float4(0.1, 0.2, 0.3, 0.4); + return float4(0.5, 0.6, 0.7, 0.8); +} + +[test] +uniform 0 float 0.2 +draw quad +todo probe all rgba (0.1, 0.2, 0.3, 0.4) +uniform 0 float 0.8 +draw quad +probe all rgba (0.5, 0.6, 0.7, 0.8) + +[pixel shader] + +uniform float f; + +void main(out float4 ret : sv_target) +{ + ret = float4(0.1, 0.2, 0.3, 0.4); + if (f < 0.5) + { + ret += 0.1; + } + else + { + return; + ret += 0.3; + } + ret += 0.1; +} + +[test] +uniform 0 float 0.2 +draw quad +probe all rgba (0.3, 0.4, 0.5, 0.6) +uniform 0 float 0.8 +draw quad +todo probe all rgba (0.1, 0.2, 0.3, 0.4) + +[pixel shader] + +uniform float f; + +void main(out float4 ret : sv_target) +{ + ret = float4(0.1, 0.2, 0.3, 0.4); + if (f < 0.3) + { + return; + } + ret += 0.1; + if (f < 0.7) + { + return; + } + ret += 0.3; +} + +[test] +uniform 0 float 0.1 +draw quad +todo probe all rgba (0.1, 0.2, 0.3, 0.4) 1 +uniform 0 float 0.5 +draw quad +todo probe all rgba (0.2, 0.3, 0.4, 0.5) 1 +uniform 0 float 0.9 +draw quad +probe all rgba (0.5, 0.6, 0.7, 0.8) 1 + +[pixel shader] + +uniform float f; + +void main(out float4 ret : sv_target) +{ + ret = float4(0.1, 0.2, 0.3, 0.4); + if (f < 0.7) + { + if (f < 0.3) + return; + ret += 0.1; + } + ret += 0.3; +} + +[test] +uniform 0 float 0.1 +draw quad +todo probe all rgba (0.1, 0.2, 0.3, 0.4) 1 +uniform 0 float 0.5 +draw quad +probe all rgba (0.5, 0.6, 0.7, 0.8) 1 +uniform 0 float 0.9 +draw quad +probe all rgba (0.4, 0.5, 0.6, 0.7) 1 + +[pixel shader todo] + +void main(out float4 ret : sv_target) +{ + ret = float4(0.1, 0.2, 0.3, 0.4); + for (;;) + { + ret *= 2; + return; + ret *= 3; + } + ret += 0.1; +} + +[test] +todo draw quad +todo probe all rgba (0.2, 0.4, 0.6, 0.8) + +[pixel shader] + +uniform float f; + +void main(out float4 ret : sv_target) +{ + int i; + + ret = 0.1; + for (i = 0; i < 4; ++i) + { + if (ret.x > f) + return; + ret *= 2; + } + ret = 0.9; +} + +[test] +uniform 0 float 0.0 +draw quad +todo probe all rgba (0.1, 0.1, 0.1, 0.1) 1 + +uniform 0 float 0.1 +draw quad +todo probe all rgba (0.2, 0.2, 0.2, 0.2) 1 + +uniform 0 float 0.3 +draw quad +todo probe all rgba (0.4, 0.4, 0.4, 0.4) 1 + +uniform 0 float 0.7 +draw quad +todo probe all rgba (0.8, 0.8, 0.8, 0.8) 1 + +uniform 0 float 0.9 +draw quad +todo probe all rgba (0.9, 0.9, 0.9, 0.9) 1 + +[pixel shader todo] + +uniform float f; + +void main(out float4 ret : sv_target) +{ + if (f < 0.5) + { + ret = 0.1; + for (;;) + { + ret *= 2; + return; + } + ret *= 3; + return; + } + else + { + ret = 0.4; + } + ret = 0.5; +} + +[test] +uniform 0 float 0.2 +todo draw quad +todo probe all rgba (0.2, 0.2, 0.2, 0.2) +uniform 0 float 0.8 +todo draw quad +todo probe all rgba (0.5, 0.5, 0.5, 0.5) + +[pixel shader todo] + +uniform float4 f[3]; + +void main(out float4 ret : sv_target) +{ + int i, j; + + ret = 0.1; + for (i = 0; i < 3; ++i) + { + for (j = 0; j < 3; ++j) + { + if (ret.x > f[j].x) + return; + } + ret *= 2; + } + ret = 0.9; +} + +[test] + +uniform 0 float4 0.3 0.0 0.0 0.0 +uniform 4 float4 0.0 0.0 0.0 0.0 +uniform 8 float4 0.1 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.1, 0.1, 0.1, 0.1) 1 + +uniform 4 float4 0.35 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.2, 0.2, 0.2, 0.2) 1 + +uniform 8 float4 0.5 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.4, 0.4, 0.4, 0.4) 1 + +uniform 0 float4 1.0 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.4, 0.4, 0.4, 0.4) 1 + +uniform 4 float4 2.0 0.0 0.0 0.0 +todo draw quad +todo probe all rgba (0.9, 0.9, 0.9, 0.9) 1
From: Zebediah Figura zfigura@codeweavers.com
--- Makefile.am | 1 + tests/entry-point-semantics.shader_test | 52 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 tests/entry-point-semantics.shader_test
diff --git a/Makefile.am b/Makefile.am index 959da8f5..f9199472 100644 --- a/Makefile.am +++ b/Makefile.am @@ -59,6 +59,7 @@ vkd3d_shader_tests = \ tests/cbuffer.shader_test \ tests/compute.shader_test \ tests/conditional.shader_test \ + tests/entry-point-semantics.shader_test \ tests/exp.shader_test \ tests/floor.shader_test \ tests/frac.shader_test \ diff --git a/tests/entry-point-semantics.shader_test b/tests/entry-point-semantics.shader_test new file mode 100644 index 00000000..a32a0e7b --- /dev/null +++ b/tests/entry-point-semantics.shader_test @@ -0,0 +1,52 @@ +% Test how semantics are determined when spread across the entry point's +% definition and its declarations. + +[vertex shader] +void main(out float tex : texcoord, inout float4 pos : sv_position) +{ + tex = 0.2; +} + +[pixel shader fail] + +float4 main(float tex : texcoord) : sv_target; + +float4 main(float tex) +{ + return tex; +} + +[pixel shader fail] + +float4 main(float tex) +{ + return tex; +} + +float4 main(float tex : texcoord) : sv_target; + +[pixel shader] + +float4 main(float tex : bogus) : bogus; + +float4 main(float tex : texcoord) : sv_target +{ + return tex; +} + +[test] +draw quad +probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2) + +[pixel shader] + +float4 main(float tex : texcoord) : sv_target +{ + return tex; +} + +float4 main(float tex : bogus) : bogus; + +[test] +draw quad +probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)