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
January 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
711 discussions
Start a n
N
ew thread
Henri Verbeet : vkd3d-shader: Use vkd3d_atomic_increment_u32() in vkd3d_shader_dump_blob().
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: vkd3d Branch: master Commit: ced85439526733ba33aebba1a5c176485c3eae0a URL:
https://gitlab.winehq.org/wine/vkd3d/-/commit/ced85439526733ba33aebba1a5c17…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Tue Jan 23 18:05:26 2024 +0100 vkd3d-shader: Use vkd3d_atomic_increment_u32() in vkd3d_shader_dump_blob(). --- libs/vkd3d-shader/vkd3d_shader_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index ac13be89..1ef8d949 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -424,12 +424,12 @@ void set_string(struct vkd3d_bytecode_buffer *buffer, size_t offset, const char static void vkd3d_shader_dump_blob(const char *path, const char *profile, const char *suffix, const void *data, size_t size) { - static LONG shader_id = 0; + static unsigned int shader_id = 0; char filename[1024]; unsigned int id; FILE *f; - id = InterlockedIncrement(&shader_id) - 1; + id = vkd3d_atomic_increment_u32(&shader_id) - 1; if (profile) snprintf(filename, ARRAY_SIZE(filename), "%s/vkd3d-shader-%u-%s.%s", path, id, profile, suffix);
1
0
0
0
Daniel Lehman : advapi32/tests: Add some more EventLog tests.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 452b59bb4f6efeb2ecc9fd36c2b2d700adecfe0a URL:
https://gitlab.winehq.org/wine/wine/-/commit/452b59bb4f6efeb2ecc9fd36c2b2d7…
Author: Daniel Lehman <dlehman25(a)gmail.com> Date: Sat Dec 23 09:39:26 2023 -0800 advapi32/tests: Add some more EventLog tests. --- dlls/advapi32/tests/eventlog.c | 50 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/dlls/advapi32/tests/eventlog.c b/dlls/advapi32/tests/eventlog.c index 3dfb3c50542..2f6c2bf05b6 100644 --- a/dlls/advapi32/tests/eventlog.c +++ b/dlls/advapi32/tests/eventlog.c @@ -1347,8 +1347,8 @@ static void test_eventlog_start(void) { BOOL ret, found; HANDLE handle, handle2; - EVENTLOGRECORD *record; - DWORD size, count, read, needed; + EVENTLOGRECORD *record, *record2; + DWORD size, size2, count, count2, read, needed; WCHAR *sourcename, *computername, *localcomputer; char *sourcenameA, *computernameA, *localcomputerA; @@ -1547,6 +1547,14 @@ static void test_eventlog_start(void) todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError()); + count = 0xdeadbeef; + ret = GetNumberOfEventLogRecords(handle, &count); + ok(ret, "Expected success : %ld\n", GetLastError()); + ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, count + 1, &record, &size); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError()); + todo_wine { ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 2, &record, &size); ok(ret, "Expected success : %ld\n", GetLastError()); @@ -1603,6 +1611,44 @@ static void test_eventlog_start(void) } CloseEventLog(handle); + /* reading same log with different handles */ + handle = OpenEventLogW(0, L"System"); + handle2 = OpenEventLogW(0, L"SYSTEM"); + todo_wine { + ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size); + ok(ret, "Expected success : %ld\n", GetLastError()); + ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber); + ret = read_record(handle2, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size); + ok(ret, "Expected success : %ld\n", GetLastError()); + ok(record->RecordNumber == 1, "Expected 1, got %lu\n", record->RecordNumber); + } + CloseEventLog(handle2); + CloseEventLog(handle); + + /* using source name */ + size2 = size; + record2 = malloc(size2); + handle = OpenEventLogW(0, L"System"); + handle2 = OpenEventLogW(0, L"EventLog"); + todo_wine { + ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record, &size); + ok(ret, "Expected success : %ld\n", GetLastError()); + ret = read_record(handle2, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, &record2, &size2); + ok(ret, "Expected success : %ld\n", GetLastError()); + } + ok(size == size2, "Expected %lu, got %lu\n", size, size2); + ok(!memcmp(record, record2, min(size, size2)), "Records miscompare\n"); + count = 0xdeadbeef; + count2 = 0xdeadbeef; + ret = GetNumberOfEventLogRecords(handle, &count); + ok(ret, "Expected success : %ld\n", GetLastError()); + ret = GetNumberOfEventLogRecords(handle2, &count2); + ok(ret, "Expected success : %ld\n", GetLastError()); + ok(count == count2, "Expected %lu, got %lu\n", count, count2); + CloseEventLog(handle2); + CloseEventLog(handle); + + free(record2); free(record); }
1
0
0
0
Daniel Lehman : advapi32/tests: Reduce reallocations.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 8c91e484cb7f90ecade2d66a9ee838e8d43c356b URL:
https://gitlab.winehq.org/wine/wine/-/commit/8c91e484cb7f90ecade2d66a9ee838…
Author: Daniel Lehman <dlehman25(a)gmail.com> Date: Sat Dec 23 09:39:26 2023 -0800 advapi32/tests: Reduce reallocations. --- dlls/advapi32/tests/eventlog.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/dlls/advapi32/tests/eventlog.c b/dlls/advapi32/tests/eventlog.c index b27d1bde7d2..3dfb3c50542 100644 --- a/dlls/advapi32/tests/eventlog.c +++ b/dlls/advapi32/tests/eventlog.c @@ -1323,19 +1323,21 @@ done: static BOOL read_record(HANDLE handle, DWORD flags, DWORD offset, EVENTLOGRECORD **record, DWORD *size) { - DWORD read; + DWORD read, needed; BOOL ret; SetLastError(0xdeadbeef); memset(*record, 0, *size); - if (!(ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, size)) && + needed = 0; + if (!(ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, &needed)) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { free(*record); - *record = malloc(*size); + *record = malloc(needed); SetLastError(0xdeadbeef); - memset(*record, 0, *size); - ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, size); + memset(*record, 0, needed); + *size = needed; + ret = ReadEventLogW(handle, flags, offset, *record, *size, &read, &needed); } return ret; @@ -1560,7 +1562,8 @@ static void test_eventlog_start(void) /* change how */ ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 100, &record, &size); ok(ret, "Expected success : %ld\n", GetLastError()); - ok(record->RecordNumber == 4, "Expected 4, got %lu\n", record->RecordNumber); + ok(record->RecordNumber == 4 || broken(record->RecordNumber == 5) /* some win10 22h2 */, + "Expected 4, got %lu\n", record->RecordNumber); /* change direction */ ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_BACKWARDS_READ, 10, &record, &size); ok(ret, "Expected success : %ld\n", GetLastError()); @@ -1591,7 +1594,8 @@ static void test_eventlog_start(void) /* change how */ ret = read_record(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 100, &record, &size); ok(ret, "Expected success : %ld\n", GetLastError()); - ok(record->RecordNumber == 3, "Expected 3, got %lu\n", record->RecordNumber); + ok(record->RecordNumber == 3 || broken(record->RecordNumber == 2) /* some win10 22h2 */, + "Expected 3, got %lu\n", record->RecordNumber); /* change direction */ ret = read_record(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ, 10, &record, &size); ok(ret, "Expected success : %ld\n", GetLastError());
1
0
0
0
Rémi Bernon : vulkan-1/tests: Test VK_KHR_win32_surface WSI with swapchain functions.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 2de6cd5dc5d4cbcbf9b6f3aa671f42f808595a88 URL:
https://gitlab.winehq.org/wine/wine/-/commit/2de6cd5dc5d4cbcbf9b6f3aa671f42…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sun Nov 26 15:06:29 2023 +0100 vulkan-1/tests: Test VK_KHR_win32_surface WSI with swapchain functions. --- dlls/vulkan-1/tests/vulkan.c | 287 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+)
1
0
0
0
Rémi Bernon : vulkan-1/tests: Add more VK_KHR_win32_surface surface formats tests.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 85e2072243e54ab0974e15e7ec781d1fa262f120 URL:
https://gitlab.winehq.org/wine/wine/-/commit/85e2072243e54ab0974e15e7ec781d…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Jan 31 08:59:53 2024 +0100 vulkan-1/tests: Add more VK_KHR_win32_surface surface formats tests. --- dlls/vulkan-1/tests/vulkan.c | 114 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index c820e50bef9..93342a1cea6 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -460,8 +460,10 @@ static const char *test_win32_surface_extensions[] = static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_physical_device, VkDevice device, VkSurfaceKHR surface, HWND hwnd) { + PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR pvkGetPhysicalDeviceSurfaceCapabilities2KHR; PFN_vkGetPhysicalDeviceSurfacePresentModesKHR pvkGetPhysicalDeviceSurfacePresentModesKHR; PFN_vkGetPhysicalDevicePresentRectanglesKHR pvkGetPhysicalDevicePresentRectanglesKHR; + PFN_vkGetPhysicalDeviceSurfaceFormats2KHR pvkGetPhysicalDeviceSurfaceFormats2KHR; VkDeviceGroupPresentModeFlagsKHR present_mode_flags; VkSurfaceCapabilitiesKHR surf_caps; VkSurfaceFormatKHR *formats; @@ -476,10 +478,14 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ if (!GetClientRect(hwnd, &client_rect)) SetRect(&client_rect, 0, 0, 0, 0); + pvkGetPhysicalDeviceSurfaceCapabilities2KHR = (void *)vkGetInstanceProcAddr(vk_instance, + "vkGetPhysicalDeviceSurfaceCapabilities2KHR"); pvkGetPhysicalDeviceSurfacePresentModesKHR = (void *)vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); pvkGetPhysicalDevicePresentRectanglesKHR = (void *)vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDevicePresentRectanglesKHR"); + pvkGetPhysicalDeviceSurfaceFormats2KHR = (void *)vkGetInstanceProcAddr(vk_instance, + "vkGetPhysicalDeviceSurfaceFormats2KHR"); bval = find_queue_family(vk_physical_device, VK_QUEUE_GRAPHICS_BIT, &queue_family_index); ok(bval, "Could not find presentation queue.\n"); @@ -491,6 +497,49 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ formats = malloc(sizeof(*formats) * count); vr = vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device, surface, &count, formats); ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + + todo_wine + ok(formats[0].format == VK_FORMAT_B8G8R8A8_UNORM, "Got formats[0].format %#x\n", formats[0].format); + ok(formats[0].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + "Got formats[0].colorSpace %#x\n", formats[0].colorSpace); + todo_wine + ok(formats[1].format == VK_FORMAT_B8G8R8A8_SRGB, "Got formats[1].format %#x\n", formats[1].format); + ok(formats[1].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + "Got formats[1].colorSpace %#x\n", formats[1].colorSpace); + + if (!pvkGetPhysicalDeviceSurfaceFormats2KHR) + win_skip("vkGetPhysicalDeviceSurfaceFormats2KHR not found, skipping tests\n"); + else + { + VkPhysicalDeviceSurfaceInfo2KHR surface_info = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR}; + VkSurfaceFormat2KHR *formats2; + UINT i; + + surface_info.surface = surface; + + vr = pvkGetPhysicalDeviceSurfaceFormats2KHR(vk_physical_device, &surface_info, &count, NULL); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(count, "Got zero count.\n"); + + formats2 = calloc(count, sizeof(*formats2)); + for (i = 0; i < count; i++) formats2[i].sType = VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR; + vr = pvkGetPhysicalDeviceSurfaceFormats2KHR(vk_physical_device, &surface_info, &count, formats2); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(count, "Got zero count.\n"); + + while (count--) + { + ok(formats2[count].surfaceFormat.format == formats[count].format, + "Got formats2[%u].surfaceFormat.format %#x\n", count, + formats2[count].surfaceFormat.format); + ok(formats2[count].surfaceFormat.colorSpace == formats[count].colorSpace, + "Got formats2[%u].surfaceFormat.colorSpace %#x\n", count, + formats2[count].surfaceFormat.colorSpace); + } + + free(formats2); + } + free(formats); vr = vkGetPhysicalDeviceSurfaceSupportKHR(vk_physical_device, queue_family_index, surface, &bval); @@ -498,11 +547,66 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ vr = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device, surface, &surf_caps); if (!IsWindow(hwnd)) + { ok(vr == VK_ERROR_SURFACE_LOST_KHR /* Nvidia */ || vr == VK_ERROR_UNKNOWN /* AMD */, "Got unexpected vr %d.\n", vr); + memset(&surf_caps, 0, sizeof(surf_caps)); + } else + { ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surf_caps.minImageCount > 0, "Got minImageCount %u\n", surf_caps.minImageCount); + ok(surf_caps.maxImageCount > 2, "Got minImageCount %u\n", surf_caps.maxImageCount); + ok(surf_caps.minImageCount <= surf_caps.maxImageCount, "Got maxImageCount %u\n", surf_caps.maxImageCount); + + todo_wine_if(IsRectEmpty(&client_rect)) + ok(surf_caps.currentExtent.width == client_rect.right - client_rect.left, + "Got currentExtent.width %d\n", surf_caps.currentExtent.width); + todo_wine_if(IsRectEmpty(&client_rect)) + ok(surf_caps.currentExtent.height == client_rect.bottom - client_rect.top, + "Got currentExtent.height %d\n", surf_caps.currentExtent.height); + + ok(surf_caps.minImageExtent.width == surf_caps.currentExtent.width, + "Got minImageExtent.width %d\n", surf_caps.minImageExtent.width); + ok(surf_caps.minImageExtent.height == surf_caps.currentExtent.height, + "Got minImageExtent.height %d\n", surf_caps.minImageExtent.height); + ok(surf_caps.maxImageExtent.width == surf_caps.currentExtent.width, + "Got maxImageExtent.width %d\n", surf_caps.maxImageExtent.width); + ok(surf_caps.maxImageExtent.height == surf_caps.currentExtent.height, + "Got maxImageExtent.height %d\n", surf_caps.maxImageExtent.height); + + ok(surf_caps.maxImageArrayLayers == 1, "Got maxImageArrayLayers %u\n", surf_caps.maxImageArrayLayers); + ok(surf_caps.supportedTransforms == VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, + "Got supportedTransforms %#x\n", surf_caps.supportedTransforms); + ok(surf_caps.currentTransform == VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, + "Got currentTransform %#x\n", surf_caps.currentTransform); + todo_wine + ok(surf_caps.supportedCompositeAlpha == VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, + "Got supportedCompositeAlpha %#x\n", surf_caps.supportedCompositeAlpha); + todo_wine + ok(surf_caps.supportedUsageFlags == 0x9f, "Got supportedUsageFlags %#x\n", surf_caps.supportedUsageFlags); + } + + if (!pvkGetPhysicalDeviceSurfaceCapabilities2KHR) + win_skip("vkGetPhysicalDeviceSurfaceCapabilities2KHR not found, skipping tests\n"); + else + { + VkPhysicalDeviceSurfaceInfo2KHR surface_info = {.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR}; + VkSurfaceCapabilities2KHR surface_capabilities = {.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR}; + surface_info.surface = surface; + + vr = pvkGetPhysicalDeviceSurfaceCapabilities2KHR(vk_physical_device, &surface_info, &surface_capabilities); + if (IsWindow(hwnd)) + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + else + { + todo_wine + ok(vr == VK_ERROR_SURFACE_LOST_KHR /* Nvidia */ || vr == VK_ERROR_UNKNOWN /* AMD */, + "Got unexpected vr %d.\n", vr); + } + } + count = 0; vr = pvkGetPhysicalDeviceSurfacePresentModesKHR(vk_physical_device, surface, &count, NULL); ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); @@ -517,6 +621,16 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); ok(count == 1, "Got unexpected count %u.\n", count); + memset(&rect, 0xcc, sizeof(rect)); + vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, &rect); + if (IsWindow(hwnd)) + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + else + { + todo_wine + ok(vr == VK_SUCCESS /* Nvidia */ || vr == VK_ERROR_UNKNOWN /* AMD */, "Got unexpected vr %d.\n", vr); + } + memset(&rect, 0xcc, sizeof(rect)); vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, &rect); todo_wine_if(!IsWindow(hwnd))
1
0
0
0
Rémi Bernon : vulkan-1/tests: Test VK_KHR_win32_surface with windows in various states.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 7c0ddacd3e2e96dd3802826b783823473ba83fa1 URL:
https://gitlab.winehq.org/wine/wine/-/commit/7c0ddacd3e2e96dd3802826b783823…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sun Nov 26 15:07:40 2023 +0100 vulkan-1/tests: Test VK_KHR_win32_surface with windows in various states. --- dlls/vulkan-1/tests/vulkan.c | 137 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 2 deletions(-) diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index 919f2300f43..c820e50bef9 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -497,7 +497,11 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); vr = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device, surface, &surf_caps); - ok(vr, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR succeeded.\n"); + if (!IsWindow(hwnd)) + ok(vr == VK_ERROR_SURFACE_LOST_KHR /* Nvidia */ || vr == VK_ERROR_UNKNOWN /* AMD */, + "Got unexpected vr %d.\n", vr); + else + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); count = 0; vr = pvkGetPhysicalDeviceSurfacePresentModesKHR(vk_physical_device, surface, &count, NULL); @@ -515,7 +519,7 @@ static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_ memset(&rect, 0xcc, sizeof(rect)); vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, &rect); - todo_wine + todo_wine_if(!IsWindow(hwnd)) ok(vr == VK_SUCCESS /* Nvidia */ || vr == VK_ERROR_UNKNOWN /* AMD */, "Got unexpected vr %d.\n", vr); if (vr == VK_SUCCESS) { @@ -544,6 +548,7 @@ static void test_win32_surface(VkInstance instance, VkPhysicalDevice physical_de VkSurfaceKHR surface; VkDevice device; VkResult vr; + HWND hwnd; vr = create_device(physical_device, ARRAY_SIZE(device_extensions), device_extensions, NULL, &device); if (vr != VK_SUCCESS) /* Wine testbot is missing VK_KHR_device_group */ @@ -564,6 +569,134 @@ static void test_win32_surface(VkInstance instance, VkPhysicalDevice physical_de vkDestroySurfaceKHR(instance, surface, NULL); winetest_pop_context(); + /* test normal window */ + + winetest_push_context("created"); + + hwnd = CreateWindowW(L"static", L"static", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, + 0, 0, 0, NULL); + ok(hwnd != 0, "CreateWindowExW failed, error %lu\n", GetLastError()); + + surface = 0xdeadbeef; + create_info.hwnd = hwnd; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + test_win32_surface_hwnd(instance, physical_device, device, surface, hwnd); + + vkDestroySurfaceKHR(instance, surface, NULL); + DestroyWindow(hwnd); + winetest_pop_context(); + + /* test destroyed window */ + + winetest_push_context("destroyed"); + + hwnd = CreateWindowW(L"static", L"static", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, + 0, 0, 0, NULL); + ok(hwnd != 0, "CreateWindowExW failed, error %lu\n", GetLastError()); + + surface = 0xdeadbeef; + create_info.hwnd = hwnd; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + DestroyWindow(hwnd); + + test_win32_surface_hwnd(instance, physical_device, device, surface, hwnd); + + vkDestroySurfaceKHR(instance, surface, NULL); + winetest_pop_context(); + + /* test resized window */ + + winetest_push_context("resized"); + + hwnd = CreateWindowW(L"static", L"static", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, + 0, 0, 0, NULL); + ok(hwnd != 0, "CreateWindowExW failed, error %lu\n", GetLastError()); + + surface = 0xdeadbeef; + create_info.hwnd = hwnd; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + SetWindowPos(hwnd, 0, 0, 0, 50, 50, SWP_NOMOVE); + + test_win32_surface_hwnd(instance, physical_device, device, surface, hwnd); + + vkDestroySurfaceKHR(instance, surface, NULL); + DestroyWindow(hwnd); + winetest_pop_context(); + + /* test hidden window */ + + winetest_push_context("hidden"); + + hwnd = CreateWindowW(L"static", L"static", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, + 0, 0, 0, NULL); + ok(hwnd != 0, "CreateWindowExW failed, error %lu\n", GetLastError()); + + surface = 0xdeadbeef; + create_info.hwnd = hwnd; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + ShowWindow(hwnd, SW_HIDE); + + test_win32_surface_hwnd(instance, physical_device, device, surface, hwnd); + + vkDestroySurfaceKHR(instance, surface, NULL); + DestroyWindow(hwnd); + winetest_pop_context(); + + /* tests minimized window */ + + winetest_push_context("minimized"); + + hwnd = CreateWindowW(L"static", L"static", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, + 0, 0, 0, NULL); + ok(hwnd != 0, "CreateWindowExW failed, error %lu\n", GetLastError()); + + surface = 0xdeadbeef; + create_info.hwnd = hwnd; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + ShowWindow(hwnd, SW_MINIMIZE); + + test_win32_surface_hwnd(instance, physical_device, device, surface, hwnd); + + vkDestroySurfaceKHR(instance, surface, NULL); + DestroyWindow(hwnd); + winetest_pop_context(); + + /* works on Windows, crashes on Wine */ + if (0) + { + /* test desktop window */ + + winetest_push_context("desktop"); + + hwnd = GetDesktopWindow(); + + surface = 0xdeadbeef; + create_info.hwnd = hwnd; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + test_win32_surface_hwnd(instance, physical_device, device, surface, hwnd); + + vkDestroySurfaceKHR(instance, surface, NULL); + winetest_pop_context(); + } + vkDestroyDevice(device, NULL); }
1
0
0
0
Rémi Bernon : vulkan-1/tests: Create surface and device before calling test_null_hwnd.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: beb75c50b02bec7f70b0999928eeb2a66833ff9e URL:
https://gitlab.winehq.org/wine/wine/-/commit/beb75c50b02bec7f70b0999928eeb2…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sat Nov 25 15:34:51 2023 +0100 vulkan-1/tests: Create surface and device before calling test_null_hwnd. --- dlls/vulkan-1/tests/Makefile.in | 2 +- dlls/vulkan-1/tests/vulkan.c | 111 +++++++++++++++++++++------------------- 2 files changed, 60 insertions(+), 53 deletions(-) diff --git a/dlls/vulkan-1/tests/Makefile.in b/dlls/vulkan-1/tests/Makefile.in index 32822d89e60..34c7c860b05 100644 --- a/dlls/vulkan-1/tests/Makefile.in +++ b/dlls/vulkan-1/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = vulkan-1.dll -IMPORTS = vulkan-1 +IMPORTS = vulkan-1 user32 SOURCES = \ vulkan.c diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index d8040a1dbf3..919f2300f43 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -449,48 +449,41 @@ static void test_private_data(VkPhysicalDevice vk_physical_device) vkDestroyDevice(vk_device, NULL); } -static const char *test_null_hwnd_extensions[] = +static const char *test_win32_surface_extensions[] = { "VK_KHR_surface", "VK_KHR_win32_surface", "VK_KHR_device_group_creation", + "VK_KHR_get_surface_capabilities2", }; -static void test_null_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_physical_device) +static void test_win32_surface_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_physical_device, + VkDevice device, VkSurfaceKHR surface, HWND hwnd) { PFN_vkGetPhysicalDeviceSurfacePresentModesKHR pvkGetPhysicalDeviceSurfacePresentModesKHR; PFN_vkGetPhysicalDevicePresentRectanglesKHR pvkGetPhysicalDevicePresentRectanglesKHR; VkDeviceGroupPresentModeFlagsKHR present_mode_flags; - VkWin32SurfaceCreateInfoKHR surface_create_info; VkSurfaceCapabilitiesKHR surf_caps; VkSurfaceFormatKHR *formats; uint32_t queue_family_index; VkPresentModeKHR *modes; - VkSurfaceKHR surface; + RECT client_rect; uint32_t count; VkRect2D rect; VkBool32 bval; VkResult vr; + if (!GetClientRect(hwnd, &client_rect)) + SetRect(&client_rect, 0, 0, 0, 0); + pvkGetPhysicalDeviceSurfacePresentModesKHR = (void *)vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); pvkGetPhysicalDevicePresentRectanglesKHR = (void *)vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDevicePresentRectanglesKHR"); - surface_create_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; - surface_create_info.pNext = NULL; - surface_create_info.flags = 0; - surface_create_info.hinstance = NULL; - surface_create_info.hwnd = NULL; - bval = find_queue_family(vk_physical_device, VK_QUEUE_GRAPHICS_BIT, &queue_family_index); ok(bval, "Could not find presentation queue.\n"); - surface = 0xdeadbeef; - vr = vkCreateWin32SurfaceKHR(vk_instance, &surface_create_info, NULL, &surface); - ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); - ok(surface != 0xdeadbeef, "Surface not created.\n"); - count = 0; vr = vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device, surface, &count, NULL); ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); @@ -515,49 +508,63 @@ static void test_null_hwnd(VkInstance vk_instance, VkPhysicalDevice vk_physical_ ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); free(modes); - if (pvkGetPhysicalDevicePresentRectanglesKHR) + count = 0; + vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, NULL); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(count == 1, "Got unexpected count %u.\n", count); + + memset(&rect, 0xcc, sizeof(rect)); + vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, &rect); + todo_wine + ok(vr == VK_SUCCESS /* Nvidia */ || vr == VK_ERROR_UNKNOWN /* AMD */, "Got unexpected vr %d.\n", vr); + if (vr == VK_SUCCESS) { - VkDevice vk_device; + RECT tmp_rect = + { + rect.offset.x, + rect.offset.y, + rect.offset.x + rect.extent.width, + rect.offset.y + rect.extent.height, + }; - count = 0; - vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, NULL); - ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); ok(count == 1, "Got unexpected count %u.\n", count); - memset(&rect, 0xcc, sizeof(rect)); - vr = pvkGetPhysicalDevicePresentRectanglesKHR(vk_physical_device, surface, &count, &rect); - if (vr == VK_SUCCESS) /* Fails on AMD, succeeds on Nvidia. */ - { - ok(count == 1, "Got unexpected count %u.\n", count); - ok(!rect.offset.x && !rect.offset.y && !rect.extent.width && !rect.extent.height, - "Got unexpected rect %d, %d, %u, %u.\n", - rect.offset.x, rect.offset.y, rect.extent.width, rect.extent.height); - } + todo_wine_if(IsRectEmpty(&client_rect)) + ok(EqualRect(&tmp_rect, &client_rect), "Got unexpected rect %s.\n", wine_dbgstr_rect(&tmp_rect)); + } - if ((vr = create_device(vk_physical_device, 0, NULL, NULL, &vk_device)) < 0) - { - skip("Failed to create device, vr %d.\n", vr); - vkDestroySurfaceKHR(vk_instance, surface, NULL); - return; - } + vr = vkGetDeviceGroupSurfacePresentModesKHR(device, surface, &present_mode_flags); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); +} - if (0) - { - /* Causes access violation on Windows. */ - vr = vkGetDeviceGroupSurfacePresentModesKHR(vk_device, surface, &present_mode_flags); - ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); - } +static void test_win32_surface(VkInstance instance, VkPhysicalDevice physical_device) +{ + static const char *const device_extensions[] = {"VK_KHR_swapchain", "VK_KHR_device_group"}; - vkDestroyDevice(vk_device, NULL); - } - else - { - /* The function should be available in practice with VK_KHR_device_group_creation, but spec lists - * it as a part of VK_KHR_device_group device extension which we don't check, so consider the - * absence of the function. */ - win_skip("pvkGetPhysicalDevicePresentRectanglesKHR is no available.\n"); - } + VkWin32SurfaceCreateInfoKHR create_info = {.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR}; + VkSurfaceKHR surface; + VkDevice device; + VkResult vr; + + vr = create_device(physical_device, ARRAY_SIZE(device_extensions), device_extensions, NULL, &device); + if (vr != VK_SUCCESS) /* Wine testbot is missing VK_KHR_device_group */ + vr = create_device(physical_device, ARRAY_SIZE(device_extensions) - 1, device_extensions, NULL, &device); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + + /* test NULL window */ + + winetest_push_context("null"); + + surface = 0xdeadbeef; + vr = vkCreateWin32SurfaceKHR(instance, &create_info, NULL, &surface); + ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); + ok(surface != 0xdeadbeef, "Surface not created.\n"); + + test_win32_surface_hwnd(instance, physical_device, device, surface, NULL); + + vkDestroySurfaceKHR(instance, surface, NULL); + winetest_pop_context(); - vkDestroySurfaceKHR(vk_instance, surface, NULL); + vkDestroyDevice(device, NULL); } static uint32_t find_memory_type(VkPhysicalDevice vk_physical_device, VkMemoryPropertyFlagBits flags, uint32_t mask) @@ -955,6 +962,6 @@ START_TEST(vulkan) test_unsupported_instance_extensions(); for_each_device(test_unsupported_device_extensions); for_each_device(test_private_data); - for_each_device_instance(ARRAY_SIZE(test_null_hwnd_extensions), test_null_hwnd_extensions, test_null_hwnd, NULL); + for_each_device_instance(ARRAY_SIZE(test_win32_surface_extensions), test_win32_surface_extensions, test_win32_surface, NULL); for_each_device_instance(ARRAY_SIZE(test_external_memory_extensions), test_external_memory_extensions, test_external_memory, NULL); }
1
0
0
0
Rémi Bernon : vulkan-1/tests: Enable VK_VERSION_1_1 as requested by validation layers.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 69b6a929786576f4b8082bf31eef365714f2efc4 URL:
https://gitlab.winehq.org/wine/wine/-/commit/69b6a929786576f4b8082bf31eef36…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sun Nov 26 15:06:29 2023 +0100 vulkan-1/tests: Enable VK_VERSION_1_1 as requested by validation layers. --- dlls/vulkan-1/tests/vulkan.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index c4fd0f40256..d8040a1dbf3 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -23,12 +23,15 @@ static VkResult create_instance(uint32_t extension_count, const char * const *enabled_extensions, VkInstance *vk_instance) { + VkApplicationInfo app_info = {.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO}; VkInstanceCreateInfo create_info; + app_info.apiVersion = VK_API_VERSION_1_1; + create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; create_info.pNext = NULL; create_info.flags = 0; - create_info.pApplicationInfo = NULL; + create_info.pApplicationInfo = &app_info; create_info.enabledLayerCount = 0; create_info.ppEnabledLayerNames = NULL; create_info.enabledExtensionCount = extension_count;
1
0
0
0
Shaun Ren : sapi: Create a new engine only when needed in ISpVoice.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: 2a56d4e6e9803183873aa84be29eab1f1ce8acc3 URL:
https://gitlab.winehq.org/wine/wine/-/commit/2a56d4e6e9803183873aa84be29eab…
Author: Shaun Ren <sren(a)codeweavers.com> Date: Mon Jan 22 16:35:45 2024 -0500 sapi: Create a new engine only when needed in ISpVoice. Instead of creating the TTS voice engine directly in SetVoice, we save the specified voice token, and only create them in ISpVoice::Speak when necessary. --- dlls/sapi/tts.c | 75 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/dlls/sapi/tts.c b/dlls/sapi/tts.c index 410a57b4bfc..c2e36fc274d 100644 --- a/dlls/sapi/tts.c +++ b/dlls/sapi/tts.c @@ -43,6 +43,7 @@ struct speech_voice LONG ref; ISpStreamFormat *output; + ISpObjectToken *engine_token; ISpTTSEngine *engine; LONG cur_stream_num; DWORD actions; @@ -163,6 +164,7 @@ static ULONG WINAPI speech_voice_Release(ISpeechVoice *iface) { async_cancel_queue(&This->queue); if (This->output) ISpStreamFormat_Release(This->output); + if (This->engine_token) ISpObjectToken_Release(This->engine_token); if (This->engine) ISpTTSEngine_Release(This->engine); DeleteCriticalSection(&This->cs); @@ -660,7 +662,7 @@ static HRESULT WINAPI spvoice_Resume(ISpVoice *iface) static HRESULT WINAPI spvoice_SetVoice(ISpVoice *iface, ISpObjectToken *token) { struct speech_voice *This = impl_from_ISpVoice(iface); - ISpTTSEngine *engine; + WCHAR *id = NULL, *old_id = NULL; HRESULT hr; TRACE("(%p, %p).\n", iface, token); @@ -673,27 +675,37 @@ static HRESULT WINAPI spvoice_SetVoice(ISpVoice *iface, ISpObjectToken *token) else ISpObjectToken_AddRef(token); - hr = ISpObjectToken_CreateInstance(token, NULL, CLSCTX_ALL, &IID_ISpTTSEngine, (void **)&engine); - ISpObjectToken_Release(token); - if (FAILED(hr)) - return hr; - EnterCriticalSection(&This->cs); + if (This->engine_token && + SUCCEEDED(ISpObjectToken_GetId(token, &id)) && + SUCCEEDED(ISpObjectToken_GetId(This->engine_token, &old_id)) && + !wcscmp(id, old_id)) + { + ISpObjectToken_Release(token); + goto done; + } + + if (This->engine_token) + ISpObjectToken_Release(This->engine_token); + This->engine_token = token; + if (This->engine) + { ISpTTSEngine_Release(This->engine); - This->engine = engine; + This->engine = NULL; + } +done: LeaveCriticalSection(&This->cs); - + CoTaskMemFree(id); + CoTaskMemFree(old_id); return S_OK; } static HRESULT WINAPI spvoice_GetVoice(ISpVoice *iface, ISpObjectToken **token) { struct speech_voice *This = impl_from_ISpVoice(iface); - ISpObjectWithToken *engine_token_iface; - HRESULT hr; TRACE("(%p, %p).\n", iface, token); @@ -702,21 +714,18 @@ static HRESULT WINAPI spvoice_GetVoice(ISpVoice *iface, ISpObjectToken **token) EnterCriticalSection(&This->cs); - if (!This->engine) + if (!This->engine_token) { LeaveCriticalSection(&This->cs); return create_default_token(SPCAT_VOICES, token); } - if (SUCCEEDED(hr = ISpTTSEngine_QueryInterface(This->engine, &IID_ISpObjectWithToken, (void **)&engine_token_iface))) - { - hr = ISpObjectWithToken_GetObjectToken(engine_token_iface, token); - ISpObjectWithToken_Release(engine_token_iface); - } + ISpObjectToken_AddRef(This->engine_token); + *token = This->engine_token; LeaveCriticalSection(&This->cs); - return hr; + return S_OK; } struct async_result @@ -731,6 +740,7 @@ struct speak_task struct async_result *result; struct speech_voice *voice; + ISpTTSEngine *engine; SPVTEXTFRAG *frag_list; ISpTTSEngineSite *site; DWORD flags; @@ -773,7 +783,6 @@ static void speak_proc(struct async_task *task) struct speech_voice *This = speak_task->voice; GUID fmtid; WAVEFORMATEX *wfx = NULL; - ISpTTSEngine *engine = NULL; ISpAudio *audio = NULL; HRESULT hr; @@ -794,8 +803,6 @@ static void speak_proc(struct async_task *task) ERR("failed setting output format: %#lx.\n", hr); goto done; } - engine = This->engine; - ISpTTSEngine_AddRef(engine); if (SUCCEEDED(ISpStreamFormat_QueryInterface(This->output, &IID_ISpAudio, (void **)&audio))) ISpAudio_SetState(audio, SPAS_RUN, 0); @@ -804,7 +811,7 @@ static void speak_proc(struct async_task *task) LeaveCriticalSection(&This->cs); - hr = ISpTTSEngine_Speak(engine, speak_task->flags, &fmtid, wfx, speak_task->frag_list, speak_task->site); + hr = ISpTTSEngine_Speak(speak_task->engine, speak_task->flags, &fmtid, wfx, speak_task->frag_list, speak_task->site); if (SUCCEEDED(hr)) { ISpStreamFormat_Commit(This->output, STGC_DEFAULT); @@ -821,7 +828,7 @@ done: ISpAudio_Release(audio); } CoTaskMemFree(wfx); - if (engine) ISpTTSEngine_Release(engine); + ISpTTSEngine_Release(speak_task->engine); free(speak_task->frag_list); ISpTTSEngineSite_Release(speak_task->site); @@ -838,6 +845,7 @@ static HRESULT WINAPI spvoice_Speak(ISpVoice *iface, const WCHAR *contents, DWOR { struct speech_voice *This = impl_from_ISpVoice(iface); ISpTTSEngineSite *site = NULL; + ISpTTSEngine *engine = NULL; SPVTEXTFRAG *frag; struct speak_task *speak_task = NULL; struct async_result *result = NULL; @@ -891,12 +899,28 @@ static HRESULT WINAPI spvoice_Speak(ISpVoice *iface, const WCHAR *contents, DWOR return hr; } - if (!This->engine) + EnterCriticalSection(&This->cs); + + if (!This->engine_token) { - /* Create a new engine with the default voice. */ + /* Set the engine token to default. */ if (FAILED(hr = ISpVoice_SetVoice(iface, NULL))) + { + LeaveCriticalSection(&This->cs); return hr; + } } + if (!This->engine && + FAILED(hr = ISpObjectToken_CreateInstance(This->engine_token, NULL, CLSCTX_ALL, &IID_ISpTTSEngine, (void **)&This->engine))) + { + LeaveCriticalSection(&This->cs); + ERR("Failed to create engine: %#lx.\n", hr); + return hr; + } + engine = This->engine; + ISpTTSEngine_AddRef(engine); + + LeaveCriticalSection(&This->cs); if (!(frag = malloc(sizeof(*frag) + contents_size))) return E_OUTOFMEMORY; @@ -920,6 +944,7 @@ static HRESULT WINAPI spvoice_Speak(ISpVoice *iface, const WCHAR *contents, DWOR speak_task->task.proc = speak_proc; speak_task->result = NULL; speak_task->voice = This; + speak_task->engine = engine; speak_task->frag_list = frag; speak_task->site = site; speak_task->flags = flags & SPF_NLP_SPEAK_PUNC; @@ -958,6 +983,7 @@ static HRESULT WINAPI spvoice_Speak(ISpVoice *iface, const WCHAR *contents, DWOR fail: if (site) ISpTTSEngineSite_Release(site); + if (engine) ISpTTSEngine_Release(engine); free(frag); free(speak_task); if (result) @@ -1397,6 +1423,7 @@ HRESULT speech_voice_create(IUnknown *outer, REFIID iid, void **obj) This->ref = 1; This->output = NULL; + This->engine_token = NULL; This->engine = NULL; This->cur_stream_num = 0; This->actions = SPVES_CONTINUE;
1
0
0
0
Louis Lenders : ntdll: Add stub for RtlGetDeviceFamilyInfoEnum.
by Alexandre Julliard
31 Jan '24
31 Jan '24
Module: wine Branch: master Commit: a24039ad09abd72f47c4d76544d337a76fb626cf URL:
https://gitlab.winehq.org/wine/wine/-/commit/a24039ad09abd72f47c4d76544d337…
Author: Louis Lenders <xerox.xerox2000x(a)gmail.com> Date: Tue Jan 30 10:28:47 2024 +0100 ntdll: Add stub for RtlGetDeviceFamilyInfoEnum. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=56259
--- dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/rtl.c | 12 +++++++++++ dlls/ntdll/tests/rtl.c | 24 +++++++++++++++++++++ include/winnt.h | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 18dddf928cf..64fdb6fdb24 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -711,6 +711,7 @@ @ stdcall RtlFreeThreadActivationContextStack() @ stdcall RtlFreeUnicodeString(ptr) @ stdcall RtlFreeUserStack(ptr) +@ stdcall RtlGetDeviceFamilyInfoEnum(ptr ptr ptr) @ stdcall RtlGUIDFromString(ptr ptr) @ stub RtlGenerate8dot3Name @ stdcall RtlGetAce(ptr long ptr) diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index 0d0b2d370f3..a077108b8d0 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c @@ -2193,3 +2193,15 @@ char WINAPI RtlQueryProcessPlaceholderCompatibilityMode(void) FIXME("stub\n"); return PHCM_APPLICATION_DEFAULT; } + +/********************************************************************* + * RtlGetDeviceFamilyInfoEnum [NTDLL.@] + */ +void WINAPI RtlGetDeviceFamilyInfoEnum(ULONGLONG *version, DWORD *family, DWORD *form) +{ + FIXME("%p %p %p: stub\n", version, family, form); + + if (version) *version = 0; + if (family) *family = DEVICEFAMILYINFOENUM_DESKTOP; + if (form) *form = DEVICEFAMILYDEVICEFORM_UNKNOWN; +} diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 754f5b711dd..4a4370d5903 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -99,6 +99,7 @@ static void * (WINAPI *pRtlFindExportedRoutineByName)(HMODULE,const char *); static NTSTATUS (WINAPI *pLdrEnumerateLoadedModules)(void *, void *, void *); static NTSTATUS (WINAPI *pLdrRegisterDllNotification)(ULONG, PLDR_DLL_NOTIFICATION_FUNCTION, void *, void **); static NTSTATUS (WINAPI *pLdrUnregisterDllNotification)(void *); +static VOID (WINAPI *pRtlGetDeviceFamilyInfoEnum)(ULONGLONG *,DWORD *,DWORD *); static HMODULE hkernel32 = 0; static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); @@ -142,6 +143,7 @@ static void InitFunctionPtrs(void) pLdrEnumerateLoadedModules = (void *)GetProcAddress(hntdll, "LdrEnumerateLoadedModules"); pLdrRegisterDllNotification = (void *)GetProcAddress(hntdll, "LdrRegisterDllNotification"); pLdrUnregisterDllNotification = (void *)GetProcAddress(hntdll, "LdrUnregisterDllNotification"); + pRtlGetDeviceFamilyInfoEnum = (void *)GetProcAddress(hntdll, "RtlGetDeviceFamilyInfoEnum"); } hkernel32 = LoadLibraryA("kernel32.dll"); ok(hkernel32 != 0, "LoadLibrary failed\n"); @@ -3754,6 +3756,27 @@ static void test_RtlFindExportedRoutineByName(void) ok( proc == NULL, "Shouldn't find forwarded function\n" ); } +static void test_RtlGetDeviceFamilyInfoEnum(void) +{ + ULONGLONG version; + DWORD family, form; + + if (!pRtlGetDeviceFamilyInfoEnum) + { + win_skip( "RtlGetDeviceFamilyInfoEnum is not present\n" ); + return; + } + + version = 0x1234567; + family = 1234567; + form = 1234567; + pRtlGetDeviceFamilyInfoEnum(&version, &family, &form); + ok( version != 0x1234567, "got unexpected unchanged value 0x1234567\n" ); + ok( family <= DEVICEFAMILYINFOENUM_MAX, "got unexpected %lu\n", family ); + ok( form <= DEVICEFAMILYDEVICEFORM_MAX, "got unexpected %lu\n", form ); + trace( "UAP version is %#I64x, device family is %lu, form factor is %lu\n", version, family, form ); +} + START_TEST(rtl) { InitFunctionPtrs(); @@ -3802,4 +3825,5 @@ START_TEST(rtl) test_RtlInitializeSid(); test_RtlValidSecurityDescriptor(); test_RtlFindExportedRoutineByName(); + test_RtlGetDeviceFamilyInfoEnum(); } diff --git a/include/winnt.h b/include/winnt.h index e9fef20c76d..e1de2f29ecd 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -5915,6 +5915,63 @@ typedef struct _TAPE_GET_MEDIA_PARAMETERS { ) /* ------------------------------ end registry ------------------------------ */ +#define DEVICEFAMILYINFOENUM_UAP 0x00 +#define DEVICEFAMILYINFOENUM_WINDOWS_8X 0x01 +#define DEVICEFAMILYINFOENUM_WINDOWS_PHONE_8X 0x02 +#define DEVICEFAMILYINFOENUM_DESKTOP 0x03 +#define DEVICEFAMILYINFOENUM_MOBILE 0x04 +#define DEVICEFAMILYINFOENUM_XBOX 0x05 +#define DEVICEFAMILYINFOENUM_TEAM 0x06 +#define DEVICEFAMILYINFOENUM_IOT 0x07 +#define DEVICEFAMILYINFOENUM_IOT_HEADLESS 0x08 +#define DEVICEFAMILYINFOENUM_SERVER 0x09 +#define DEVICEFAMILYINFOENUM_HOLOGRAPHIC 0x0A +#define DEVICEFAMILYINFOENUM_XBOXSRA 0x0B +#define DEVICEFAMILYINFOENUM_XBOXERA 0x0C +#define DEVICEFAMILYINFOENUM_SERVER_NANO 0x0D +#define DEVICEFAMILYINFOENUM_8828080 0x0E +#define DEVICEFAMILYINFOENUM_7067329 0x0F +#define DEVICEFAMILYINFOENUM_WINDOWS_CORE 0x10 +#define DEVICEFAMILYINFOENUM_WINDOWS_CORE_HEADLESS 0x11 +#define DEVICEFAMILYINFOENUM_MAX 0x11 + +#define DEVICEFAMILYDEVICEFORM_UNKNOWN 0x00 +#define DEVICEFAMILYDEVICEFORM_PHONE 0x01 +#define DEVICEFAMILYDEVICEFORM_TABLET 0x02 +#define DEVICEFAMILYDEVICEFORM_DESKTOP 0x03 +#define DEVICEFAMILYDEVICEFORM_NOTEBOOK 0x04 +#define DEVICEFAMILYDEVICEFORM_CONVERTIBLE 0x05 +#define DEVICEFAMILYDEVICEFORM_DETACHABLE 0x06 +#define DEVICEFAMILYDEVICEFORM_ALLINONE 0x07 +#define DEVICEFAMILYDEVICEFORM_STICKPC 0x08 +#define DEVICEFAMILYDEVICEFORM_PUCK 0x09 +#define DEVICEFAMILYDEVICEFORM_LARGESCREEN 0x0A +#define DEVICEFAMILYDEVICEFORM_HMD 0x0B +#define DEVICEFAMILYDEVICEFORM_INDUSTRY_HANDHELD 0x0C +#define DEVICEFAMILYDEVICEFORM_INDUSTRY_TABLET 0x0D +#define DEVICEFAMILYDEVICEFORM_BANKING 0x0E +#define DEVICEFAMILYDEVICEFORM_BUILDING_AUTOMATION 0x0F +#define DEVICEFAMILYDEVICEFORM_DIGITAL_SIGNAGE 0x10 +#define DEVICEFAMILYDEVICEFORM_GAMING 0x11 +#define DEVICEFAMILYDEVICEFORM_HOME_AUTOMATION 0x12 +#define DEVICEFAMILYDEVICEFORM_INDUSTRIAL_AUTOMATION 0x13 +#define DEVICEFAMILYDEVICEFORM_KIOSK 0x14 +#define DEVICEFAMILYDEVICEFORM_MAKER_BOARD 0x15 +#define DEVICEFAMILYDEVICEFORM_MEDICAL 0x16 +#define DEVICEFAMILYDEVICEFORM_NETWORKING 0x17 +#define DEVICEFAMILYDEVICEFORM_POINT_OF_SERVICE 0x18 +#define DEVICEFAMILYDEVICEFORM_PRINTING 0x19 +#define DEVICEFAMILYDEVICEFORM_THIN_CLIENT 0x1A +#define DEVICEFAMILYDEVICEFORM_TOY 0x1B +#define DEVICEFAMILYDEVICEFORM_VENDING 0x1C +#define DEVICEFAMILYDEVICEFORM_INDUSTRY_OTHER 0x1D +#define DEVICEFAMILYDEVICEFORM_XBOX_ONE 0x1E +#define DEVICEFAMILYDEVICEFORM_XBOX_ONE_S 0x1F +#define DEVICEFAMILYDEVICEFORM_XBOX_ONE_X 0x20 +#define DEVICEFAMILYDEVICEFORM_XBOX_ONE_X_DEVKIT 0x21 +#define DEVICEFAMILYDEVICEFORM_MAX 0x21 + +NTSYSAPI void WINAPI RtlGetDeviceFamilyInfoEnum(ULONGLONG*,DWORD*,DWORD*); #define EVENTLOG_SUCCESS 0x0000 #define EVENTLOG_ERROR_TYPE 0x0001
1
0
0
0
← Newer
1
2
3
4
5
6
7
...
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