Module: vkd3d Branch: master Commit: c190c184ce88fb5f2ac5d4c289cbf5f1799e453b URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/c190c184ce88fb5f2ac5d4c289cbf5...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Apr 3 23:15:00 2023 +0200
vkd3d-shader/hlsl: Add support for ternary operator.
---
Makefile.am | 1 + libs/vkd3d-shader/hlsl.y | 11 ++++++++++- tests/hlsl-ternary.shader_test | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am index 77f44568..48991982 100644 --- a/Makefile.am +++ b/Makefile.am @@ -116,6 +116,7 @@ vkd3d_shader_tests = \ tests/hlsl-struct-array.shader_test \ tests/hlsl-struct-assignment.shader_test \ tests/hlsl-struct-semantics.shader_test \ + tests/hlsl-ternary.shader_test \ tests/hlsl-transpose.shader_test \ tests/hlsl-type-names.shader_test \ tests/hlsl-vector-indexing.shader_test \ diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 24108959..3873a939 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -5743,7 +5743,16 @@ conditional_expr: logicor_expr | logicor_expr '?' expr ':' assignment_expr { - hlsl_fixme(ctx, &@$, "Ternary operator."); + struct hlsl_ir_node *cond = node_from_list($1), *first = node_from_list($3), *second = node_from_list($5); + + list_move_tail($1, $3); + list_move_tail($1, $5); + vkd3d_free($3); + vkd3d_free($5); + + if (!hlsl_add_conditional(ctx, $1, cond, first, second)) + YYABORT; + $$ = $1; }
assignment_expr: diff --git a/tests/hlsl-ternary.shader_test b/tests/hlsl-ternary.shader_test new file mode 100644 index 00000000..d6097165 --- /dev/null +++ b/tests/hlsl-ternary.shader_test @@ -0,0 +1,15 @@ +[pixel shader] +uniform float4 x; + +float4 main() : SV_TARGET +{ + return x.x ? x : x - 1; +} + +[test] +uniform 0 float4 2.0 3.0 4.0 5.0 +draw quad +probe all rgba (2.0, 3.0, 4.0, 5.0) +uniform 0 float4 0.0 10.0 11.0 12.0 +draw quad +probe all rgba (-1.0, 9.0, 10.0, 11.0)