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
March 2023
----- 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
910 discussions
Start a n
N
ew thread
Sven Baars : advapi32/tests: Copy Software\Classes tests from ntdll.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 8b327eee5e7dc21c117515c69662d39693ada167 URL:
https://gitlab.winehq.org/wine/wine/-/commit/8b327eee5e7dc21c117515c69662d3…
Author: Sven Baars <sbaars(a)codeweavers.com> Date: Wed Oct 19 14:52:42 2022 +0200 advapi32/tests: Copy Software\Classes tests from ntdll. --- dlls/advapi32/tests/registry.c | 465 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 438 insertions(+), 27 deletions(-)
1
0
0
0
Eric Pouech : wow64: Move filter of (un)load DLL debug events to client side.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 4b281271570d33a69fa35be3e9ff95c527437b64 URL:
https://gitlab.winehq.org/wine/wine/-/commit/4b281271570d33a69fa35be3e9ff95…
Author: Eric Pouech <eric.pouech(a)gmail.com> Date: Sun Mar 12 18:11:30 2023 +0100 wow64: Move filter of (un)load DLL debug events to client side. Code is duplicated in ntdll.dll (for 32bit only and old Wow configuration) and wow64.dll for new Wow64 configurations. Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com> --- dlls/ntdll/unix/sync.c | 54 ++++++++++++++++++++++++++++++++++++++++- dlls/wow64/sync.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++- server/mapping.c | 3 --- 3 files changed, 118 insertions(+), 5 deletions(-) diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index 22a3555ba3f..831c16130b9 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -1008,15 +1008,48 @@ static NTSTATUS event_data_to_state_change( const debug_event_t *data, DBGUI_WAI info->DebugInfoFileOffset = data->load_dll.dbg_offset; info->DebugInfoSize = data->load_dll.dbg_size; info->NamePointer = wine_server_get_ptr( data->load_dll.name ); + if ((DWORD_PTR)data->load_dll.base != data->load_dll.base) + return STATUS_PARTIAL_COPY; return STATUS_SUCCESS; } case DbgUnloadDllStateChange: state->StateInfo.UnloadDll.BaseAddress = wine_server_get_ptr( data->unload_dll.base ); + if ((DWORD_PTR)data->unload_dll.base != data->unload_dll.base) + return STATUS_PARTIAL_COPY; return STATUS_SUCCESS; } return STATUS_INTERNAL_ERROR; } +#ifndef _WIN64 +/* helper to NtWaitForDebugEvent; retrive machine from PE image */ +static NTSTATUS get_image_machine( HANDLE handle, USHORT *machine ) +{ + IMAGE_DOS_HEADER dos_hdr; + IMAGE_NT_HEADERS nt_hdr; + IO_STATUS_BLOCK iosb; + LARGE_INTEGER offset; + FILE_POSITION_INFORMATION pos_info; + NTSTATUS status; + + offset.QuadPart = 0; + status = NtReadFile( handle, NULL, NULL, NULL, + &iosb, &dos_hdr, sizeof(dos_hdr), &offset, NULL ); + if (!status) + { + offset.QuadPart = dos_hdr.e_lfanew; + status = NtReadFile( handle, NULL, NULL, NULL, &iosb, + &nt_hdr, FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader), &offset, NULL ); + if (!status) + *machine = nt_hdr.FileHeader.Machine; + /* Reset file pos at beginning of file */ + pos_info.CurrentByteOffset.QuadPart = 0; + NtSetInformationFile( handle, &iosb, &pos_info, sizeof(pos_info), FilePositionInformation ); + } + return status; +} +#endif + /********************************************************************** * NtWaitForDebugEvent (NTDLL.@) */ @@ -1034,8 +1067,9 @@ NTSTATUS WINAPI NtWaitForDebugEvent( HANDLE handle, BOOLEAN alertable, LARGE_INT req->debug = wine_server_obj_handle( handle ); wine_server_set_reply( req, &data, sizeof(data) ); ret = wine_server_call( req ); - if (!ret && !(ret = event_data_to_state_change( &data, state ))) + if (!ret) { + ret = event_data_to_state_change( &data, state ); state->NewState = data.code; state->AppClientId.UniqueProcess = ULongToHandle( reply->pid ); state->AppClientId.UniqueThread = ULongToHandle( reply->tid ); @@ -1043,6 +1077,24 @@ NTSTATUS WINAPI NtWaitForDebugEvent( HANDLE handle, BOOLEAN alertable, LARGE_INT } SERVER_END_REQ; +#ifndef _WIN64 + /* don't pass 64bit load events to 32bit callers */ + if (!ret && state->NewState == DbgLoadDllStateChange) + { + USHORT machine; + if (!get_image_machine( state->StateInfo.LoadDll.FileHandle, &machine ) && + machine != current_machine) + ret = STATUS_PARTIAL_COPY; + } + if (ret == STATUS_PARTIAL_COPY) + { + if (state->NewState == DbgLoadDllStateChange) + NtClose( state->StateInfo.LoadDll.FileHandle ); + NtDebugContinue( handle, &state->AppClientId, DBG_CONTINUE ); + wait = TRUE; + continue; + } +#endif if (ret != STATUS_PENDING) return ret; if (!wait) return STATUS_TIMEOUT; wait = FALSE; diff --git a/dlls/wow64/sync.c b/dlls/wow64/sync.c index bf42f43b7e6..385477ef5fa 100644 --- a/dlls/wow64/sync.c +++ b/dlls/wow64/sync.c @@ -1490,6 +1490,65 @@ NTSTATUS WINAPI wow64_NtWaitForAlertByThreadId( UINT *args ) } +/* helper to wow64_NtWaitForDebugEvent; retrive machine from PE image */ +static NTSTATUS get_image_machine( HANDLE handle, USHORT *machine ) +{ + IMAGE_DOS_HEADER dos_hdr; + IMAGE_NT_HEADERS nt_hdr; + IO_STATUS_BLOCK iosb; + LARGE_INTEGER offset; + FILE_POSITION_INFORMATION pos_info; + NTSTATUS status; + + offset.QuadPart = 0; + status = NtReadFile( handle, NULL, NULL, NULL, + &iosb, &dos_hdr, sizeof(dos_hdr), &offset, NULL ); + if (!status) + { + offset.QuadPart = dos_hdr.e_lfanew; + status = NtReadFile( handle, NULL, NULL, NULL, &iosb, + &nt_hdr, FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader), &offset, NULL ); + if (!status) + *machine = nt_hdr.FileHeader.Machine; + /* Reset file pos at beginning of file */ + pos_info.CurrentByteOffset.QuadPart = 0; + NtSetInformationFile( handle, &iosb, &pos_info, sizeof(pos_info), FilePositionInformation ); + } + return status; +} + +/* helper to wow64_NtWaitForDebugEvent; only pass debug events for current machine */ +static BOOL filter_out_state_change( HANDLE handle, DBGUI_WAIT_STATE_CHANGE *state ) +{ + BOOL filter_out; + + switch (state->NewState) + { + case DbgLoadDllStateChange: + filter_out = ((ULONG64)state->StateInfo.LoadDll.BaseOfDll >> 32) != 0; + if (!filter_out) + { + USHORT machine; + filter_out = !get_image_machine( state->StateInfo.LoadDll.FileHandle, &machine) && machine != current_machine; + } + break; + case DbgUnloadDllStateChange: + filter_out = ((ULONG_PTR)state->StateInfo.UnloadDll.BaseAddress >> 32) != 0; + break; + default: + filter_out = FALSE; + break; + } + if (filter_out) + { + if (state->NewState == DbgLoadDllStateChange) + NtClose( state->StateInfo.LoadDll.FileHandle ); + NtDebugContinue( handle, &state->AppClientId, DBG_CONTINUE ); + } + return filter_out; +} + + /********************************************************************** * wow64_NtWaitForDebugEvent */ @@ -1502,7 +1561,12 @@ NTSTATUS WINAPI wow64_NtWaitForDebugEvent( UINT *args ) ULONG i; DBGUI_WAIT_STATE_CHANGE state; - NTSTATUS status = NtWaitForDebugEvent( handle, alertable, timeout, &state ); + NTSTATUS status; + + do + { + status = NtWaitForDebugEvent( handle, alertable, timeout, &state ); + } while (!status && filter_out_state_change( handle, &state )); if (!status) { diff --git a/server/mapping.c b/server/mapping.c index f14ee11cc62..8c436623600 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -378,10 +378,7 @@ static void set_process_machine( struct process *process, struct memory_view *vi static int generate_dll_event( struct thread *thread, int code, struct memory_view *view ) { - unsigned short process_machine = thread->process->machine; - if (!(view->flags & SEC_IMAGE)) return 0; - if (process_machine != native_machine && process_machine != view->image.machine) return 0; generate_debug_event( thread, code, view ); return 1; }
1
0
0
0
Eric Pouech : kernel32/tests: Extend the tests for load/unload debug events on Wow64.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: d203beb5e5dd7e6cd19a18e1cbb281b1a11b7a2f URL:
https://gitlab.winehq.org/wine/wine/-/commit/d203beb5e5dd7e6cd19a18e1cbb281…
Author: Eric Pouech <eric.pouech(a)gmail.com> Date: Sun Mar 12 18:11:30 2023 +0100 kernel32/tests: Extend the tests for load/unload debug events on Wow64. Showing that: - load events for 64bit DLLs are generated for a WOW64 process. - unload events for 64bit DLLs are not generated for a WOW64 process (as any other unload event on process teardown). - a 32bit startup exception is generated as well (with a specific exception code) Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com> --- dlls/kernel32/tests/debugger.c | 153 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/dlls/kernel32/tests/debugger.c b/dlls/kernel32/tests/debugger.c index 2491b1093f1..64662709e2a 100644 --- a/dlls/kernel32/tests/debugger.c +++ b/dlls/kernel32/tests/debugger.c @@ -1077,6 +1077,158 @@ static void test_debug_loop(int argc, char **argv) ok(ret, "DeleteFileA failed, last error %#lx.\n", GetLastError()); } +struct find_main_window +{ + DWORD pid; + unsigned count; + HWND windows[5]; +}; + +static BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam) +{ + struct find_main_window* fmw = (struct find_main_window*)lParam; + DWORD pid = 0; + + if (GetWindowThreadProcessId(handle, &pid) && fmw->pid == pid && + !GetWindow(handle, GW_OWNER)) + { + ok(fmw->count < ARRAY_SIZE(fmw->windows), "Too many windows\n"); + if (fmw->count < ARRAY_SIZE(fmw->windows)) + fmw->windows[fmw->count++] = handle; + } + return TRUE; +} + +static void close_main_windows(DWORD pid) +{ + struct find_main_window fmw = {pid, 0}; + unsigned i; + + EnumWindows(enum_windows_callback, (LPARAM)&fmw); + ok(fmw.count, "no window found\n"); + for (i = 0; i < fmw.count; i++) + PostMessageA(fmw.windows[i], WM_CLOSE, 0, 0); +} + +static void test_debug_loop_wow64(void) +{ + WCHAR buffer[MAX_PATH], *p; + PROCESS_INFORMATION pi; + STARTUPINFOW si; + BOOL ret; + unsigned order = 0, bp_order = 0, bpwx_order = 0, num_ntdll = 0, num_wow64 = 0; + + /* checking conditions for running this test */ + if (GetSystemWow64DirectoryW( buffer, ARRAY_SIZE(buffer) ) && sizeof(void*) > sizeof(int) && pGetMappedFileNameW) + { + wcscat( buffer, L"\\msinfo32.exe" ); + ret = GetFileAttributesW( buffer ) != INVALID_FILE_ATTRIBUTES; + } + else ret = FALSE; + if (!ret) + { + skip("Skipping test on incompatible config\n"); + return; + } + memset( &si, 0, sizeof(si) ); + si.cb = sizeof(si); + ret = CreateProcessW( NULL, buffer, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &si, &pi ); + ok(ret, "CreateProcess failed, last error %#lx.\n", GetLastError()); + + for (;;) + { + DEBUG_EVENT ev; + + ++order; + ret = WaitForDebugEvent( &ev, 2000 ); + if (!ret) break; + + switch (ev.dwDebugEventCode) + { + case CREATE_PROCESS_DEBUG_EVENT: + break; + case LOAD_DLL_DEBUG_EVENT: + if (!pGetMappedFileNameW( pi.hProcess, ev.u.LoadDll.lpBaseOfDll, buffer, ARRAY_SIZE(buffer) )) buffer[0] = L'\0'; + if ((p = wcsrchr( buffer, '\\' ))) p++; + else p = buffer; + if (!memcmp( p, L"wow64", 5 * sizeof(WCHAR) )) + { + /* on Win10, wow64cpu's load dll event is received after first exception */ + ok(bpwx_order == 0, "loaddll for wow64 DLLs should appear before exception\n"); + num_wow64++; + } + else if (!wcsicmp( p, L"ntdll.dll" )) + { + ok(bp_order == 0 && bpwx_order == 0, "loaddll on ntdll should appear before exception\n"); + num_ntdll++; + } + break; + case EXCEPTION_DEBUG_EVENT: + if (ev.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) + bp_order = order; + else if (ev.u.Exception.ExceptionRecord.ExceptionCode == STATUS_WX86_BREAKPOINT) + bpwx_order = order; + } + ret = ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE); + ok(ret, "ContinueDebugEvent failed, last error %#lx.\n", GetLastError()); + if (!ret) break; + } + + /* gracefully terminates msinfo32 */ + close_main_windows( pi.dwProcessId ); + + /* eat up the remaining events... not generating unload dll events in case of process termination */ + for (;;) + { + DEBUG_EVENT ev; + + ret = WaitForDebugEvent( &ev, 2000 ); + if (!ret || ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) break; + switch (ev.dwDebugEventCode) + { + default: + ok(0, "Unexpected event: %lu\n", ev.dwDebugEventCode); + /* fall through */ + case EXIT_PROCESS_DEBUG_EVENT: + case EXIT_THREAD_DEBUG_EVENT: + ret = ContinueDebugEvent( ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE ); + ok(ret, "ContinueDebugEvent failed, last error %#lx.\n", GetLastError()); + break; + } + } + + ret = WaitForSingleObject( pi.hProcess, 2000 ); + if (ret != WAIT_OBJECT_0) + { + DWORD ec; + ret = GetExitCodeProcess( pi.hProcess, &ec ); + ok(ret, "GetExitCodeProcess failed: %lu\n", GetLastError()); + ok(ec != STILL_ACTIVE, "GetExitCodeProcess still active\n"); + } + + ret = CloseHandle( pi.hThread ); + ok(ret, "CloseHandle failed, last error %#lx.\n", GetLastError()); + ret = CloseHandle( pi.hProcess ); + ok(ret, "CloseHandle failed, last error %#lx.\n", GetLastError()); + + if (strcmp( winetest_platform, "wine" ) || num_wow64) /* windows or new wine wow */ + { + ok(num_ntdll == 2, "Expecting two ntdll instances\n"); + ok(num_wow64 >= 3, "Expecting more than 3 wow64*.dll\n"); + } + else /* Wine's old wow, or 32/64 bit only configurations */ + { + ok(num_ntdll == 1, "Expecting one ntdll instances\n"); + ok(num_wow64 == 0, "Expecting more no wow64*.dll\n"); + } + ok(bp_order, "Expecting 1 bp exceptions\n"); + todo_wine + { + ok(bpwx_order, "Expecting 1 bpwx exceptions\n"); + ok(bp_order < bpwx_order, "Out of order bp exceptions\n"); + } +} + static void doChildren(int argc, char **argv) { const char *arguments = "debugger children last"; @@ -2284,6 +2436,7 @@ START_TEST(debugger) test_ExitCode(); test_RemoteDebugger(); test_debug_loop(myARGC, myARGV); + test_debug_loop_wow64(); test_debug_children(myARGV[0], DEBUG_PROCESS, TRUE, FALSE); test_debug_children(myARGV[0], DEBUG_ONLY_THIS_PROCESS, FALSE, FALSE); test_debug_children(myARGV[0], DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS, FALSE, FALSE);
1
0
0
0
Zebediah Figura : ddraw: Make ddraw_surface_init() static.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 107c2608936ed333b71cf06c652763584420dcad URL:
https://gitlab.winehq.org/wine/wine/-/commit/107c2608936ed333b71cf06c652763…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Sun Dec 25 01:06:43 2022 -0600 ddraw: Make ddraw_surface_init() static. --- dlls/ddraw/ddraw_private.h | 2 -- dlls/ddraw/surface.c | 86 +++++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 42ec8868257..18ec1d84a5b 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -238,8 +238,6 @@ struct ddraw_texture HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_desc, struct ddraw_surface **surface, IUnknown *outer_unknown, unsigned int version) DECLSPEC_HIDDEN; struct wined3d_rendertarget_view *ddraw_surface_get_rendertarget_view(struct ddraw_surface *surface) DECLSPEC_HIDDEN; -void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, - struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx) DECLSPEC_HIDDEN; HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface, const RECT *rect, BOOL read, unsigned int swap_interval) DECLSPEC_HIDDEN; diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 30aeb650d5b..b75775cf252 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -5912,6 +5912,49 @@ static const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops = ddraw_surface_wined3d_object_destroyed, }; +static void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, + struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx) +{ + struct ddraw_texture *texture = wined3d_texture_get_parent(wined3d_texture); + unsigned int version = texture->version; + + surface->IDirectDrawSurface7_iface.lpVtbl = &ddraw_surface7_vtbl; + surface->IDirectDrawSurface4_iface.lpVtbl = &ddraw_surface4_vtbl; + surface->IDirectDrawSurface3_iface.lpVtbl = &ddraw_surface3_vtbl; + surface->IDirectDrawSurface2_iface.lpVtbl = &ddraw_surface2_vtbl; + surface->IDirectDrawSurface_iface.lpVtbl = &ddraw_surface1_vtbl; + surface->IDirectDrawGammaControl_iface.lpVtbl = &ddraw_gamma_control_vtbl; + surface->IDirect3DTexture2_iface.lpVtbl = &d3d_texture2_vtbl; + surface->IDirect3DTexture_iface.lpVtbl = &d3d_texture1_vtbl; + surface->iface_count = 1; + surface->version = version; + surface->ddraw = ddraw; + + if (version == 7) + { + surface->ref7 = 1; + surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface7_iface; + } + else if (version == 4) + { + surface->ref4 = 1; + surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface4_iface; + } + else + { + surface->ref1 = 1; + surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface_iface; + } + + surface->first_attached = surface; + + wined3d_texture_incref(surface->wined3d_texture = wined3d_texture); + surface->sub_resource_idx = sub_resource_idx; + surface->texture_location = DDRAW_SURFACE_LOCATION_DEFAULT; + + wined3d_private_store_init(&surface->private_store); +} + static void STDMETHODCALLTYPE ddraw_texture_wined3d_object_destroyed(void *parent) { struct ddraw_texture *texture = parent; @@ -6836,49 +6879,6 @@ fail: return hr; } -void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, - struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx) -{ - struct ddraw_texture *texture = wined3d_texture_get_parent(wined3d_texture); - unsigned int version = texture->version; - - surface->IDirectDrawSurface7_iface.lpVtbl = &ddraw_surface7_vtbl; - surface->IDirectDrawSurface4_iface.lpVtbl = &ddraw_surface4_vtbl; - surface->IDirectDrawSurface3_iface.lpVtbl = &ddraw_surface3_vtbl; - surface->IDirectDrawSurface2_iface.lpVtbl = &ddraw_surface2_vtbl; - surface->IDirectDrawSurface_iface.lpVtbl = &ddraw_surface1_vtbl; - surface->IDirectDrawGammaControl_iface.lpVtbl = &ddraw_gamma_control_vtbl; - surface->IDirect3DTexture2_iface.lpVtbl = &d3d_texture2_vtbl; - surface->IDirect3DTexture_iface.lpVtbl = &d3d_texture1_vtbl; - surface->iface_count = 1; - surface->version = version; - surface->ddraw = ddraw; - - if (version == 7) - { - surface->ref7 = 1; - surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface7_iface; - } - else if (version == 4) - { - surface->ref4 = 1; - surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface4_iface; - } - else - { - surface->ref1 = 1; - surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface_iface; - } - - surface->first_attached = surface; - - wined3d_texture_incref(surface->wined3d_texture = wined3d_texture); - surface->sub_resource_idx = sub_resource_idx; - surface->texture_location = DDRAW_SURFACE_LOCATION_DEFAULT; - - wined3d_private_store_init(&surface->private_store); -} - static void STDMETHODCALLTYPE view_wined3d_object_destroyed(void *parent) { struct ddraw_surface *surface = parent;
1
0
0
0
Zebediah Figura : ddraw: Move sub-resource surface creation to ddraw_texture_init().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 87cd13903c91e7f24ca786e17bc37d20693e2e1d URL:
https://gitlab.winehq.org/wine/wine/-/commit/87cd13903c91e7f24ca786e17bc37d…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Sun Dec 25 01:00:30 2022 -0600 ddraw: Move sub-resource surface creation to ddraw_texture_init(). --- dlls/ddraw/ddraw.c | 28 ++--------------- dlls/ddraw/ddraw_private.h | 3 +- dlls/ddraw/surface.c | 76 +++++++++++++++++++++++++++++++--------------- 3 files changed, 54 insertions(+), 53 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 7d9d25e62c7..d6570739a51 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -5033,35 +5033,11 @@ static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_d enum wined3d_resource_type type, struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, void **parent, const struct wined3d_parent_ops **parent_ops) { - struct ddraw *ddraw = ddraw_from_device_parent(device_parent); - struct ddraw_surface *ddraw_surface; - TRACE("device_parent %p, type %#x, wined3d_texture %p, sub_resource_idx %u, parent %p, parent_ops %p.\n", device_parent, type, wined3d_texture, sub_resource_idx, parent, parent_ops); - /* We have a swapchain or wined3d internal texture. */ - if (type != WINED3D_RTYPE_TEXTURE_2D || !wined3d_texture_get_parent(wined3d_texture) - || wined3d_texture_get_parent(wined3d_texture) == ddraw) - { - *parent = NULL; - *parent_ops = &ddraw_null_wined3d_parent_ops; - - return DD_OK; - } - - if (!(ddraw_surface = heap_alloc_zero(sizeof(*ddraw_surface)))) - { - ERR("Failed to allocate surface memory.\n"); - return DDERR_OUTOFVIDEOMEMORY; - } - - ddraw_surface_init(ddraw_surface, ddraw, wined3d_texture, sub_resource_idx, parent_ops); - *parent = ddraw_surface; - - ddraw_update_lost_surfaces(ddraw); - list_add_head(&ddraw->surface_list, &ddraw_surface->surface_list_entry); - - TRACE("Created ddraw surface %p.\n", ddraw_surface); + *parent = NULL; + *parent_ops = &ddraw_null_wined3d_parent_ops; return DD_OK; } diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index e3fac63a38f..42ec8868257 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -239,8 +239,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_ struct ddraw_surface **surface, IUnknown *outer_unknown, unsigned int version) DECLSPEC_HIDDEN; struct wined3d_rendertarget_view *ddraw_surface_get_rendertarget_view(struct ddraw_surface *surface) DECLSPEC_HIDDEN; void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, - struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, - const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN; + struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx) DECLSPEC_HIDDEN; HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface, const RECT *rect, BOOL read, unsigned int swap_interval) DECLSPEC_HIDDEN; diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 3caee53ee73..30aeb650d5b 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -6117,10 +6117,8 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d draw_texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU; draw_texture_desc.usage = WINED3DUSAGE_PRIVATE; - if (SUCCEEDED(hr = wined3d_texture_create(wined3d_device, &draw_texture_desc, layers, + if (FAILED(hr = wined3d_texture_create(wined3d_device, &draw_texture_desc, layers, levels, 0, NULL, texture, &ddraw_texture_wined3d_parent_ops, &draw_texture))) - wined3d_texture_decref(draw_texture); - else WARN("Failed to create draw texture, hr %#lx.\n", hr); } @@ -6140,16 +6138,6 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), texture, &ddraw_null_wined3d_parent_ops); - - for (i = 0; i < layers * levels; ++i) - { - parent = wined3d_texture_get_sub_resource_parent(draw_texture, i); - assert(parent->wined3d_texture == draw_texture); - parent->draw_texture = draw_texture; - parent->wined3d_texture = wined3d_texture; - wined3d_texture_set_sub_resource_parent(wined3d_texture, i, parent, &ddraw_null_wined3d_parent_ops); - wined3d_texture_incref(wined3d_texture); - } } else { @@ -6167,12 +6155,9 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d goto fail; } - root = wined3d_texture_get_sub_resource_parent(wined3d_texture, 0); - texture->root = root; - for (i = 0; i < layers; ++i) { - struct ddraw_surface **attach = &root->complex_array[layers - 1 - i]; + struct ddraw_surface *prev_level = NULL; for (j = 0; j < levels; ++j) { @@ -6182,7 +6167,27 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d struct ddraw_surface *mip; DDSURFACEDESC2 *mip_desc; - mip = wined3d_texture_get_sub_resource_parent(wined3d_texture, sub_resource_idx); + if (!(mip = heap_alloc_zero(sizeof(*mip)))) + { + hr = DDERR_OUTOFVIDEOMEMORY; + goto fail; + } + + ddraw_surface_init(mip, ddraw, wined3d_texture, sub_resource_idx); + + if (draw_texture) + { + wined3d_texture_set_sub_resource_parent(draw_texture, sub_resource_idx, + mip, &ddraw_surface_wined3d_parent_ops); + wined3d_texture_set_sub_resource_parent(wined3d_texture, sub_resource_idx, + mip, &ddraw_null_wined3d_parent_ops); + wined3d_texture_incref(mip->draw_texture = draw_texture); + } + else + { + wined3d_texture_set_sub_resource_parent(wined3d_texture, sub_resource_idx, + mip, &ddraw_surface_wined3d_parent_ops); + } mip->sysmem_fallback = sysmem_fallback; mip_desc = &mip->surface_desc; @@ -6254,14 +6259,32 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d } - if (mip == root) - continue; + ddraw_update_lost_surfaces(ddraw); + list_add_head(&ddraw->surface_list, &mip->surface_list_entry); - *attach = mip; - attach = &mip->complex_array[0]; + TRACE("Created ddraw surface %p.\n", mip); + + if (!j) + { + if (!i) + texture->root = mip; + else + texture->root->complex_array[layers - 1 - i] = mip; + } + else if (j == 1 && !i) + { + texture->root->complex_array[layers - 1] = mip; + } + else + { + prev_level->complex_array[0] = mip; + } + prev_level = mip; } } + root = texture->root; + wined3d_device_incref(texture->wined3d_device = ddraw->wined3d_device); if (desc->dwFlags & DDSD_CKDESTOVERLAY) @@ -6278,6 +6301,8 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d (struct wined3d_color_key *)&desc->ddckCKSrcBlt); wined3d_texture_decref(wined3d_texture); + if (draw_texture) + wined3d_texture_decref(draw_texture); if (reserve_memory && FAILED(hr = ddraw_surface_reserve_memory(wined3d_texture, 1))) { @@ -6289,6 +6314,9 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d return D3D_OK; fail: + if (draw_texture) + wined3d_texture_decref(draw_texture); + parent = wined3d_texture_get_sub_resource_parent(draw_texture, 0); if (texture->version == 7) IDirectDrawSurface7_Release(&parent->IDirectDrawSurface7_iface); @@ -6809,8 +6837,7 @@ fail: } void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, - struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, - const struct wined3d_parent_ops **parent_ops) + struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx) { struct ddraw_texture *texture = wined3d_texture_get_parent(wined3d_texture); unsigned int version = texture->version; @@ -6847,7 +6874,6 @@ void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, wined3d_texture_incref(surface->wined3d_texture = wined3d_texture); surface->sub_resource_idx = sub_resource_idx; - *parent_ops = &ddraw_surface_wined3d_parent_ops; surface->texture_location = DDRAW_SURFACE_LOCATION_DEFAULT; wined3d_private_store_init(&surface->private_store);
1
0
0
0
Zebediah Figura : wined3d: Pass parent ops to wined3d_resource_set_parent().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: a18bc5f9d78475de22bf94485c5c5968061e3124 URL:
https://gitlab.winehq.org/wine/wine/-/commit/a18bc5f9d78475de22bf94485c5c59…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Sun Dec 25 17:11:58 2022 -0600 wined3d: Pass parent ops to wined3d_resource_set_parent(). So that we can "detach" a wined3d surface from ddraw after creating it, in turn so that we can recreate the backing wined3d texture for a surface, namely for SetSurfaceDesc(). --- dlls/ddraw/surface.c | 14 ++++++++++---- dlls/wined3d/resource.c | 3 ++- dlls/wined3d/wined3d.spec | 2 +- include/wine/wined3d.h | 3 ++- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index a881572e027..3caee53ee73 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -30,6 +30,7 @@ static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface2(IDirectDrawSur static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface); static const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops; +static const struct wined3d_parent_ops ddraw_texture_wined3d_parent_ops; static inline struct ddraw_surface *impl_from_IDirectDrawGammaControl(IDirectDrawGammaControl *iface) { @@ -1349,15 +1350,18 @@ static void ddraw_texture_rename_to(struct ddraw_texture *dst_texture, struct wi { wined3d_texture_set_sub_resource_parent(draw_texture, 0, dst_surface, &ddraw_surface_wined3d_parent_ops); wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface, &ddraw_null_wined3d_parent_ops); + wined3d_resource_set_parent(wined3d_texture_get_resource(draw_texture), + dst_texture, &ddraw_texture_wined3d_parent_ops); + wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), + dst_texture, &ddraw_null_wined3d_parent_ops); } else { wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface, &ddraw_surface_wined3d_parent_ops); + wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), + dst_texture, &ddraw_texture_wined3d_parent_ops); } - wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), dst_texture); - if (draw_texture) - wined3d_resource_set_parent(wined3d_texture_get_resource(draw_texture), dst_texture); dst_surface->wined3d_texture = wined3d_texture; dst_surface->draw_texture = draw_texture; @@ -6134,7 +6138,9 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d NULL, &ddraw_null_wined3d_parent_ops, &wined3d_texture))) goto fail; - wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), texture); + wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), + texture, &ddraw_null_wined3d_parent_ops); + for (i = 0; i < layers * levels; ++i) { parent = wined3d_texture_get_sub_resource_parent(draw_texture, i); diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index e2100627198..c1e16c71799 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -292,9 +292,10 @@ void * CDECL wined3d_resource_get_parent(const struct wined3d_resource *resource return resource->parent; } -void CDECL wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent) +void CDECL wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops) { resource->parent = parent; + resource->parent_ops = parent_ops; } void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, struct wined3d_resource_desc *desc) diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 0f7c7938c39..300fc2978da 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -195,7 +195,7 @@ @ cdecl wined3d_resource_get_priority(ptr) @ cdecl wined3d_resource_map(ptr long ptr ptr long) @ cdecl wined3d_resource_preload(ptr) -@ cdecl wined3d_resource_set_parent(ptr ptr) +@ cdecl wined3d_resource_set_parent(ptr ptr ptr) @ cdecl wined3d_resource_set_priority(ptr long) @ cdecl wined3d_resource_unmap(ptr long) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 4535892fb5f..ea4be6100f2 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2679,7 +2679,8 @@ unsigned int __cdecl wined3d_resource_get_priority(const struct wined3d_resource HRESULT __cdecl wined3d_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, uint32_t flags); void __cdecl wined3d_resource_preload(struct wined3d_resource *resource); -void __cdecl wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent); +void __cdecl wined3d_resource_set_parent(struct wined3d_resource *resource, + void *parent, const struct wined3d_parent_ops *parent_ops); unsigned int __cdecl wined3d_resource_set_priority(struct wined3d_resource *resource, unsigned int priority); HRESULT __cdecl wined3d_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx);
1
0
0
0
Zebediah Figura : wined3d: Pass parent ops to wined3d_texture_set_sub_resource_parent().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 4f8635bd78a4858426e02fa1defe61fae11bfc9f URL:
https://gitlab.winehq.org/wine/wine/-/commit/4f8635bd78a4858426e02fa1defe61…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Fri Dec 23 23:42:22 2022 -0600 wined3d: Pass parent ops to wined3d_texture_set_sub_resource_parent(). So that we can allow setting the sub resource and parent ops not from the texture_sub_resource_created() callback, and also that we can "detach" a wined3d surface from ddraw after creating it, so that we can recreate the backing wined3d texture, viz. in SetSurfaceDesc(). --- dlls/ddraw/surface.c | 15 ++++++++++++--- dlls/wined3d/texture.c | 3 ++- dlls/wined3d/wined3d.spec | 2 +- include/wine/wined3d.h | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index eaa036b21bf..a881572e027 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -29,6 +29,8 @@ WINE_DECLARE_DEBUG_CHANNEL(fps); static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface); static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface); +static const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops; + static inline struct ddraw_surface *impl_from_IDirectDrawGammaControl(IDirectDrawGammaControl *iface) { return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawGammaControl_iface); @@ -1343,9 +1345,16 @@ static void ddraw_texture_rename_to(struct ddraw_texture *dst_texture, struct wi if (dst_surface->sub_resource_idx) ERR("Invalid sub-resource index %u for surface %p.\n", dst_surface->sub_resource_idx, dst_surface); - wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface); if (draw_texture) - wined3d_texture_set_sub_resource_parent(draw_texture, 0, dst_surface); + { + wined3d_texture_set_sub_resource_parent(draw_texture, 0, dst_surface, &ddraw_surface_wined3d_parent_ops); + wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface, &ddraw_null_wined3d_parent_ops); + } + else + { + wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface, &ddraw_surface_wined3d_parent_ops); + } + wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), dst_texture); if (draw_texture) wined3d_resource_set_parent(wined3d_texture_get_resource(draw_texture), dst_texture); @@ -6132,7 +6141,7 @@ static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *d assert(parent->wined3d_texture == draw_texture); parent->draw_texture = draw_texture; parent->wined3d_texture = wined3d_texture; - wined3d_texture_set_sub_resource_parent(wined3d_texture, i, parent); + wined3d_texture_set_sub_resource_parent(wined3d_texture, i, parent, &ddraw_null_wined3d_parent_ops); wined3d_texture_incref(wined3d_texture); } } diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 33b938ad460..c6e80f45766 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -4329,7 +4329,7 @@ void * CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *tex } void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture, - unsigned int sub_resource_idx, void *parent) + unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops) { TRACE("texture %p, sub_resource_idx %u, parent %p.\n", texture, sub_resource_idx, parent); @@ -4337,6 +4337,7 @@ void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *textu return; texture->sub_resources[sub_resource_idx].parent = parent; + texture->sub_resources[sub_resource_idx].parent_ops = parent_ops; } HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture *texture, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 2980568d94e..0f7c7938c39 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -307,7 +307,7 @@ @ cdecl wined3d_texture_set_color_key(ptr long ptr) @ cdecl wined3d_texture_set_lod(ptr long) @ cdecl wined3d_texture_set_overlay_position(ptr long long long) -@ cdecl wined3d_texture_set_sub_resource_parent(ptr long ptr) +@ cdecl wined3d_texture_set_sub_resource_parent(ptr long ptr ptr) @ cdecl wined3d_texture_update_desc(ptr long long long long long long ptr long) @ cdecl wined3d_texture_update_overlay(ptr long ptr ptr long ptr long) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 5d8a1156b21..4535892fb5f 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2866,7 +2866,7 @@ unsigned int __cdecl wined3d_texture_set_lod(struct wined3d_texture *texture, un HRESULT __cdecl wined3d_texture_set_overlay_position(struct wined3d_texture *texture, unsigned int sub_resource_idx, LONG x, LONG y); void __cdecl wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture, - unsigned int sub_resource_idx, void *parent); + unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops); HRESULT __cdecl wined3d_texture_update_desc(struct wined3d_texture *texture, unsigned int sub_resource_idx, UINT width, UINT height, enum wined3d_format_id format_id, enum wined3d_multisample_type multisample_type, UINT multisample_quality,
1
0
0
0
Zebediah Figura : ddraw: Factor out a ddraw_texture_rename_to() helper from ddraw_surface1_Flip().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: f103da7c69cc18aaf63f08a752d870b7049d9d20 URL:
https://gitlab.winehq.org/wine/wine/-/commit/f103da7c69cc18aaf63f08a752d870…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Sun Dec 25 17:00:20 2022 -0600 ddraw: Factor out a ddraw_texture_rename_to() helper from ddraw_surface1_Flip(). --- dlls/ddraw/surface.c | 94 +++++++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 53 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 4d8812cf106..eaa036b21bf 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -1325,6 +1325,36 @@ static unsigned int ddraw_swap_interval_from_flags(DWORD flags) } } +static void ddraw_texture_rename_to(struct ddraw_texture *dst_texture, struct wined3d_texture *wined3d_texture, + struct wined3d_texture *draw_texture, struct wined3d_rendertarget_view *rtv, void *texture_memory) +{ + struct ddraw_surface *dst_surface = dst_texture->root; + struct wined3d_rendertarget_view *current_rtv; + + /* We don't have to worry about potential texture bindings, since + * flippable surfaces can never be textures. */ + + current_rtv = wined3d_device_context_get_rendertarget_view(dst_surface->ddraw->immediate_context, 0); + if (current_rtv == dst_surface->wined3d_rtv) + wined3d_device_context_set_rendertarget_views(dst_surface->ddraw->immediate_context, 0, 1, &rtv, FALSE); + wined3d_rendertarget_view_set_parent(rtv, dst_surface); + dst_surface->wined3d_rtv = rtv; + + if (dst_surface->sub_resource_idx) + ERR("Invalid sub-resource index %u for surface %p.\n", dst_surface->sub_resource_idx, dst_surface); + + wined3d_texture_set_sub_resource_parent(wined3d_texture, 0, dst_surface); + if (draw_texture) + wined3d_texture_set_sub_resource_parent(draw_texture, 0, dst_surface); + wined3d_resource_set_parent(wined3d_texture_get_resource(wined3d_texture), dst_texture); + if (draw_texture) + wined3d_resource_set_parent(wined3d_texture_get_resource(draw_texture), dst_texture); + dst_surface->wined3d_texture = wined3d_texture; + dst_surface->draw_texture = draw_texture; + + dst_texture->texture_memory = texture_memory; +} + /* FRAPS hooks IDirectDrawSurface::Flip and expects the version 1 method to be called when the * game uses later interfaces. */ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface *iface, @@ -1333,9 +1363,9 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface * struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface(iface); struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface(src); struct ddraw_texture *dst_ddraw_texture, *src_ddraw_texture; - struct wined3d_rendertarget_view *tmp_rtv, *src_rtv, *rtv; - DDSCAPS caps = {DDSCAPS_FLIP}; struct wined3d_texture *texture, *draw_texture; + struct wined3d_rendertarget_view *tmp_rtv; + DDSCAPS caps = {DDSCAPS_FLIP}; IDirectDrawSurface *current; void *texture_memory; HRESULT hr; @@ -1359,10 +1389,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface * } tmp_rtv = ddraw_surface_get_rendertarget_view(dst_impl); - if (dst_impl->sub_resource_idx) - ERR("Invalid sub-resource index %u on surface %p.\n", dst_impl->sub_resource_idx, dst_impl); texture = dst_impl->wined3d_texture; - rtv = wined3d_device_context_get_rendertarget_view(dst_impl->ddraw->immediate_context, 0); dst_ddraw_texture = wined3d_texture_get_parent(dst_impl->wined3d_texture); texture_memory = dst_ddraw_texture->texture_memory; draw_texture = dst_impl->draw_texture; @@ -1386,24 +1413,12 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface * } } - src_rtv = ddraw_surface_get_rendertarget_view(src_impl); - if (rtv == dst_impl->wined3d_rtv) - wined3d_device_context_set_rendertarget_views(dst_impl->ddraw->immediate_context, 0, 1, &src_rtv, FALSE); - wined3d_rendertarget_view_set_parent(src_rtv, dst_impl); - dst_impl->wined3d_rtv = src_rtv; - wined3d_texture_set_sub_resource_parent(src_impl->wined3d_texture, 0, dst_impl); - if (src_impl->draw_texture) - wined3d_texture_set_sub_resource_parent(src_impl->draw_texture, 0, dst_impl); src_ddraw_texture = wined3d_texture_get_parent(src_impl->wined3d_texture); - dst_ddraw_texture->texture_memory = src_ddraw_texture->texture_memory; - wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture), dst_ddraw_texture); - if (src_impl->draw_texture) - wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->draw_texture), dst_ddraw_texture); + + ddraw_texture_rename_to(dst_ddraw_texture, src_impl->wined3d_texture, src_impl->draw_texture, + ddraw_surface_get_rendertarget_view(src_impl), src_ddraw_texture->texture_memory); + dst_ddraw_texture = src_ddraw_texture; - if (src_impl->sub_resource_idx) - ERR("Invalid sub-resource index %u on surface %p.\n", src_impl->sub_resource_idx, src_impl); - dst_impl->wined3d_texture = src_impl->wined3d_texture; - dst_impl->draw_texture = src_impl->draw_texture; } else { @@ -1423,44 +1438,17 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface * } src_impl = impl_from_IDirectDrawSurface(current); - src_rtv = ddraw_surface_get_rendertarget_view(src_impl); - if (rtv == dst_impl->wined3d_rtv) - wined3d_device_context_set_rendertarget_views(dst_impl->ddraw->immediate_context, - 0, 1, &src_rtv, FALSE); - wined3d_rendertarget_view_set_parent(src_rtv, dst_impl); - dst_impl->wined3d_rtv = src_rtv; - wined3d_texture_set_sub_resource_parent(src_impl->wined3d_texture, 0, dst_impl); - if (src_impl->draw_texture) - wined3d_texture_set_sub_resource_parent(src_impl->draw_texture, 0, dst_impl); src_ddraw_texture = wined3d_texture_get_parent(src_impl->wined3d_texture); - dst_ddraw_texture->texture_memory = src_ddraw_texture->texture_memory; - wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->wined3d_texture), dst_ddraw_texture); - if (src_impl->draw_texture) - wined3d_resource_set_parent(wined3d_texture_get_resource(src_impl->draw_texture), dst_ddraw_texture); + + ddraw_texture_rename_to(dst_ddraw_texture, src_impl->wined3d_texture, src_impl->draw_texture, + ddraw_surface_get_rendertarget_view(src_impl), src_ddraw_texture->texture_memory); + dst_ddraw_texture = src_ddraw_texture; - if (src_impl->sub_resource_idx) - ERR("Invalid sub-resource index %u on surface %p.\n", src_impl->sub_resource_idx, src_impl); - dst_impl->wined3d_texture = src_impl->wined3d_texture; - dst_impl->draw_texture = src_impl->draw_texture; dst_impl = src_impl; } } - /* We don't have to worry about potential texture bindings, since - * flippable surfaces can never be textures. */ - if (rtv == src_impl->wined3d_rtv) - wined3d_device_context_set_rendertarget_views(dst_impl->ddraw->immediate_context, 0, 1, &tmp_rtv, FALSE); - wined3d_rendertarget_view_set_parent(tmp_rtv, src_impl); - src_impl->wined3d_rtv = tmp_rtv; - wined3d_texture_set_sub_resource_parent(texture, 0, src_impl); - if (draw_texture) - wined3d_texture_set_sub_resource_parent(draw_texture, 0, src_impl); - dst_ddraw_texture->texture_memory = texture_memory; - wined3d_resource_set_parent(wined3d_texture_get_resource(texture), dst_ddraw_texture); - if (draw_texture) - wined3d_resource_set_parent(wined3d_texture_get_resource(draw_texture), dst_ddraw_texture); - src_impl->wined3d_texture = texture; - src_impl->draw_texture = draw_texture; + ddraw_texture_rename_to(dst_ddraw_texture, texture, draw_texture, tmp_rtv, texture_memory); if (flags & ~(DDFLIP_NOVSYNC | DDFLIP_INTERVAL2 | DDFLIP_INTERVAL3 | DDFLIP_INTERVAL4)) {
1
0
0
0
Alexandre Julliard : wow64: Convert token and debug port in NtCreateUserProcess().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: c4adc651df11f038cf9470ebcd951e4ae1c56574 URL:
https://gitlab.winehq.org/wine/wine/-/commit/c4adc651df11f038cf9470ebcd951e…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Mar 22 15:23:48 2023 +0100 wow64: Convert token and debug port in NtCreateUserProcess(). --- dlls/wow64/process.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index 48e5ad57228..2182491bbfb 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -184,6 +184,8 @@ static PS_ATTRIBUTE_LIST *ps_attributes_32to64( PS_ATTRIBUTE_LIST **attr, const } break; case PS_ATTRIBUTE_PARENT_PROCESS: + case PS_ATTRIBUTE_DEBUG_PORT: + case PS_ATTRIBUTE_TOKEN: ret->Attributes[i].Size = sizeof(HANDLE); ret->Attributes[i].ValuePtr = LongToHandle( attr32->Attributes[i].Value ); break;
1
0
0
0
Alexandre Julliard : wow64: Allow the CPU backend to override CPU information.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: d41117b61ed3ccc34900c76611f6ce7b534521ce URL:
https://gitlab.winehq.org/wine/wine/-/commit/d41117b61ed3ccc34900c76611f6ce…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Mar 22 13:20:00 2023 +0100 wow64: Allow the CPU backend to override CPU information. --- dlls/wow64/syscall.c | 3 ++- dlls/wow64/system.c | 4 +++- dlls/wow64/wow64_private.h | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index d057fcc256e..06dd9822a08 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -110,7 +110,7 @@ static void (WINAPI *pBTCpuSimulate)(void); static NTSTATUS (WINAPI *pBTCpuResetToConsistentState)( EXCEPTION_POINTERS * ); static void * (WINAPI *p__wine_get_unix_opcode)(void); static void * (WINAPI *pKiRaiseUserExceptionDispatcher)(void); - +void (WINAPI *pBTCpuUpdateProcessorInformation)( SYSTEM_CPU_INFORMATION * ) = NULL; void *dummy = RtlUnwind; @@ -842,6 +842,7 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex GET_PTR( BTCpuResetToConsistentState ); GET_PTR( BTCpuSetContext ); GET_PTR( BTCpuSimulate ); + GET_PTR( BTCpuUpdateProcessorInformation ); GET_PTR( __wine_get_unix_opcode ); module = load_64bit_module( L"wow64win.dll" ); diff --git a/dlls/wow64/system.c b/dlls/wow64/system.c index 5d111cc942d..21e191b8a29 100644 --- a/dlls/wow64/system.c +++ b/dlls/wow64/system.c @@ -337,7 +337,9 @@ NTSTATUS WINAPI wow64_NtQuerySystemInformation( UINT *args ) case SystemCpuInformation: /* SYSTEM_CPU_INFORMATION */ case SystemEmulationProcessorInformation: /* SYSTEM_CPU_INFORMATION */ - return NtQuerySystemInformation( SystemEmulationProcessorInformation, ptr, len, retlen ); + status = NtQuerySystemInformation( SystemEmulationProcessorInformation, ptr, len, retlen ); + if (!status && pBTCpuUpdateProcessorInformation) pBTCpuUpdateProcessorInformation( ptr ); + return status; case SystemBasicInformation: /* SYSTEM_BASIC_INFORMATION */ case SystemEmulationBasicInformation: /* SYSTEM_BASIC_INFORMATION */ diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h index 7eef4da3ad9..bba191ad439 100644 --- a/dlls/wow64/wow64_private.h +++ b/dlls/wow64/wow64_private.h @@ -38,6 +38,7 @@ extern ULONG_PTR args_alignment DECLSPEC_HIDDEN; extern ULONG_PTR highest_user_address DECLSPEC_HIDDEN; extern ULONG_PTR default_zero_bits DECLSPEC_HIDDEN; extern SYSTEM_DLL_INIT_BLOCK *pLdrSystemDllInitBlock DECLSPEC_HIDDEN; +extern void (WINAPI *pBTCpuUpdateProcessorInformation)( SYSTEM_CPU_INFORMATION * ) DECLSPEC_HIDDEN; struct object_attr64 {
1
0
0
0
← Newer
1
...
37
38
39
40
41
42
43
...
91
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Results per page:
10
25
50
100
200