Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Do not hardcode the bit pattern of 1.0f. * Make the mask a parameter to write_sm4_cast_from_bool(). --- libs/vkd3d-shader/hlsl_sm4.c | 33 +++++++++++++++++++++++++++--- tests/cast-to-float.shader_test | 2 +- tests/cast-to-int.shader_test | 4 ++-- tests/cast-to-uint.shader_test | 4 ++-- tests/hlsl-bool-cast.shader_test | 18 ++++++++++++++++ tests/logic-operations.shader_test | 6 +++--- 6 files changed, 56 insertions(+), 11 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index 79027169..1edc5818 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1459,9 +1459,36 @@ static bool type_is_float(const struct hlsl_type *type) return type->base_type == HLSL_TYPE_FLOAT || type->base_type == HLSL_TYPE_HALF; }
+static void write_sm4_cast_from_bool(struct hlsl_ctx *ctx, + struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_expr *expr, + const struct hlsl_ir_node *arg, uint32_t mask) +{ + struct sm4_instruction instr; + + memset(&instr, 0, sizeof(instr)); + instr.opcode = VKD3D_SM4_OP_AND; + + sm4_dst_from_node(&instr.dsts[0], &expr->node); + instr.dst_count = 1; + + sm4_src_from_node(&instr.srcs[0], arg, instr.dsts[0].writemask); + instr.srcs[1].swizzle_type = VKD3D_SM4_SWIZZLE_NONE; + instr.srcs[1].reg.type = VKD3D_SM4_RT_IMMCONST; + instr.srcs[1].reg.dim = VKD3D_SM4_DIMENSION_SCALAR; + instr.srcs[1].reg.immconst_uint[0] = mask; + instr.src_count = 2; + + write_sm4_instruction(buffer, &instr); +} + static void write_sm4_cast(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_expr *expr) { + static const union + { + uint32_t u; + float f; + } one = { .f = 1.0 }; const struct hlsl_ir_node *arg1 = expr->operands[0].node; const struct hlsl_type *dst_type = expr->node.data_type; const struct hlsl_type *src_type = arg1->data_type; @@ -1488,7 +1515,7 @@ static void write_sm4_cast(struct hlsl_ctx *ctx, break;
case HLSL_TYPE_BOOL: - hlsl_fixme(ctx, &expr->node.loc, "SM4 cast from bool to float."); + write_sm4_cast_from_bool(ctx, buffer, expr, arg1, one.u); break;
case HLSL_TYPE_DOUBLE: @@ -1514,7 +1541,7 @@ static void write_sm4_cast(struct hlsl_ctx *ctx, break;
case HLSL_TYPE_BOOL: - hlsl_fixme(ctx, &expr->node.loc, "SM4 cast from bool to int."); + write_sm4_cast_from_bool(ctx, buffer, expr, arg1, 1); break;
case HLSL_TYPE_DOUBLE: @@ -1540,7 +1567,7 @@ static void write_sm4_cast(struct hlsl_ctx *ctx, break;
case HLSL_TYPE_BOOL: - hlsl_fixme(ctx, &expr->node.loc, "SM4 cast from bool to uint."); + write_sm4_cast_from_bool(ctx, buffer, expr, arg1, 1); break;
case HLSL_TYPE_DOUBLE: diff --git a/tests/cast-to-float.shader_test b/tests/cast-to-float.shader_test index 1844b1f3..f0910020 100644 --- a/tests/cast-to-float.shader_test +++ b/tests/cast-to-float.shader_test @@ -12,7 +12,7 @@ uniform 0 int -1 uniform 1 uint 3 uniform 2 int -2 uniform 3 float 0.5 -todo draw quad +draw quad probe all rgba (0.5, 0.5, 0.5, 0.5)
[pixel shader] diff --git a/tests/cast-to-int.shader_test b/tests/cast-to-int.shader_test index ce42827b..4c5d0e2f 100644 --- a/tests/cast-to-int.shader_test +++ b/tests/cast-to-int.shader_test @@ -19,8 +19,8 @@ uniform 0 float 2.6 uniform 1 int -2 uniform 2 int -2 uniform 3 float -3.6 -todo draw quad -probe all rgba (0.5, 0.5, 0.5, 0.5) +draw quad +todo probe all rgba (0.5, 0.5, 0.5, 0.5)
[pixel shader]
diff --git a/tests/cast-to-uint.shader_test b/tests/cast-to-uint.shader_test index 8b7964ff..66f7267e 100644 --- a/tests/cast-to-uint.shader_test +++ b/tests/cast-to-uint.shader_test @@ -19,8 +19,8 @@ uniform 0 float 2.6 uniform 1 int 2 uniform 2 int -2 uniform 3 float -3.6 -todo draw quad -probe all rgba (0.5, 0.5, 0.5, 0.5) +draw quad +todo probe all rgba (0.5, 0.5, 0.5, 0.5)
[pixel shader]
diff --git a/tests/hlsl-bool-cast.shader_test b/tests/hlsl-bool-cast.shader_test index 8880b2f5..397cbcc0 100644 --- a/tests/hlsl-bool-cast.shader_test +++ b/tests/hlsl-bool-cast.shader_test @@ -12,3 +12,21 @@ float4 main() : SV_TARGET [test] draw quad probe all rgba (0.0, 0.0, 1.0, 1.0) + +[require] +shader model >= 4.0 + +[pixel shader] +uniform float4 x; +uniform int4 y; + +float4 main() : SV_TARGET +{ + return (float4)(bool4)x + 10.0 * (float4)(int4)(bool4)y; +} + +[test] +uniform 0 float4 0.0 0.0 2.0 4.0 +uniform 4 int4 0 1 0 10 +draw quad +probe all rgba (0.0, 10.0, 1.0, 11.0) diff --git a/tests/logic-operations.shader_test b/tests/logic-operations.shader_test index 9a5cec3f..f888e831 100644 --- a/tests/logic-operations.shader_test +++ b/tests/logic-operations.shader_test @@ -8,7 +8,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 1.0, 1.0, 1.0)
[pixel shader] @@ -61,7 +61,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 1.0, 1.0, 1.0)
[pixel shader] @@ -114,7 +114,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 1.0, 1.0, 1.0)
[pixel shader]
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- libs/vkd3d-shader/hlsl_sm4.c | 5 +++++ tests/logic-operations.shader_test | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index 1edc5818..08f9d12c 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1648,6 +1648,11 @@ static void write_sm4_expr(struct hlsl_ctx *ctx, write_sm4_unary_op(buffer, VKD3D_SM4_OP_LOG, &expr->node, arg1, 0); break;
+ case HLSL_OP1_LOGIC_NOT: + assert(dst_type->base_type == HLSL_TYPE_BOOL); + write_sm4_unary_op(buffer, VKD3D_SM4_OP_NOT, &expr->node, arg1, 0); + break; + case HLSL_OP1_NEG: switch (dst_type->base_type) { diff --git a/tests/logic-operations.shader_test b/tests/logic-operations.shader_test index f888e831..87e927f4 100644 --- a/tests/logic-operations.shader_test +++ b/tests/logic-operations.shader_test @@ -22,7 +22,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 1.0)
[pixel shader] @@ -75,7 +75,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 1.0)
[pixel shader] @@ -128,7 +128,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 1.0)
[pixel shader]
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- libs/vkd3d-shader/hlsl_sm4.c | 5 +++++ tests/logic-operations.shader_test | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index 08f9d12c..0829c5e9 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1846,6 +1846,11 @@ static void write_sm4_expr(struct hlsl_ctx *ctx, break; }
+ case HLSL_OP2_LOGIC_AND: + assert(dst_type->base_type == HLSL_TYPE_BOOL); + write_sm4_binary_op(buffer, VKD3D_SM4_OP_AND, &expr->node, arg1, arg2); + break; + case HLSL_OP2_LSHIFT: assert(type_is_integer(dst_type)); assert(dst_type->base_type != HLSL_TYPE_BOOL); diff --git a/tests/logic-operations.shader_test b/tests/logic-operations.shader_test index 87e927f4..032b5b23 100644 --- a/tests/logic-operations.shader_test +++ b/tests/logic-operations.shader_test @@ -35,7 +35,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 1.0)
[pixel shader] @@ -88,7 +88,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 1.0)
[pixel shader] @@ -141,7 +141,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 1.0)
[pixel shader]
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- libs/vkd3d-shader/hlsl_sm4.c | 5 +++++ tests/logic-operations.shader_test | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index 0829c5e9..d2857e6a 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1851,6 +1851,11 @@ static void write_sm4_expr(struct hlsl_ctx *ctx, write_sm4_binary_op(buffer, VKD3D_SM4_OP_AND, &expr->node, arg1, arg2); break;
+ case HLSL_OP2_LOGIC_OR: + assert(dst_type->base_type == HLSL_TYPE_BOOL); + write_sm4_binary_op(buffer, VKD3D_SM4_OP_OR, &expr->node, arg1, arg2); + break; + case HLSL_OP2_LSHIFT: assert(type_is_integer(dst_type)); assert(dst_type->base_type != HLSL_TYPE_BOOL); diff --git a/tests/logic-operations.shader_test b/tests/logic-operations.shader_test index 032b5b23..360ca03b 100644 --- a/tests/logic-operations.shader_test +++ b/tests/logic-operations.shader_test @@ -48,7 +48,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 1.0, 1.0, 1.0)
[pixel shader] @@ -101,7 +101,7 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 1.0, 1.0, 1.0)
[pixel shader] @@ -154,5 +154,5 @@ float4 main() : SV_TARGET }
[test] -todo draw quad +draw quad probe all rgba (0.0, 1.0, 1.0, 1.0)
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- v2: * Pass inputs as floats so that the test can be run also on SM1. * Use 16 instead of 15, because with SM1 it holds 5 % 15 == 4, likely because of inexact float operations. --- Makefile.am | 1 + tests/arithmetic-int-uniform.shader_test | 29 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/arithmetic-int-uniform.shader_test
diff --git a/Makefile.am b/Makefile.am index 0cb90b2b..60db7794 100644 --- a/Makefile.am +++ b/Makefile.am @@ -54,6 +54,7 @@ vkd3d_shader_tests = \ tests/abs.shader_test \ tests/arithmetic-float.shader_test \ tests/arithmetic-int.shader_test \ + tests/arithmetic-int-uniform.shader_test \ tests/arithmetic-uint.shader_test \ tests/bitwise.shader_test \ tests/cast-broadcast.shader_test \ diff --git a/tests/arithmetic-int-uniform.shader_test b/tests/arithmetic-int-uniform.shader_test new file mode 100644 index 00000000..ff80a9b0 --- /dev/null +++ b/tests/arithmetic-int-uniform.shader_test @@ -0,0 +1,29 @@ +[pixel shader] +uniform float2 a; + +float4 main() : SV_TARGET +{ + int x = a.x; + int y = a.y; + return float4(x + y, x - y, x * y, x / y); +} + +[test] +uniform 0 float4 5.0 16.0 0.0 0.0 +todo draw quad +probe all rgba (21.0, -11.0, 80.0, 0.0) + +[pixel shader] +uniform float2 a; + +float4 main() : SV_TARGET +{ + int x = a.x; + int y = a.y; + return float4(x % y, +x, -x, y / x); +} + +[test] +uniform 0 float4 5.0 16.0 0.0 0.0 +todo draw quad +probe all rgba (5.0, 5.0, -5.0, 3.0)
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com