Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2022
- 86 participants
- 2418 messages
[PATCH vkd3d v4 4/6] vkd3d-shader/hlsl: Parse bitwise AND.
by Giovanni Mascellani
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
---
v2:
* Emit error messages.
---
libs/vkd3d-shader/hlsl.y | 45 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index 9476765f..13268617 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -1057,6 +1057,49 @@ static struct list *add_binary_arithmetic_expr_merge(struct hlsl_ctx *ctx, struc
return list1;
}
+static struct hlsl_ir_expr *add_binary_bitwise_expr(struct hlsl_ctx *ctx, struct list *instrs,
+ enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2,
+ const struct vkd3d_shader_location *loc)
+{
+ if (arg1->data_type->base_type == HLSL_TYPE_HALF || arg1->data_type->base_type == HLSL_TYPE_FLOAT)
+ {
+ struct vkd3d_string_buffer *type_str = hlsl_type_to_string(ctx, arg1->data_type);
+
+ if (type_str)
+ hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
+ "The first argument has type '%s', which is not integer.",
+ type_str->buffer);
+ hlsl_release_string_buffer(ctx, type_str);
+ return NULL;
+ }
+
+ if (arg2->data_type->base_type == HLSL_TYPE_HALF || arg2->data_type->base_type == HLSL_TYPE_FLOAT)
+ {
+ struct vkd3d_string_buffer *type_str = hlsl_type_to_string(ctx, arg2->data_type);
+
+ if (type_str)
+ hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
+ "The second argument has type '%s', which is not integer.",
+ type_str->buffer);
+ hlsl_release_string_buffer(ctx, type_str);
+ return NULL;
+ }
+
+ return add_binary_arithmetic_expr(ctx, instrs, op, arg1, arg2, loc);
+}
+
+static struct list *add_binary_bitwise_expr_merge(struct hlsl_ctx *ctx, struct list *list1, struct list *list2,
+ enum hlsl_ir_expr_op op, const struct vkd3d_shader_location *loc)
+{
+ struct hlsl_ir_node *arg1 = node_from_list(list1), *arg2 = node_from_list(list2);
+
+ list_move_tail(list1, list2);
+ vkd3d_free(list2);
+ add_binary_bitwise_expr(ctx, list1, op, arg1, arg2, loc);
+
+ return list1;
+}
+
static struct hlsl_ir_expr *add_binary_comparison_expr(struct hlsl_ctx *ctx, struct list *instrs,
enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2,
struct vkd3d_shader_location *loc)
@@ -3554,7 +3597,7 @@ bitand_expr:
equality_expr
| bitand_expr '&' equality_expr
{
- hlsl_fixme(ctx, &@$, "Bitwise AND.");
+ $$ = add_binary_bitwise_expr_merge(ctx, $1, $3, HLSL_OP2_BIT_AND, &@2);
}
bitxor_expr:
--
2.34.1
Jan. 28, 2022
[PATCH vkd3d v4 3/6] vkd3d-shader/hlsl: Write SM4 unsigned multiplication instructions.
by Giovanni Mascellani
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
---
v2:
* Rename to write_sm4_binary_op_with_two_destinations().
* Fix writemask mapping (before it always used the writemask from
destination 1, but of course it has to use dst_idx).
v3:
* Rebased onto master.
v4:
* Really rebase onto master. I mean, use calls that are available in
master.
---
libs/vkd3d-shader/hlsl_sm4.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index 4eebd583..58d7aef7 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -786,7 +786,7 @@ struct sm4_instruction
{
struct sm4_register reg;
unsigned int writemask;
- } dsts[1];
+ } dsts[2];
unsigned int dst_count;
struct sm4_src_register
@@ -1266,6 +1266,28 @@ static void write_sm4_binary_op(struct vkd3d_bytecode_buffer *buffer, enum vkd3d
write_sm4_instruction(buffer, &instr);
}
+static void write_sm4_binary_op_with_two_destinations(struct vkd3d_bytecode_buffer *buffer,
+ enum vkd3d_sm4_opcode opcode, const struct hlsl_ir_node *dst, unsigned dst_idx,
+ const struct hlsl_ir_node *src1, const struct hlsl_ir_node *src2)
+{
+ struct sm4_instruction instr;
+
+ memset(&instr, 0, sizeof(instr));
+ instr.opcode = opcode;
+
+ sm4_dst_from_node(&instr.dsts[dst_idx], dst);
+ instr.dsts[1 - dst_idx].reg.type = VKD3D_SM4_RT_NULL;
+ instr.dsts[1 - dst_idx].reg.dim = VKD3D_SM4_DIMENSION_NONE;
+ instr.dsts[1 - dst_idx].reg.idx_count = 0;
+ instr.dst_count = 2;
+
+ sm4_src_from_node(&instr.srcs[0], src1, instr.dsts[dst_idx].writemask);
+ sm4_src_from_node(&instr.srcs[1], src2, instr.dsts[dst_idx].writemask);
+ instr.src_count = 2;
+
+ write_sm4_instruction(buffer, &instr);
+}
+
static void write_sm4_constant(struct hlsl_ctx *ctx,
struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_constant *constant)
{
@@ -1578,6 +1600,13 @@ static void write_sm4_expr(struct hlsl_ctx *ctx,
write_sm4_binary_op(buffer, VKD3D_SM4_OP_UMIN, &expr->node, arg1, arg2);
break;
+ case HLSL_OP2_MUL:
+ /* Using IMUL instead of UMUL because we're taking
+ * the low bits, and the native compiler generates
+ * IMUL. */
+ write_sm4_binary_op_with_two_destinations(buffer, VKD3D_SM4_OP_IMUL, &expr->node, 1, arg1, arg2);
+ break;
+
default:
hlsl_fixme(ctx, &expr->node.loc, "SM4 uint \"%s\" expression.\n", debug_hlsl_expr_op(expr->op));
break;
--
2.34.1
Jan. 28, 2022
[PATCH vkd3d v4 2/6] tests: Test a number of simple HLSL operations.
by Giovanni Mascellani
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
--
v2:
* Split to many individual tests
---
Makefile.am | 2 +
tests/hlsl-operations.shader_test | 367 ++++++++++++++++++++++++++++++
2 files changed, 369 insertions(+)
create mode 100644 tests/hlsl-operations.shader_test
diff --git a/Makefile.am b/Makefile.am
index 95c2aaa7..24f4f66a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -74,6 +74,7 @@ vkd3d_shader_tests = \
tests/hlsl-mul.shader_test \
tests/hlsl-nested-arrays.shader_test \
tests/hlsl-numeric-types.shader_test \
+ tests/hlsl-operations.shader_test \
tests/hlsl-return-implicit-conversion.shader_test \
tests/hlsl-return-void.shader_test \
tests/hlsl-shape.shader_test \
@@ -306,6 +307,7 @@ XFAIL_TESTS = \
tests/hlsl-mul.shader_test \
tests/hlsl-nested-arrays.shader_test \
tests/hlsl-numeric-types.shader_test \
+ tests/hlsl-operations.shader_test \
tests/hlsl-return-implicit-conversion.shader_test \
tests/hlsl-return-void.shader_test \
tests/hlsl-shape.shader_test \
diff --git a/tests/hlsl-operations.shader_test b/tests/hlsl-operations.shader_test
new file mode 100644
index 00000000..717899b5
--- /dev/null
+++ b/tests/hlsl-operations.shader_test
@@ -0,0 +1,367 @@
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ float x = 5.0;
+ float y = 15.0;
+
+ return float4(x + y, x - y, x * y, x / y);
+}
+
+[test]
+draw quad
+probe all rgba (20.0, -10.0, 75.0, 0.33333333)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ float x = 5.0;
+ float y = 15.0;
+
+ return float4(x % y, +x, -x, y / x);
+}
+
+[test]
+draw quad
+probe all rgba (5.0, 5.0, -5.0, 3.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ float x = 5.0;
+ float y = 15.0;
+
+ return float4(x == y, x != y, x < y, x <= y);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ float x = 5.0;
+ float y = 15.0;
+ float zero = 0.0;
+
+ return float4(x > y, x >= y, !x, !zero);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ float zero = 0.0;
+ float one = 1.0;
+
+ return float4(zero && zero, zero && one, one && zero, one && one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ float zero = 0.0;
+ float one = 1.0;
+
+ return float4(zero || zero, zero || one, one || zero, one || one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int x = 5;
+ int y = 15;
+
+ return float4(x + y, x - y, x * y, x / y);
+}
+
+[test]
+draw quad
+probe all rgba (20.0, -10.0, 75.0, 0.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int x = 5;
+ int y = 15;
+
+ return float4(x % y, +x, -x, y / x);
+}
+
+[test]
+draw quad
+probe all rgba (5.0, 5.0, -5.0, 3.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int x = 5;
+ int y = 15;
+
+ return float4(x == y, x != y, x < y, x <= y);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int x = 5;
+ int y = 15;
+ int zero = 0;
+
+ return float4(x > y, x >= y, !x, !zero);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int x = 5;
+ int y = 15;
+
+ return float4(x >> y, y >> x, x << y, y << x);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 163840.0, 480.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int x = 5;
+ int y = 15;
+
+ return float4(x & y, x | y, x ^ y, ~x);
+}
+
+[test]
+draw quad
+probe all rgba (5.0, 15.0, 10.0, -6.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int zero = 0;
+ int one = 1;
+
+ return float4(zero && zero, zero && one, one && zero, one && one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int zero = 0;
+ int one = 1;
+
+ return float4(zero || zero, zero || one, one || zero, one || one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int zero = 0;
+ int one = 1;
+
+ return float4(zero & zero, zero & one, one & zero, one & one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int zero = 0;
+ int one = 1;
+
+ return float4(zero | zero, zero | one, one | zero, one | one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ int zero = 0;
+ int one = 1;
+
+ return float4(zero ^ zero, zero ^ one, one ^ zero, one ^ one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 0.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint x = 5;
+ uint y = 15;
+
+ return float4(x + y, x - y, x * y, x / y);
+}
+
+[test]
+draw quad
+probe all rgba (20.0, 4294967300.0, 75.0, 0.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint x = 5;
+ uint y = 15;
+
+ return float4(x % y, +x, -x, y / x);
+}
+
+[test]
+draw quad
+probe all rgba (5.0, 5.0, 4294967300.0, 3.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint x = 5;
+ uint y = 15;
+
+ return float4(x == y, x != y, x < y, x <= y);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint x = 5;
+ uint y = 15;
+ uint zero = 0;
+
+ return float4(x > y, x >= y, !x, !zero);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint x = 5;
+ uint y = 15;
+
+ return float4(x >> y, y >> x, x << y, y << x);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 163840.0, 480.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint x = 5;
+ uint y = 15;
+
+ return float4(x & y, x | y, x ^ y, ~x);
+}
+
+[test]
+draw quad
+probe all rgba (5.0, 15.0, 10.0, 4294967300.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint zero = 0;
+ uint one = 1;
+
+ return float4(zero && zero, zero && one, one && zero, one && one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint zero = 0;
+ uint one = 1;
+
+ return float4(zero || zero, zero || one, one || zero, one || one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint zero = 0;
+ uint one = 1;
+
+ return float4(zero & zero, zero & one, one & zero, one & one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 0.0, 0.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint zero = 0;
+ uint one = 1;
+
+ return float4(zero | zero, zero | one, one | zero, one | one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 1.0)
+
+[pixel shader]
+float4 main() : SV_TARGET
+{
+ uint zero = 0;
+ uint one = 1;
+
+ return float4(zero ^ zero, zero ^ one, one ^ zero, one ^ one);
+}
+
+[test]
+draw quad
+probe all rgba (0.0, 1.0, 1.0, 0.0)
--
2.34.1
Jan. 28, 2022
[PATCH vkd3d v4 1/6] tests: Test matrix multiplication.
by Giovanni Mascellani
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
v2:
* Split to many individual tests
---
Makefile.am | 2 +
tests/hlsl-mul.shader_test | 290 +++++++++++++++++++++++++++++++++++++
2 files changed, 292 insertions(+)
create mode 100644 tests/hlsl-mul.shader_test
diff --git a/Makefile.am b/Makefile.am
index 82807a42..95c2aaa7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -71,6 +71,7 @@ vkd3d_shader_tests = \
tests/hlsl-invalid.shader_test \
tests/hlsl-majority-pragma.shader_test \
tests/hlsl-majority-typedef.shader_test \
+ tests/hlsl-mul.shader_test \
tests/hlsl-nested-arrays.shader_test \
tests/hlsl-numeric-types.shader_test \
tests/hlsl-return-implicit-conversion.shader_test \
@@ -302,6 +303,7 @@ XFAIL_TESTS = \
tests/hlsl-intrinsic-override.shader_test \
tests/hlsl-majority-pragma.shader_test \
tests/hlsl-majority-typedef.shader_test \
+ tests/hlsl-mul.shader_test \
tests/hlsl-nested-arrays.shader_test \
tests/hlsl-numeric-types.shader_test \
tests/hlsl-return-implicit-conversion.shader_test \
diff --git a/tests/hlsl-mul.shader_test b/tests/hlsl-mul.shader_test
new file mode 100644
index 00000000..7b453187
--- /dev/null
+++ b/tests/hlsl-mul.shader_test
@@ -0,0 +1,290 @@
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float4 y = float4(1.0, 2.0, 3.0, 4.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (30.0, 70.0, 110.0, 150.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4 x = float4(1.0, 2.0, 3.0, 4.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (90.0, 100.0, 110.0, 120.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float3 y = float3(1.0, 2.0, 3.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (14.0, 38.0, 62.0, 86.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float3 x = float3(1.0, 2.0, 3.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (38.0, 44.0, 50.0, 56.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float3x3 x = float3x3(1.0, 2.0, 3.0,
+ 4.0, 5.0, 6.0,
+ 7.0, 8.0, 9.0);
+ float4 y = float4(1.0, 2.0, 3.0, 4.0);
+
+ return float4(mul(x, y), 0.0);
+}
+
+[test]
+draw quad
+probe all rgba (14.0, 32.0, 50.0, 0.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4 x = float4(1.0, 2.0, 3.0, 4.0);
+ float3x3 y = float3x3(1.0, 2.0, 3.0,
+ 4.0, 5.0, 6.0,
+ 7.0, 8.0, 9.0);
+
+ return float4(mul(x, y), 0.0);
+}
+
+[test]
+draw quad
+probe all rgba (30.0, 36.0, 42.0, 0.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float x = 10.0;
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y)[1];
+}
+
+[test]
+draw quad
+probe all rgba (50.0, 60.0, 70.0, 80.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float y = 10.0;
+
+ return mul(x, y)[1];
+}
+
+[test]
+draw quad
+probe all rgba (50.0, 60.0, 70.0, 80.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float1 x = float1(10.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (10.0, 20.0, 30.0, 40.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float1 y = float1(10.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (10.0, 50.0, 90.0, 130.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float1x1 x = float1x1(10.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (10.0, 20.0, 30.0, 40.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float1x1 y = float1x1(10.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (10.0, 50.0, 90.0, 130.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float1x4 x = float1x4(1.0, 2.0, 3.0, 4.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (90.0, 100.0, 110.0, 120.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float1x4 y = float1x4(1.0, 2.0, 3.0, 4.0);
+
+ return mul(x, y)[1];
+}
+
+[test]
+draw quad
+probe all rgba (5.0, 10.0, 15.0, 20.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x1 x = float4x1(1.0, 2.0, 3.0, 4.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y)[1];
+}
+
+[test]
+draw quad
+probe all rgba (2.0, 4.0, 6.0, 8.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float4x1 y = float4x1(1.0, 2.0, 3.0, 4.0);
+
+ return mul(x, y);
+}
+
+[test]
+draw quad
+probe all rgba (30.0, 70.0, 110.0, 150.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float3x3 x = float3x3(1.0, 2.0, 3.0,
+ 4.0, 5.0, 6.0,
+ 7.0, 8.0, 9.0);
+ float4x4 y = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+
+ return mul(x, y)[1];
+}
+
+[test]
+draw quad
+probe all rgba (83.0, 98.0, 113.0, 128.0)
+
+[pixel shader]
+float4 main(float4 pos : sv_position) : sv_target
+{
+ float4x4 x = float4x4(1.0, 2.0, 3.0, 4.0,
+ 5.0, 6.0, 7.0, 8.0,
+ 9.0, 10.0, 11.0, 12.0,
+ 13.0, 14.0, 15.0, 16.0);
+ float3x3 y = float3x3(1.0, 2.0, 3.0,
+ 4.0, 5.0, 6.0,
+ 7.0, 8.0, 9.0);
+
+ return float4(mul(x, y)[1], 0.0);
+}
+
+[test]
+draw quad
+probe all rgba (78.0, 96.0, 114.0, 0.0)
--
2.34.1
Jan. 28, 2022
Re: [PATCH vkd3d v3 3/6] vkd3d-shader/hlsl: Write SM4 unsigned multiplication instructions.
by Giovanni Mascellani
Il 27/01/22 23:36, Zebediah Figura (she/her) ha scritto:
> This crashes now, because sm4_register_from_node() doesn't treat the
> swizzle_type parameter as optional.
Ouch, sorry about that!
Giovanni.
Jan. 28, 2022
Re: [PATCH 08/24] mfmediaengine/tests: Avoid "misleading indentation" warnings.
by Nikolay Sivov
I sent some fixes that remove all remaining todos, so this patch is no
longer needed.
Jan. 28, 2022
[PATCH 6/6] mfmediaengine: Improve AddRange() behavior for intersecting ranges.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mfmediaengine/main.c | 28 ++++++-
dlls/mfmediaengine/tests/mfmediaengine.c | 101 ++++++++++++++++++++---
2 files changed, 115 insertions(+), 14 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 84d7677a328..4b5a3f83446 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -653,13 +653,35 @@ static BOOL WINAPI time_range_ContainsTime(IMFMediaTimeRange *iface, double time
static HRESULT WINAPI time_range_AddRange(IMFMediaTimeRange *iface, double start, double end)
{
struct time_range *range = impl_from_IMFMediaTimeRange(iface);
+ struct range *c;
+ size_t i;
TRACE("%p, %.8e, %.8e.\n", iface, start, end);
- if (range->count)
+ for (i = 0; i < range->count; ++i)
{
- FIXME("Range merging is not implemented.\n");
- return E_NOTIMPL;
+ c = &range->ranges[i];
+
+ /* New range is fully contained within existing one. */
+ if (c->start <= start && c->end >= end)
+ return S_OK;
+
+ /* New range fully contains existing one. */
+ if (c->start >= start && c->end <= end)
+ {
+ c->start = start;
+ c->end = end;
+ return S_OK;
+ }
+
+ /* Merge if ranges intersect. */
+ if ((start >= c->start && start <= c->end) ||
+ (end >= c->start && end <= c->end))
+ {
+ c->start = min(c->start, start);
+ c->end = max(c->end, end);
+ return S_OK;
+ }
}
if (!mf_array_reserve((void **)&range->ranges, &range->capacity, range->count + 1, sizeof(*range->ranges)))
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 00690b25ebe..d5a118677e5 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -729,7 +729,6 @@ static void test_time_range(void)
ok(end == 1.0, "Unexpected end %.e.\n", end);
hr = IMFMediaTimeRange_AddRange(range, 2.0, 3.0);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
count = IMFMediaTimeRange_GetLength(range);
@@ -737,49 +736,129 @@ todo_wine
hr = IMFMediaTimeRange_GetStart(range, 0, &start);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-todo_wine
ok(start == 2.0, "Unexpected start %.8e.\n", start);
hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-todo_wine
ok(end == 3.0, "Unexpected end %.8e.\n", end);
hr = IMFMediaTimeRange_AddRange(range, 10.0, 9.0);
-todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
count = IMFMediaTimeRange_GetLength(range);
-todo_wine
ok(count == 2, "Unexpected range count.\n");
hr = IMFMediaTimeRange_GetStart(range, 0, &start);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-todo_wine
ok(start == 2.0, "Unexpected start %.8e.\n", start);
hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-todo_wine
ok(end == 3.0, "Unexpected end %.8e.\n", end);
start = 0.0;
hr = IMFMediaTimeRange_GetStart(range, 1, &start);
-todo_wine {
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(start == 10.0, "Unexpected start %.8e.\n", start);
-}
+
hr = IMFMediaTimeRange_GetEnd(range, 1, &end);
-todo_wine {
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(end == 9.0, "Unexpected end %.8e.\n", end);
-}
+
+ hr = IMFMediaTimeRange_AddRange(range, 2.0, 9.1);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IMFMediaTimeRange_GetLength(range);
+ ok(count == 2, "Unexpected range count.\n");
+
+ hr = IMFMediaTimeRange_GetStart(range, 0, &start);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(start == 2.0, "Unexpected start %.8e.\n", start);
+
+ hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(end == 9.1, "Unexpected end %.8e.\n", end);
+
+ hr = IMFMediaTimeRange_GetStart(range, 1, &start);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(start == 10.0, "Unexpected start %.8e.\n", start);
+
+ hr = IMFMediaTimeRange_GetEnd(range, 1, &end);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(end == 9.0, "Unexpected end %.8e.\n", end);
+
+ hr = IMFMediaTimeRange_AddRange(range, 8.5, 2.5);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IMFMediaTimeRange_GetLength(range);
+ ok(count == 2, "Unexpected range count.\n");
+
+ hr = IMFMediaTimeRange_GetStart(range, 0, &start);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(start == 2.0, "Unexpected start %.8e.\n", start);
+
+ hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(end == 9.1, "Unexpected end %.8e.\n", end);
+
+ hr = IMFMediaTimeRange_AddRange(range, 20.0, 20.0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IMFMediaTimeRange_GetLength(range);
+ ok(count == 3, "Unexpected range count.\n");
+
hr = IMFMediaTimeRange_Clear(range);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
count = IMFMediaTimeRange_GetLength(range);
ok(!count, "Unexpected range count.\n");
+ /* Intersect */
+ hr = IMFMediaTimeRange_AddRange(range, 5.0, 10.0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFMediaTimeRange_AddRange(range, 6.0, 12.0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFMediaTimeRange_GetStart(range, 0, &start);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(start == 5.0, "Unexpected start %.8e.\n", start);
+
+ hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(end == 12.0, "Unexpected end %.8e.\n", end);
+
+ count = IMFMediaTimeRange_GetLength(range);
+ ok(count == 1, "Unexpected range count.\n");
+
+ hr = IMFMediaTimeRange_AddRange(range, 4.0, 6.0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IMFMediaTimeRange_GetLength(range);
+ ok(count == 1, "Unexpected range count.\n");
+
+ hr = IMFMediaTimeRange_GetStart(range, 0, &start);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(start == 4.0, "Unexpected start %.8e.\n", start);
+
+ hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(end == 12.0, "Unexpected end %.8e.\n", end);
+
+ hr = IMFMediaTimeRange_AddRange(range, 5.0, 3.0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IMFMediaTimeRange_GetLength(range);
+ ok(count == 1, "Unexpected range count.\n");
+
+ hr = IMFMediaTimeRange_GetStart(range, 0, &start);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(start == 4.0, "Unexpected start %.8e.\n", start);
+
+ hr = IMFMediaTimeRange_GetEnd(range, 0, &end);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(end == 12.0, "Unexpected end %.8e.\n", end);
+
IMFMediaTimeRange_Release(range);
}
--
2.34.1
Jan. 28, 2022
[PATCH 5/6] mfmediaengine: Handle shutdown state in a few stubs.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mfmediaengine/main.c | 60 ++++++++++++++++++++++--
dlls/mfmediaengine/tests/mfmediaengine.c | 5 --
2 files changed, 55 insertions(+), 10 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 91f1224f4b0..84d7677a328 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -1538,16 +1538,36 @@ static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngineEx *iface, IMFMedia
static HRESULT WINAPI media_engine_Load(IMFMediaEngineEx *iface)
{
+ struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+ HRESULT hr = E_NOTIMPL;
+
FIXME("(%p): stub.\n", iface);
- return E_NOTIMPL;
+ EnterCriticalSection(&engine->cs);
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static HRESULT WINAPI media_engine_CanPlayType(IMFMediaEngineEx *iface, BSTR type, MF_MEDIA_ENGINE_CANPLAY *answer)
{
+ struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+ HRESULT hr = E_NOTIMPL;
+
FIXME("(%p, %s, %p): stub.\n", iface, debugstr_w(type), answer);
- return E_NOTIMPL;
+ EnterCriticalSection(&engine->cs);
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static USHORT WINAPI media_engine_GetReadyState(IMFMediaEngineEx *iface)
@@ -1595,9 +1615,19 @@ static double WINAPI media_engine_GetCurrentTime(IMFMediaEngineEx *iface)
static HRESULT WINAPI media_engine_SetCurrentTime(IMFMediaEngineEx *iface, double time)
{
+ struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+ HRESULT hr = E_NOTIMPL;
+
FIXME("(%p, %f): stub.\n", iface, time);
- return E_NOTIMPL;
+ EnterCriticalSection(&engine->cs);
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static double WINAPI media_engine_GetStartTime(IMFMediaEngineEx *iface)
@@ -1705,16 +1735,36 @@ static HRESULT WINAPI media_engine_SetPlaybackRate(IMFMediaEngineEx *iface, doub
static HRESULT WINAPI media_engine_GetPlayed(IMFMediaEngineEx *iface, IMFMediaTimeRange **played)
{
+ struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+ HRESULT hr = E_NOTIMPL;
+
FIXME("(%p, %p): stub.\n", iface, played);
- return E_NOTIMPL;
+ EnterCriticalSection(&engine->cs);
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static HRESULT WINAPI media_engine_GetSeekable(IMFMediaEngineEx *iface, IMFMediaTimeRange **seekable)
{
+ struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+ HRESULT hr = E_NOTIMPL;
+
FIXME("(%p, %p): stub.\n", iface, seekable);
- return E_NOTIMPL;
+ EnterCriticalSection(&engine->cs);
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static BOOL WINAPI media_engine_IsEnded(IMFMediaEngineEx *iface)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 6e201893b0c..00690b25ebe 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -344,12 +344,10 @@ static void test_Shutdown(void)
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_Load(media_engine);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
str = SysAllocString(L"video/mp4");
hr = IMFMediaEngine_CanPlayType(media_engine, str, &state);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
SysFreeString(str);
@@ -363,7 +361,6 @@ todo_wine
ok(val == 0.0, "Unexpected time %f.\n", val);
hr = IMFMediaEngine_SetCurrentTime(media_engine, 1.0);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
val = IMFMediaEngine_GetStartTime(media_engine);
@@ -382,11 +379,9 @@ todo_wine
ok(val == 1.0, "Unexpected rate %f.\n", val);
hr = IMFMediaEngine_GetPlayed(media_engine, &time_range);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_GetSeekable(media_engine, &time_range);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
state = IMFMediaEngine_IsEnded(media_engine);
--
2.34.1
Jan. 28, 2022
[PATCH 4/6] mfmediaengine: Handle shutdown state in GetBuffered().
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mfmediaengine/main.c | 6 +++++-
dlls/mfmediaengine/tests/mfmediaengine.c | 1 -
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 490d1630e95..91f1224f4b0 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -1525,8 +1525,12 @@ static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngineEx *iface, IMFMedia
return hr;
EnterCriticalSection(&engine->cs);
- if (!isnan(engine->duration))
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+ else if (!isnan(engine->duration))
hr = IMFMediaTimeRange_AddRange(*range, 0.0, engine->duration);
+
LeaveCriticalSection(&engine->cs);
return hr;
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 388af4b1877..6e201893b0c 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -341,7 +341,6 @@ static void test_Shutdown(void)
ok(state == 100, "Unexpected state %d.\n", state);
hr = IMFMediaEngine_GetBuffered(media_engine, &time_range);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_Load(media_engine);
--
2.34.1
Jan. 28, 2022
[PATCH 3/6] mfmediaengine: Handle shutdown state in Pause().
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mfmediaengine/main.c | 22 ++++++++++++++--------
dlls/mfmediaengine/tests/mfmediaengine.c | 1 -
2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 87851cee9c4..490d1630e95 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -1820,25 +1820,31 @@ static HRESULT WINAPI media_engine_Play(IMFMediaEngineEx *iface)
static HRESULT WINAPI media_engine_Pause(IMFMediaEngineEx *iface)
{
struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+ HRESULT hr = S_OK;
TRACE("%p.\n", iface);
EnterCriticalSection(&engine->cs);
- if (!(engine->flags & FLAGS_ENGINE_PAUSED))
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+ else
{
- media_engine_set_flag(engine, FLAGS_ENGINE_WAITING | FLAGS_ENGINE_IS_ENDED, FALSE);
- media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, TRUE);
+ if (!(engine->flags & FLAGS_ENGINE_PAUSED))
+ {
+ media_engine_set_flag(engine, FLAGS_ENGINE_WAITING | FLAGS_ENGINE_IS_ENDED, FALSE);
+ media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, TRUE);
- IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0);
- IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PAUSE, 0, 0);
- }
+ IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0);
+ IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PAUSE, 0, 0);
+ }
- IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0);
+ IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0);
+ }
LeaveCriticalSection(&engine->cs);
- return S_OK;
+ return hr;
}
static BOOL WINAPI media_engine_GetMuted(IMFMediaEngineEx *iface)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index ac34bd7c4cd..388af4b1877 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -417,7 +417,6 @@ todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_Pause(media_engine);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
state = IMFMediaEngine_GetMuted(media_engine);
--
2.34.1
Jan. 28, 2022