From d6afc1c608a6a67ebd64fd52f8c7b3410bf8a314 Mon Sep 17 00:00:00 2001 From: Joel Linn Date: Fri, 25 Dec 2020 04:00:20 +0300 Subject: [PATCH] thread/windows: Statically link synchronization APIs on WINRT GetModuleHandleW is not available on those platforms --- .../WinPhone81_VS2013/SDL-WinPhone81.vcxproj | 8 ++++---- VisualC-WinRT/WinRT81_VS2013/SDL-WinRT81.vcxproj | 12 ++++++------ src/thread/windows/SDL_sysmutex.c | 12 ++++++++++++ src/thread/windows/SDL_syssem.c | 11 +++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) --- .../WinPhone81_VS2013/SDL-WinPhone81.vcxproj | 8 ++++---- VisualC-WinRT/WinRT81_VS2013/SDL-WinRT81.vcxproj | 12 ++++++------ src/thread/windows/SDL_sysmutex.c | 12 ++++++++++++ src/thread/windows/SDL_syssem.c | 11 +++++++++++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/VisualC-WinRT/WinPhone81_VS2013/SDL-WinPhone81.vcxproj b/VisualC-WinRT/WinPhone81_VS2013/SDL-WinPhone81.vcxproj index b36d4f111..f91dbcd65 100644 --- a/VisualC-WinRT/WinPhone81_VS2013/SDL-WinPhone81.vcxproj +++ b/VisualC-WinRT/WinPhone81_VS2013/SDL-WinPhone81.vcxproj @@ -431,7 +431,7 @@ Console false false - DXGI.lib;d3d11.lib;mmdevapi.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;mmdevapi.lib;synchronization.lib;%(AdditionalDependencies) @@ -445,7 +445,7 @@ Console false false - DXGI.lib;d3d11.lib;mmdevapi.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;mmdevapi.lib;synchronization.lib;%(AdditionalDependencies) @@ -459,7 +459,7 @@ Console false false - DXGI.lib;d3d11.lib;mmdevapi.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;mmdevapi.lib;synchronization.lib;%(AdditionalDependencies) @@ -473,7 +473,7 @@ Console false false - DXGI.lib;d3d11.lib;mmdevapi.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;mmdevapi.lib;synchronization.lib;%(AdditionalDependencies) diff --git a/VisualC-WinRT/WinRT81_VS2013/SDL-WinRT81.vcxproj b/VisualC-WinRT/WinRT81_VS2013/SDL-WinRT81.vcxproj index 39e791ad3..9e4fbe768 100644 --- a/VisualC-WinRT/WinRT81_VS2013/SDL-WinRT81.vcxproj +++ b/VisualC-WinRT/WinRT81_VS2013/SDL-WinRT81.vcxproj @@ -510,7 +510,7 @@ Console false false - vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies) + vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies) vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries) @@ -525,7 +525,7 @@ Console false false - vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies) + vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies) vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries) @@ -540,7 +540,7 @@ Console false false - vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies) + vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies) vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries) @@ -555,7 +555,7 @@ Console false false - vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies) + vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies) vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries) @@ -570,7 +570,7 @@ Console false false - vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies) + vccorlibd.lib;msvcrtd.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies) vccorlibd;msvcrtd;%(IgnoreSpecificDefaultLibraries) @@ -585,7 +585,7 @@ Console false false - vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;%(AdditionalDependencies) + vccorlib.lib;msvcrt.lib;xinput.lib;mmdevapi.lib;d2d1.lib;d3d11.lib;dxgi.lib;ole32.lib;windowscodecs.lib;dwrite.lib;kernel32.lib;synchronization.lib;%(AdditionalDependencies) vccorlib;msvcrt;%(IgnoreSpecificDefaultLibraries) diff --git a/src/thread/windows/SDL_sysmutex.c b/src/thread/windows/SDL_sysmutex.c index 7076239e7..eb4df31ae 100644 --- a/src/thread/windows/SDL_sysmutex.c +++ b/src/thread/windows/SDL_sysmutex.c @@ -66,12 +66,19 @@ typedef struct _SRWLOCK { } SRWLOCK, *PSRWLOCK; #endif +#if __WINRT__ +/* Functions are guaranteed to be available */ +#define pReleaseSRWLockExclusive ReleaseSRWLockExclusive +#define pAcquireSRWLockExclusive AcquireSRWLockExclusive +#define pTryAcquireSRWLockExclusive TryAcquireSRWLockExclusive +#else typedef VOID(WINAPI *pfnReleaseSRWLockExclusive)(PSRWLOCK); typedef VOID(WINAPI *pfnAcquireSRWLockExclusive)(PSRWLOCK); typedef BOOLEAN(WINAPI *pfnTryAcquireSRWLockExclusive)(PSRWLOCK); static pfnReleaseSRWLockExclusive pReleaseSRWLockExclusive = NULL; static pfnAcquireSRWLockExclusive pAcquireSRWLockExclusive = NULL; static pfnTryAcquireSRWLockExclusive pTryAcquireSRWLockExclusive = NULL; +#endif typedef struct SDL_mutex_srw { @@ -291,6 +298,10 @@ SDL_CreateMutex(void) const SDL_mutex_impl_t * impl = &SDL_mutex_impl_cs; if (!SDL_GetHintBoolean(SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS, SDL_FALSE)) { +#if __WINRT__ + /* Link statically on this platform */ + impl = &SDL_mutex_impl_srw; +#else /* Try faster implementation for Windows 7 and newer */ HMODULE kernel32 = GetModuleHandleW(L"kernel32.dll"); if (kernel32) { @@ -303,6 +314,7 @@ SDL_CreateMutex(void) impl = &SDL_mutex_impl_srw; } } +#endif } /* Copy instead of using pointer to save one level of indirection */ diff --git a/src/thread/windows/SDL_syssem.c b/src/thread/windows/SDL_syssem.c index ed0e78b2c..45497fc4a 100644 --- a/src/thread/windows/SDL_syssem.c +++ b/src/thread/windows/SDL_syssem.c @@ -66,11 +66,17 @@ static SDL_sem_impl_t SDL_sem_impl_active = {0}; * Atomic + WaitOnAddress implementation */ +#if __WINRT__ +/* Functions are guaranteed to be available */ +#define pWaitOnAddress WaitOnAddress +#define pWakeByAddressSingle WakeByAddressSingle +#else typedef BOOL(WINAPI *pfnWaitOnAddress)(volatile VOID*, PVOID, SIZE_T, DWORD); typedef VOID(WINAPI *pfnWakeByAddressSingle)(PVOID); static pfnWaitOnAddress pWaitOnAddress = NULL; static pfnWakeByAddressSingle pWakeByAddressSingle = NULL; +#endif typedef struct SDL_semaphore_atom { @@ -387,6 +393,10 @@ SDL_CreateSemaphore(Uint32 initial_value) const SDL_sem_impl_t * impl = &SDL_sem_impl_kern; if (!SDL_GetHintBoolean(SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL, SDL_FALSE)) { +#if __WINRT__ + /* Link statically on this platform */ + impl = &SDL_sem_impl_atom; +#else /* We already statically link to features from this Api * Set (e.g. WaitForSingleObject). Dynamically loading * API Sets is not explicitly documented but according to @@ -403,6 +413,7 @@ SDL_CreateSemaphore(Uint32 initial_value) impl = &SDL_sem_impl_atom; } } +#endif } /* Copy instead of using pointer to save one level of indirection */