winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
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
List overview
wine-commits
February 2024
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
716 discussions
Start a n
N
ew thread
Conor McCarthy : vkd3d-shader/dxil: Implement DX intrinsic Sample.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: vkd3d Branch: master Commit: 5178fb7364169d0f39000de7d17bb1e5bdf4b4c7 URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/5178fb7364169d0f39000de7d17bb…
Author: Conor McCarthy <cmccarthy(a)codeweavers.com> Date: Mon Feb 12 16:56:09 2024 +1000 vkd3d-shader/dxil: Implement DX intrinsic Sample. --- libs/vkd3d-shader/dxil.c | 69 ++++++++++++++++++++-- tests/hlsl/cbuffer.shader_test | 2 +- tests/hlsl/object-references.shader_test | 2 +- .../register-reservations-resources.shader_test | 4 +- tests/hlsl/sampler-offset.shader_test | 6 +- tests/hlsl/sampler.shader_test | 4 +- tests/hlsl/static-initializer.shader_test | 4 +- 7 files changed, 76 insertions(+), 15 deletions(-) diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index eeabc1c1..0f17f0e1 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -376,6 +376,7 @@ enum dx_intrinsic_opcode DX_UBFE = 52, DX_CREATE_HANDLE = 57, DX_CBUFFER_LOAD_LEGACY = 59, + DX_SAMPLE = 60, DX_TEXTURE_LOAD = 66, DX_TEXTURE_STORE = 67, DX_BUFFER_LOAD = 68, @@ -2428,6 +2429,26 @@ static bool sm6_value_validate_is_texture_handle(const struct sm6_value *value, return true; } +static bool sm6_value_validate_is_sampler_handle(const struct sm6_value *value, enum dx_intrinsic_opcode op, + struct sm6_parser *sm6) +{ + enum dxil_resource_kind kind; + + if (!sm6_value_validate_is_handle(value, sm6)) + return false; + + kind = value->u.handle.d->kind; + if (kind != RESOURCE_KIND_SAMPLER) + { + WARN("Resource kind %u for op %u is not a sampler.\n", kind, op); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCE_HANDLE, + "Resource kind %u for sample operation %u is not a sampler.", kind, op); + return false; + } + + return true; +} + static bool sm6_value_validate_is_pointer(const struct sm6_value *value, struct sm6_parser *sm6) { if (!sm6_type_is_pointer(value->type)) @@ -3661,11 +3682,10 @@ static bool sm6_parser_emit_composite_construct(struct sm6_parser *sm6, const st } static bool sm6_parser_emit_coordinate_construct(struct sm6_parser *sm6, const struct sm6_value **operands, - const struct sm6_value *z_operand, struct function_emission_state *state, + unsigned int max_operands, const struct sm6_value *z_operand, struct function_emission_state *state, struct vkd3d_shader_register *reg) { const struct vkd3d_shader_register *operand_regs[VKD3D_VEC4_SIZE]; - const unsigned int max_operands = 3; unsigned int component_count; for (component_count = 0; component_count < max_operands; ++component_count) @@ -4047,6 +4067,46 @@ static void instruction_set_texel_offset(struct vkd3d_shader_instruction *ins, ins->texel_offset.w = sm6_value_get_texel_offset(operands[2]); } +static void sm6_parser_emit_dx_sample(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, + const struct sm6_value **operands, struct function_emission_state *state) +{ + const struct sm6_value *resource, *sampler; + struct vkd3d_shader_src_param *src_params; + struct vkd3d_shader_instruction *ins; + struct vkd3d_shader_register coord; + const unsigned int clamp_idx = 9; + + resource = operands[0]; + sampler = operands[1]; + if (!sm6_value_validate_is_texture_handle(resource, op, sm6) + || !sm6_value_validate_is_sampler_handle(sampler, op, sm6)) + { + return; + } + + if (!sm6_parser_emit_coordinate_construct(sm6, &operands[2], VKD3D_VEC4_SIZE, NULL, state, &coord)) + return; + + ins = state->ins; + instruction_init_with_resource(ins, VKD3DSIH_SAMPLE, resource, sm6); + if (!(src_params = instruction_src_params_alloc(ins, 3, sm6))) + return; + + if (!sm6_value_is_undef(operands[clamp_idx])) + { + FIXME("Ignoring LOD clamp value.\n"); + vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS, + "Ignoring LOD clamp value for a sample operation."); + } + + src_param_init_vector_from_reg(&src_params[0], &coord); + src_param_init_vector_from_reg(&src_params[1], &resource->u.handle.reg); + src_param_init_vector_from_reg(&src_params[2], &sampler->u.handle.reg); + instruction_set_texel_offset(ins, &operands[6], sm6); + + instruction_dst_param_init_ssa_vector(ins, VKD3D_VEC4_SIZE, sm6); +} + static void sm6_parser_emit_dx_sincos(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, const struct sm6_value **operands, struct function_emission_state *state) { @@ -4157,7 +4217,7 @@ static void sm6_parser_emit_dx_texture_load(struct sm6_parser *sm6, enum dx_intr is_uav = resource->u.handle.d->type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV; mip_level_or_sample_count = (resource_type != VKD3D_SHADER_RESOURCE_BUFFER) ? operands[1] : NULL; - if (!sm6_parser_emit_coordinate_construct(sm6, &operands[2], + if (!sm6_parser_emit_coordinate_construct(sm6, &operands[2], 3, is_multisample ? NULL : mip_level_or_sample_count, state, &coord)) { return; @@ -4194,7 +4254,7 @@ static void sm6_parser_emit_dx_texture_store(struct sm6_parser *sm6, enum dx_int if (!sm6_value_validate_is_texture_handle(resource, op, sm6)) return; - if (!sm6_parser_emit_coordinate_construct(sm6, &operands[1], NULL, state, &coord)) + if (!sm6_parser_emit_coordinate_construct(sm6, &operands[1], 3, NULL, state, &coord)) return; write_mask = sm6_value_get_constant_uint(operands[8]); @@ -4297,6 +4357,7 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] = [DX_ROUND_PI ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_ROUND_Z ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_RSQRT ] = {"g", "R", sm6_parser_emit_dx_unary}, + [DX_SAMPLE ] = {"o", "HHffffiiif", sm6_parser_emit_dx_sample}, [DX_SIN ] = {"g", "R", sm6_parser_emit_dx_sincos}, [DX_SPLIT_DOUBLE ] = {"S", "d", sm6_parser_emit_dx_split_double}, [DX_SQRT ] = {"g", "R", sm6_parser_emit_dx_unary}, diff --git a/tests/hlsl/cbuffer.shader_test b/tests/hlsl/cbuffer.shader_test index 62f1cd28..ee19ea5f 100644 --- a/tests/hlsl/cbuffer.shader_test +++ b/tests/hlsl/cbuffer.shader_test @@ -499,7 +499,7 @@ float4 main() : sv_target uniform 0 float4 1.0 0.0 0.0 0.0 uniform 4 float4 0.0 2.0 0.0 0.0 uniform 8 float4 0.0 0.0 3.0 0.0 -todo(sm>=6) draw quad +draw quad probe all rgba (1.0, 2.0, 0.0, 4.0) diff --git a/tests/hlsl/object-references.shader_test b/tests/hlsl/object-references.shader_test index 698df011..26f7a52a 100644 --- a/tests/hlsl/object-references.shader_test +++ b/tests/hlsl/object-references.shader_test @@ -46,7 +46,7 @@ float4 main() : sv_target } [test] -todo(sm>=6) draw quad +draw quad probe all rgba (77.77, 77.77, 77.77, 77.77) diff --git a/tests/hlsl/register-reservations-resources.shader_test b/tests/hlsl/register-reservations-resources.shader_test index 1fa1e916..b1007de6 100644 --- a/tests/hlsl/register-reservations-resources.shader_test +++ b/tests/hlsl/register-reservations-resources.shader_test @@ -224,8 +224,8 @@ float4 main() : sv_target } [test] -todo draw quad -todo probe all rgba (0.5, 0.5, 0.5, 99.0) +todo(sm<6) draw quad +todo(sm<6) probe all rgba (0.5, 0.5, 0.5, 99.0) [pixel shader] diff --git a/tests/hlsl/sampler-offset.shader_test b/tests/hlsl/sampler-offset.shader_test index 498a8ed3..6f8357df 100644 --- a/tests/hlsl/sampler-offset.shader_test +++ b/tests/hlsl/sampler-offset.shader_test @@ -22,7 +22,7 @@ float4 main() : sv_target } [test] -todo(sm>=6) draw quad +draw quad probe all rgba (0.1, 0.2, 0.5, 0.0) @@ -36,7 +36,7 @@ float4 main() : sv_target } [test] -todo(sm>=6) draw quad +draw quad probe all rgba (0.2, 0.2, 0.0, 0.4) @@ -50,5 +50,5 @@ float4 main() : sv_target } [test] -todo(sm>=6) draw quad +draw quad probe all rgba (0.0, 0.2, 0.0, 0.4) diff --git a/tests/hlsl/sampler.shader_test b/tests/hlsl/sampler.shader_test index 9a5fa6df..17b09c0e 100644 --- a/tests/hlsl/sampler.shader_test +++ b/tests/hlsl/sampler.shader_test @@ -17,7 +17,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | sm>=6) draw quad +todo(sm<4) draw quad probe all rgba (0.25, 0, 0.25, 0) [pixel shader todo(sm<4)] @@ -30,7 +30,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | sm>=6) draw quad +todo(sm<4) draw quad probe all rgba (0.25, 0, 0.25, 0) [pixel shader fail] diff --git a/tests/hlsl/static-initializer.shader_test b/tests/hlsl/static-initializer.shader_test index 0c51bac7..e7cfa9f5 100644 --- a/tests/hlsl/static-initializer.shader_test +++ b/tests/hlsl/static-initializer.shader_test @@ -147,7 +147,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | sm>=6) draw quad +todo(sm<4) draw quad probe all rgba (1, 2, 3, 4) @@ -163,7 +163,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | sm>=6) draw quad +todo(sm<4) draw quad probe all rgba (1, 2, 3, 4)
1
0
0
0
Conor McCarthy : vkd3d-shader/dxil: Load sampler descriptors.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: vkd3d Branch: master Commit: 0a3eb611704e6aee17e864a3e829fcbb74736123 URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/0a3eb611704e6aee17e864a3e829f…
Author: Conor McCarthy <cmccarthy(a)codeweavers.com> Date: Mon Feb 12 16:54:29 2024 +1000 vkd3d-shader/dxil: Load sampler descriptors. --- libs/vkd3d-shader/dxil.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index a001f6f0..eeabc1c1 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -228,6 +228,13 @@ enum dxil_component_type COMPONENT_TYPE_PACKEDU8X32 = 18, }; +enum dxil_sampler_kind +{ + SAMPLER_KIND_DEFAULT = 0, + SAMPLER_KIND_COMPARISON = 1, + SAMPLER_KIND_MONO = 2, +}; + enum dxil_semantic_kind { SEMANTIC_KIND_ARBITRARY = 0, @@ -6755,6 +6762,70 @@ static enum vkd3d_result sm6_parser_resources_load_cbv(struct sm6_parser *sm6, return VKD3D_OK; } +static enum vkd3d_result sm6_parser_resources_load_sampler(struct sm6_parser *sm6, + const struct sm6_metadata_node *node, struct sm6_descriptor_info *d, struct vkd3d_shader_instruction *ins) +{ + struct vkd3d_shader_register *reg; + unsigned int kind; + + if (node->operand_count < 7) + { + WARN("Invalid operand count %u.\n", node->operand_count); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND_COUNT, + "Invalid operand count %u for a sampler descriptor.", node->operand_count); + return VKD3D_ERROR_INVALID_SHADER; + } + if (node->operand_count > 7 && node->operands[7]) + { + WARN("Ignoring %u extra operands.\n", node->operand_count - 7); + vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS, + "Ignoring %u extra operands for a sampler descriptor.", node->operand_count - 7); + } + + vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_DCL_SAMPLER); + ins->resource_type = VKD3D_SHADER_RESOURCE_NONE; + + if (!sm6_metadata_get_uint_value(sm6, node->operands[6], &kind)) + { + WARN("Failed to load sampler mode.\n"); + vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES, + "Sampler mode metadata value is not an integer."); + return VKD3D_ERROR_INVALID_SHADER; + } + switch (kind) + { + case SAMPLER_KIND_DEFAULT: + break; + case SAMPLER_KIND_COMPARISON: + ins->flags = VKD3DSI_SAMPLER_COMPARISON_MODE; + break; + default: + FIXME("Ignoring sampler kind %u.\n", kind); + vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS, + "Ignoring sampler kind %u.", kind); + break; + } + + ins->declaration.sampler.src.swizzle = VKD3D_SHADER_NO_SWIZZLE; + ins->declaration.sampler.src.modifiers = VKD3DSPSM_NONE; + + reg = &ins->declaration.sampler.src.reg; + vsir_register_init(reg, VKD3DSPR_SAMPLER, VKD3D_DATA_UNUSED, 3); + reg->idx[0].offset = d->id; + reg->idx[1].offset = d->range.first; + reg->idx[2].offset = d->range.last; + + ins->declaration.sampler.range = d->range; + + d->resource_type = ins->resource_type; + d->kind = RESOURCE_KIND_SAMPLER; + d->reg_type = VKD3DSPR_SAMPLER; + d->reg_data_type = VKD3D_DATA_UNUSED; + d->resource_data_type = VKD3D_DATA_UNUSED; + + return VKD3D_OK; +} + static enum vkd3d_result sm6_parser_descriptor_type_init(struct sm6_parser *sm6, enum vkd3d_shader_descriptor_type type, const struct sm6_metadata_node *descriptor_node) { @@ -6831,6 +6902,10 @@ static enum vkd3d_result sm6_parser_descriptor_type_init(struct sm6_parser *sm6, if ((ret = sm6_parser_resources_load_uav(sm6, node, d, ins)) < 0) return ret; break; + case VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER: + if ((ret = sm6_parser_resources_load_sampler(sm6, node, d, ins)) < 0) + return ret; + break; default: FIXME("Unsupported descriptor type %u.\n", type); vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES,
1
0
0
0
Geoffrey McRae : include: Add interfaces for ID3D11On12Device1 and ID3D11On12Device2.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: b8c75f3d2a851dbfd0735c24f0951f365303b741 URL:
https://gitlab.winehq.org/wine/wine/-/commit/b8c75f3d2a851dbfd0735c24f0951f…
Author: Geoffrey McRae <geoff(a)hostfission.com> Date: Sun Jan 28 14:47:32 2024 +1100 include: Add interfaces for ID3D11On12Device1 and ID3D11On12Device2. --- include/d3d11on12.idl | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/include/d3d11on12.idl b/include/d3d11on12.idl index 42083911328..fb9037cf2f3 100644 --- a/include/d3d11on12.idl +++ b/include/d3d11on12.idl @@ -59,3 +59,32 @@ typedef HRESULT (__stdcall *PFN_D3D11ON12_CREATE_DEVICE)(IUnknown *device, UINT IUnknown * const *queues, UINT queue_count, UINT node_mask, ID3D11Device **d3d11_device, ID3D11DeviceContext **d3d11_immediate_context, D3D_FEATURE_LEVEL *obtained_feature_level); + +[ + uuid(bdb64df4-ea2f-4c70-b861-aaab1258bb5d), + object, + local, + pointer_default(unique) +] +interface ID3D11On12Device1 : ID3D11On12Device +{ + HRESULT GetD3D12Device(REFIID iid, ID3D12Device **d3d12_device); +} + +[ + uuid(dc90f331-4740-43fa-866e-67f12cb58223), + object, + local, + pointer_default(unique) +] +interface ID3D11On12Device2 : ID3D11On12Device1 +{ + HRESULT UnwrapUnderlyingResource(ID3D11Resource *d3d11_resource, + ID3D12CommandQueue *d3d12_command_queue, + REFIID iid, void **d3d12_resource); + + HRESULT ReturnUnderlyingResource(ID3D11Resource *d3d11_resource, + UINT num_sync, + UINT64 *signal_values, + ID3D12Fence **fences); +}
1
0
0
0
Marc-Aurel Zent : server: Improve formatting in mach init_tracing_mechanism().
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: 1eb8f41e549b19377181c0f948fbfca4ece0aa69 URL:
https://gitlab.winehq.org/wine/wine/-/commit/1eb8f41e549b19377181c0f948fbfc…
Author: Marc-Aurel Zent <mzent(a)codeweavers.com> Date: Wed Jan 17 19:04:34 2024 +0100 server: Improve formatting in mach init_tracing_mechanism(). --- server/mach.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server/mach.c b/server/mach.c index 5f4c710da4f..86ff7eac382 100644 --- a/server/mach.c +++ b/server/mach.c @@ -100,18 +100,18 @@ void init_tracing_mechanism(void) { mach_port_t bp; - if (task_get_bootstrap_port(mach_task_self(), &bp) != KERN_SUCCESS) - fatal_error("Can't find bootstrap port\n"); - if (mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &server_mach_port) != KERN_SUCCESS) - fatal_error("Can't allocate port\n"); + if (task_get_bootstrap_port( mach_task_self(), &bp ) != KERN_SUCCESS) + fatal_error( "Can't find bootstrap port\n" ); + if (mach_port_allocate( mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &server_mach_port ) != KERN_SUCCESS) + fatal_error( "Can't allocate port\n" ); if (mach_port_insert_right( mach_task_self(), server_mach_port, server_mach_port, MACH_MSG_TYPE_MAKE_SEND ) != KERN_SUCCESS) - fatal_error("Error inserting rights\n"); + fatal_error( "Error inserting rights\n" ); if (bootstrap_register2( bp, server_dir, server_mach_port, 0 ) != KERN_SUCCESS) - fatal_error("Can't check in server_mach_port\n"); - mach_port_deallocate(mach_task_self(), bp); + fatal_error( "Can't check in server_mach_port\n" ); + mach_port_deallocate( mach_task_self(), bp ); } /* initialize the per-process tracing mechanism */
1
0
0
0
Marc-Aurel Zent : server: Use bootstrap_register2() instead of bootstrap_register().
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: dee10199cc549baebe4080ba7accefab502069ef URL:
https://gitlab.winehq.org/wine/wine/-/commit/dee10199cc549baebe4080ba7accef…
Author: Marc-Aurel Zent <mzent(a)codeweavers.com> Date: Wed Jan 17 19:01:49 2024 +0100 server: Use bootstrap_register2() instead of bootstrap_register(). --- server/mach.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/mach.c b/server/mach.c index 81c5ef10ab1..5f4c710da4f 100644 --- a/server/mach.c +++ b/server/mach.c @@ -93,6 +93,8 @@ static int is_rosetta( void ) return rosetta_status; } +extern kern_return_t bootstrap_register2( mach_port_t bp, name_t service_name, mach_port_t sp, uint64_t flags ); + /* initialize the process control mechanism */ void init_tracing_mechanism(void) { @@ -107,7 +109,7 @@ void init_tracing_mechanism(void) server_mach_port, MACH_MSG_TYPE_MAKE_SEND ) != KERN_SUCCESS) fatal_error("Error inserting rights\n"); - if (bootstrap_register(bp, server_dir, server_mach_port) != KERN_SUCCESS) + if (bootstrap_register2( bp, server_dir, server_mach_port, 0 ) != KERN_SUCCESS) fatal_error("Can't check in server_mach_port\n"); mach_port_deallocate(mach_task_self(), bp); }
1
0
0
0
Marc-Aurel Zent : server: Use __pthread_kill() syscall wrapper.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: 52f34cf976bceef835ac7510eb3b75ae170f5eeb URL:
https://gitlab.winehq.org/wine/wine/-/commit/52f34cf976bceef835ac7510eb3b75…
Author: Marc-Aurel Zent <mzent(a)codeweavers.com> Date: Wed Jan 17 18:55:28 2024 +0100 server: Use __pthread_kill() syscall wrapper. --- server/mach.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server/mach.c b/server/mach.c index a619c1cd2a8..81c5ef10ab1 100644 --- a/server/mach.c +++ b/server/mach.c @@ -28,9 +28,6 @@ #include <stdarg.h> #include <sys/types.h> #include <unistd.h> -#ifdef HAVE_SYS_SYSCALL_H -#include <sys/syscall.h> -#endif #ifdef HAVE_SYS_SYSCTL_H #include <sys/sysctl.h> #endif @@ -358,6 +355,8 @@ done: #endif } +extern int __pthread_kill( mach_port_t, int ); + int send_thread_signal( struct thread *thread, int sig ) { int ret = -1; @@ -371,7 +370,7 @@ int send_thread_signal( struct thread *thread, int sig ) if (!mach_port_extract_right( process_port, thread->unix_tid, MACH_MSG_TYPE_COPY_SEND, &port, &type )) { - ret = syscall( SYS___pthread_kill, port, sig ); + ret = __pthread_kill( port, sig ); mach_port_deallocate( mach_task_self(), port ); } else errno = ESRCH;
1
0
0
0
Brendan Shanks : ntdll: Assume process-private futexes are always present on Linux.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: 455086e2958f9118ed7a1f9f52cc90964b8c7dd5 URL:
https://gitlab.winehq.org/wine/wine/-/commit/455086e2958f9118ed7a1f9f52cc90…
Author: Brendan Shanks <bshanks(a)codeweavers.com> Date: Thu Feb 1 09:39:14 2024 -0800 ntdll: Assume process-private futexes are always present on Linux. --- README.md | 2 +- dlls/ntdll/unix/sync.c | 59 ++++++++++++++------------------------------------ 2 files changed, 17 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 888e95895e2..8a804b30dfc 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ especially the wealth of information found at
https://www.winehq.org
. To compile and run Wine, you must have one of the following: -- Linux version 2.0.36 or later +- Linux version 2.6.22 or later - FreeBSD 12.4 or later - Solaris x86 9 or later - NetBSD-current diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index bfbcaf4a851..1df2ea6e9d2 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -103,10 +103,7 @@ static inline ULONGLONG monotonic_counter(void) #ifdef __linux__ -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 - -static int futex_private = 128; +#include <linux/futex.h> static inline int futex_wait( const LONG *addr, int val, struct timespec *timeout ) { @@ -118,32 +115,15 @@ static inline int futex_wait( const LONG *addr, int val, struct timespec *timeou long tv_nsec; } timeout32 = { timeout->tv_sec, timeout->tv_nsec }; - return syscall( __NR_futex, addr, FUTEX_WAIT | futex_private, val, &timeout32, 0, 0 ); + return syscall( __NR_futex, addr, FUTEX_WAIT_PRIVATE, val, &timeout32, 0, 0 ); } #endif - return syscall( __NR_futex, addr, FUTEX_WAIT | futex_private, val, timeout, 0, 0 ); + return syscall( __NR_futex, addr, FUTEX_WAIT_PRIVATE, val, timeout, 0, 0 ); } static inline int futex_wake( const LONG *addr, int val ) { - return syscall( __NR_futex, addr, FUTEX_WAKE | futex_private, val, NULL, 0, 0 ); -} - -static inline int use_futexes(void) -{ - static LONG supported = -1; - - if (supported == -1) - { - futex_wait( &supported, 10, NULL ); - if (errno == ENOSYS) - { - futex_private = 0; - futex_wait( &supported, 10, NULL ); - } - supported = (errno != ENOSYS); - } - return supported; + return syscall( __NR_futex, addr, FUTEX_WAKE_PRIVATE, val, NULL, 0, 0 ); } #endif @@ -2356,11 +2336,10 @@ union tid_alert_entry { #ifdef HAVE_KQUEUE int kq; +#elif defined(__linux__) + LONG futex; #else HANDLE event; -#ifdef __linux__ - LONG futex; -#endif #endif }; @@ -2426,12 +2405,9 @@ static union tid_alert_entry *get_tid_alert_entry( HANDLE tid ) if (InterlockedCompareExchange( (LONG *)&entry->kq, kq, 0 )) close( kq ); } +#elif defined(__linux__) + return entry; #else -#ifdef __linux__ - if (use_futexes()) - return entry; -#endif - if (!entry->event) { HANDLE event; @@ -2473,17 +2449,14 @@ NTSTATUS WINAPI NtAlertThreadByThreadId( HANDLE tid ) kevent( entry->kq, &signal_event, 1, NULL, 0, NULL ); return STATUS_SUCCESS; } -#else -#ifdef __linux__ - if (use_futexes()) +#elif defined(__linux__) { LONG *futex = &entry->futex; if (!InterlockedExchange( futex, 1 )) futex_wake( futex, 1 ); return STATUS_SUCCESS; } -#endif - +#else return NtSetEvent( entry->event, NULL ); #endif } @@ -2571,14 +2544,12 @@ NTSTATUS WINAPI NtWaitForAlertByThreadId( const void *address, const LARGE_INTEG NTSTATUS WINAPI NtWaitForAlertByThreadId( const void *address, const LARGE_INTEGER *timeout ) { union tid_alert_entry *entry = get_tid_alert_entry( NtCurrentTeb()->ClientId.UniqueThread ); - NTSTATUS status; TRACE( "%p %s\n", address, debugstr_timeout( timeout ) ); if (!entry) return STATUS_INVALID_CID; #ifdef __linux__ - if (use_futexes()) { LONG *futex = &entry->futex; ULONGLONG end; @@ -2610,11 +2581,13 @@ NTSTATUS WINAPI NtWaitForAlertByThreadId( const void *address, const LARGE_INTEG } return STATUS_ALERTED; } +#else + { + NTSTATUS status = NtWaitForSingleObject( entry->event, FALSE, timeout ); + if (!status) return STATUS_ALERTED; + return status; + } #endif - - status = NtWaitForSingleObject( entry->event, FALSE, timeout ); - if (!status) return STATUS_ALERTED; - return status; } #endif
1
0
0
0
Yuxuan Shui : dmime: Parse MIDI headers.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: d93275c6ca1a2943444d3c32f3e6373699e664ac URL:
https://gitlab.winehq.org/wine/wine/-/commit/d93275c6ca1a2943444d3c32f3e637…
Author: Yuxuan Shui <yshui(a)codeweavers.com> Date: Wed Feb 7 14:16:27 2024 +0000 dmime: Parse MIDI headers. --- dlls/dmime/Makefile.in | 1 + dlls/dmime/dmime_private.h | 7 +++ dlls/dmime/midi.c | 105 +++++++++++++++++++++++++++++++++++++++++++++ dlls/dmime/segment.c | 16 ++++++- 4 files changed, 128 insertions(+), 1 deletion(-) diff --git a/dlls/dmime/Makefile.in b/dlls/dmime/Makefile.in index cf041ef2b27..f8f622f8f3d 100644 --- a/dlls/dmime/Makefile.in +++ b/dlls/dmime/Makefile.in @@ -10,6 +10,7 @@ SOURCES = \ graph.c \ lyricstrack.c \ markertrack.c \ + midi.c \ paramcontroltrack.c \ performance.c \ segment.c \ diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index 96ccd5daf8b..cdf0810381d 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -48,6 +48,7 @@ * Interfaces */ typedef struct IDirectMusicAudioPathImpl IDirectMusicAudioPathImpl; +struct midi_parser; /***************************************************************************** * ClassFactory @@ -69,6 +70,12 @@ extern HRESULT create_dmtempotrack(REFIID riid, void **ret_iface); extern HRESULT create_dmtimesigtrack(REFIID riid, void **ret_iface); extern HRESULT create_dmwavetrack(REFIID riid, void **ret_iface); +/* Create a new MIDI file parser. Note the stream might still be modified even + * when this function fails. */ +extern HRESULT midi_parser_new(IStream *stream, struct midi_parser **out_parser); +extern HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **out_track, MUSIC_TIME *out_length); +extern void midi_parser_destroy(struct midi_parser *parser); + extern void set_audiopath_perf_pointer(IDirectMusicAudioPath*,IDirectMusicPerformance8*); extern void set_audiopath_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*); extern void set_audiopath_primary_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*); diff --git a/dlls/dmime/midi.c b/dlls/dmime/midi.c new file mode 100644 index 00000000000..a7e57947c6f --- /dev/null +++ b/dlls/dmime/midi.c @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2024 Yuxuan Shui for CodeWeavers + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "dmime_private.h" +#include "winternl.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dmime); + +#ifdef WORDS_BIGENDIAN +#define GET_BE_WORD(x) (x) +#define GET_BE_DWORD(x) (x) +#else +#define GET_BE_WORD(x) RtlUshortByteSwap(x) +#define GET_BE_DWORD(x) RtlUlongByteSwap(x) +#endif + +struct midi_parser +{ + IStream *stream; +}; + +HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **out_track, MUSIC_TIME *out_length) +{ + TRACE("(%p, %p, %p): stub\n", parser, out_track, out_length); + return S_FALSE; +} + +HRESULT midi_parser_new(IStream *stream, struct midi_parser **out_parser) +{ + LARGE_INTEGER offset; + DWORD length; + HRESULT hr; + WORD format, number_of_tracks, division; + struct midi_parser *parser; + + *out_parser = NULL; + + /* Skip over the 'MThd' magic number. */ + offset.QuadPart = 4; + if (FAILED(hr = IStream_Seek(stream, offset, STREAM_SEEK_SET, NULL))) return hr; + + if (FAILED(hr = IStream_Read(stream, &length, sizeof(length), NULL))) return hr; + length = GET_BE_DWORD(length); + if (length != 6) + { + WARN("Invalid MIDI header length %lu\n", length); + return DMUS_E_UNSUPPORTED_STREAM; + } + + if (FAILED(hr = IStream_Read(stream, &format, sizeof(format), NULL))) return hr; + format = GET_BE_WORD(format); + if (format > 2) + { + WARN("Invalid MIDI format %u\n", format); + return DMUS_E_UNSUPPORTED_STREAM; + } + if (format == 2) + { + FIXME("MIDI format 2 not implemented yet\n"); + return DMUS_E_UNSUPPORTED_STREAM; + } + + if (FAILED(hr = IStream_Read(stream, &number_of_tracks, sizeof(number_of_tracks), NULL))) + return hr; + + number_of_tracks = GET_BE_WORD(number_of_tracks); + if (FAILED(hr = IStream_Read(stream, &division, sizeof(division), NULL))) return hr; + division = GET_BE_WORD(division); + if (division & 0x8000) + { + WARN("SMPTE time division not implemented yet\n"); + return DMUS_E_UNSUPPORTED_STREAM; + } + + TRACE("MIDI format %u, %u tracks, division %u\n", format, number_of_tracks, division); + + parser = calloc(1, sizeof(struct midi_parser)); + if (!parser) return E_OUTOFMEMORY; + parser->stream = stream; + IStream_AddRef(stream); + *out_parser = parser; + + return hr; +} + +void midi_parser_destroy(struct midi_parser *parser) +{ + IStream_Release(parser->stream); + free(parser); +} diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c index b208f89148c..82e06f4537d 100644 --- a/dlls/dmime/segment.c +++ b/dlls/dmime/segment.c @@ -791,7 +791,10 @@ static inline struct segment *impl_from_IPersistStream(IPersistStream *iface) static HRESULT WINAPI segment_persist_stream_Load(IPersistStream *iface, IStream *stream) { struct segment *This = impl_from_IPersistStream(iface); + IDirectMusicTrack *track; + MUSIC_TIME length; struct chunk_entry chunk = {0}; + struct midi_parser *midi_parser; HRESULT hr; TRACE("(%p, %p): Loading\n", This, stream); @@ -807,7 +810,18 @@ static HRESULT WINAPI segment_persist_stream_Load(IPersistStream *iface, IStream break; case mmioFOURCC('M','T','h','d'): - FIXME("MIDI file loading not supported\n"); + hr = midi_parser_new(stream, &midi_parser); + if (FAILED(hr)) break; + This->header.mtLength = 0; + while ((hr = midi_parser_next_track(midi_parser, &track, &length)) == S_OK) + { + hr = segment_append_track(This, track, 1, 0); + IDirectMusicTrack_Release(track); + if (FAILED(hr)) break; + if (length > This->header.mtLength) + This->header.mtLength = length; + } + midi_parser_destroy(midi_parser); break; case MAKE_IDTYPE(FOURCC_RIFF, mmioFOURCC('W','A','V','E')):
1
0
0
0
Yuxuan Shui : dmime/tests: Add MIDI loading test.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: 4434c17c9420452a6c3221acfc2ba517f81e958c URL:
https://gitlab.winehq.org/wine/wine/-/commit/4434c17c9420452a6c3221acfc2ba5…
Author: Yuxuan Shui <yshui(a)codeweavers.com> Date: Wed Jan 31 01:31:14 2024 +0000 dmime/tests: Add MIDI loading test. Besides a seq track and a tempo track, Windows also adds a "fake" band track to segments loaded from MIDI files, which handles soundfont loading etc. --- dlls/dmime/tests/bogus.mid | Bin 0 -> 163 bytes dlls/dmime/tests/dmime.c | 44 +++++++++++++++++++++++++++++++++++++++++++ dlls/dmime/tests/resource.rc | 4 ++++ dlls/dmime/tests/test.mid | Bin 0 -> 163 bytes 4 files changed, 48 insertions(+) diff --git a/dlls/dmime/tests/bogus.mid b/dlls/dmime/tests/bogus.mid new file mode 100644 index 00000000000..5b88aab0f07 Binary files /dev/null and b/dlls/dmime/tests/bogus.mid differ diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index 218dc01045d..eaeff2e86bc 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -1554,6 +1554,49 @@ static void test_segment(void) while (IDirectMusicSegment_Release(dms)); } +static void test_midi(void) +{ + IDirectMusicSegment8 *segment = NULL; + IDirectMusicTrack *track = NULL; + IDirectMusicLoader8 *loader; + WCHAR test_mid[MAX_PATH], bogus_mid[MAX_PATH]; + HRESULT hr; + + load_resource(L"test.mid", test_mid); + /* This is a MIDI file with wrong track length. */ + load_resource(L"bogus.mid", bogus_mid); + + hr = CoCreateInstance(&CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectMusicLoader8, (void **)&loader); + ok(hr == S_OK, "got %#lx\n", hr); + hr = IDirectMusicLoader8_LoadObjectFromFile(loader, &CLSID_DirectMusicSegment, + &IID_IDirectMusicSegment, test_mid, (void **)&segment); + ok(hr == S_OK, "got %#lx\n", hr); + + /* test.mid has 1 seq track, 1 tempo track, and 1 band track */ + hr = IDirectMusicSegment8_GetTrack(segment, &CLSID_DirectMusicBandTrack, 0xffffffff, 0, &track); + todo_wine ok(hr == S_OK, "unable to get band track from midi file: %#lx\n", hr); + if (track)IDirectMusicTrack_Release(track); + track = NULL; + hr = IDirectMusicSegment8_GetTrack(segment, &CLSID_DirectMusicSeqTrack, 0xffffffff, 0, &track); + todo_wine ok(hr == S_OK, "got %#lx\n", hr); + if (track) IDirectMusicTrack_Release(track); + track = NULL; + hr = IDirectMusicSegment8_GetTrack(segment, &CLSID_DirectMusicTempoTrack, 0xffffffff, 0, &track); + todo_wine ok(hr == S_OK, "got %#lx\n", hr); + if (track) IDirectMusicTrack_Release(track); + track = NULL; + if (segment) IDirectMusicSegment8_Release(segment); + segment = NULL; + + hr = IDirectMusicLoader8_LoadObjectFromFile(loader, &CLSID_DirectMusicSegment, + &IID_IDirectMusicSegment, bogus_mid, (void **)&segment); + ok(hr == S_OK, "got %#lx\n", hr); + if (segment) IDirectMusicSegment8_Release(segment); + + IDirectMusicLoader8_Release(loader); +} + static void _add_track(IDirectMusicSegment8 *seg, REFCLSID class, const char *name, DWORD group) { IDirectMusicTrack *track; @@ -4724,6 +4767,7 @@ START_TEST(dmime) test_audiopathconfig(); test_graph(); test_segment(); + test_midi(); test_gettrack(); test_segment_param(); test_track(); diff --git a/dlls/dmime/tests/resource.rc b/dlls/dmime/tests/resource.rc index d49b647b934..4d8f512af84 100644 --- a/dlls/dmime/tests/resource.rc +++ b/dlls/dmime/tests/resource.rc @@ -21,3 +21,7 @@ /* ffmpeg -f lavfi -i "sine=frequency=600" -t 0.1 -ar 44100 -f wav -acodec pcm_u8 test.wav */ /* @makedep: test.wav */ test.wav RCDATA test.wav +/* @makedep: test.mid */ +test.mid RCDATA test.mid +/* @makedep: bogus.mid */ +bogus.mid RCDATA bogus.mid diff --git a/dlls/dmime/tests/test.mid b/dlls/dmime/tests/test.mid new file mode 100644 index 00000000000..7a46eb85d11 Binary files /dev/null and b/dlls/dmime/tests/test.mid differ
1
0
0
0
Alexandre Julliard : ntdll: Implement RtlVirtualUnwind for ARM64EC.
by Alexandre Julliard
14 Feb '24
14 Feb '24
Module: wine Branch: master Commit: cb2013e7b40ba796a42b32d2e6a08cee4191b3ec URL:
https://gitlab.winehq.org/wine/wine/-/commit/cb2013e7b40ba796a42b32d2e6a08c…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Feb 14 16:04:18 2024 +0100 ntdll: Implement RtlVirtualUnwind for ARM64EC. --- dlls/ntdll/ntdll_misc.h | 5 +++++ dlls/ntdll/signal_arm64ec.c | 17 ++--------------- dlls/ntdll/unwind.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 40273d8944a..dedf0484b55 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -84,6 +84,11 @@ extern void WINAPI KiUserCallbackDispatcher(ULONG,void*,ULONG); extern void WINAPI KiUserCallbackDispatcherReturn(void); extern void (WINAPI *pWow64PrepareForException)( EXCEPTION_RECORD *rec, CONTEXT *context ); +#ifdef __arm64ec__ +extern void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ); +extern void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ); +#endif + /* debug helpers */ extern LPCSTR debugstr_us( const UNICODE_STRING *str ); extern const char *debugstr_exception_code( DWORD code ); diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 3f1869a644f..ddf37ea6545 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -130,7 +130,7 @@ static UINT fpcsr_to_mxcsr( UINT fpcr, UINT fpsr ) return ret; } -static void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ) +void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ) { ARM64EC_NT_CONTEXT *ec_ctx = (ARM64EC_NT_CONTEXT *)ctx; UINT64 fpcsr; @@ -177,7 +177,7 @@ static void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ) arm_ctx->Fpsr = fpcsr >> 32; } -static void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ) +void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ) { ARM64EC_NT_CONTEXT *ec_ctx = (ARM64EC_NT_CONTEXT *)ctx; @@ -1769,19 +1769,6 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec ) } -/********************************************************************** - * RtlVirtualUnwind (NTDLL.@) - */ -PVOID WINAPI RtlVirtualUnwind( ULONG type, ULONG64 base, ULONG64 pc, - RUNTIME_FUNCTION *function, CONTEXT *context, - PVOID *data, ULONG64 *frame_ret, - KNONVOLATILE_CONTEXT_POINTERS *ctx_ptr ) -{ - FIXME( "not implemented\n" ); - return NULL; -} - - /******************************************************************* * RtlUnwindEx (NTDLL.@) */ diff --git a/dlls/ntdll/unwind.c b/dlls/ntdll/unwind.c index db95f12ebb2..be99fe67453 100644 --- a/dlls/ntdll/unwind.c +++ b/dlls/ntdll/unwind.c @@ -1751,6 +1751,20 @@ PVOID WINAPI RtlVirtualUnwind( ULONG type, ULONG64 base, ULONG64 pc, unsigned int i, prolog_offset; BOOL mach_frame = FALSE; +#ifdef __arm64ec__ + if (RtlIsEcCode( (void *)pc )) + { + ARM64_NT_CONTEXT arm_context; + void *ret; + + context_x64_to_arm( &arm_context, context ); + ret = RtlVirtualUnwind_arm64( type, base, pc, (ARM64_RUNTIME_FUNCTION *)function, + &arm_context, data, frame_ret, NULL ); + context_arm_to_x64( context, &arm_context ); + return ret; + } +#endif + TRACE( "type %lx rip %I64x rsp %I64x\n", type, pc, context->Rsp ); if (TRACE_ON(unwind)) dump_unwind_info( base, function );
1
0
0
0
← Newer
1
...
39
40
41
42
43
44
45
...
72
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Results per page:
10
25
50
100
200