From b68b6e23d1f50d7ff04df728257dab8294244ab3 Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Wed, 12 Mar 2014 11:57:15 -0400 Subject: [PATCH] Fixed various build and runtime errors when using WinRT with VS2012. --- .../SDL/SDL-WinPhone_VS2012.vcxproj | 28 ++++++++++----- .../SDL/SDL-WinPhone_VS2012.vcxproj.filters | 36 +++++++++++++++++-- VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj | 20 +++++++---- .../SDL/SDL-WinRT_VS2012.vcxproj.filters | 24 +++++++++++++ include/SDL_config_winrt.h | 3 +- src/core/winrt/SDL_winrtapp_xaml.cpp | 2 +- src/dynapi/SDL_dynapi.h | 2 ++ src/power/SDL_power.c | 4 +++ src/render/direct3d11/SDL_render_d3d11.c | 19 +++++----- .../SDL_render_d3d11_winrthelpers.cpp | 2 ++ src/thread/stdcpp/SDL_sysmutex.cpp | 15 ++++++++ 11 files changed, 125 insertions(+), 30 deletions(-) diff --git a/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj b/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj index 4eaeca36b..12c724dde 100644 --- a/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj +++ b/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj @@ -62,7 +62,7 @@ - _USRDLL;UNICODE;%(PreprocessorDefinitions) + _USRDLL;UNICODE;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) NotUsing pch.h false @@ -75,12 +75,12 @@ false false true - d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) - _USRDLL;UNICODE;NDEBUG;%(PreprocessorDefinitions) + _USRDLL;UNICODE;SDL_BUILDING_WINRT=1;NDEBUG;%(PreprocessorDefinitions) NotUsing pch.h false @@ -92,12 +92,12 @@ false false true - d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) - _USRDLL;UNICODE;%(PreprocessorDefinitions) + _USRDLL;UNICODE;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) NotUsing pch.h false @@ -110,12 +110,12 @@ false false true - d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) - _USRDLL;UNICODE;NDEBUG;%(PreprocessorDefinitions) + _USRDLL;UNICODE;SDL_BUILDING_WINRT=1;NDEBUG;%(PreprocessorDefinitions) NotUsing pch.h false @@ -127,7 +127,7 @@ false false true - d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) + DXGI.lib;d3d11.lib;xaudio2.lib;WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;%(AdditionalDependencies) @@ -201,6 +201,9 @@ + + + @@ -215,7 +218,9 @@ + + @@ -289,6 +294,7 @@ true + @@ -311,12 +317,16 @@ - + + + + true true true true + diff --git a/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj.filters b/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj.filters index 9535fe759..4c8d7d485 100644 --- a/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj.filters +++ b/VisualC-WinPhone/SDL/SDL-WinPhone_VS2012.vcxproj.filters @@ -339,6 +339,21 @@ Header Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -572,9 +587,6 @@ Source Files - - Source Files - Source Files @@ -608,5 +620,23 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + \ No newline at end of file diff --git a/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj b/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj index cc5fddd7b..c864a97d1 100644 --- a/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj +++ b/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj @@ -72,6 +72,7 @@ true + @@ -96,6 +97,8 @@ + + true @@ -107,6 +110,7 @@ + @@ -270,6 +274,9 @@ + + + @@ -289,6 +296,7 @@ + @@ -426,7 +434,7 @@ NotUsing false ..\..\include;%(AdditionalIncludeDirectories) - _WINDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;_CRT_SECURE_NO_WARNINGS;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) Console @@ -440,7 +448,7 @@ NotUsing false ..\..\include;%(AdditionalIncludeDirectories) - _WINDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;_CRT_SECURE_NO_WARNINGS;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) Console @@ -454,7 +462,7 @@ NotUsing false ..\..\include;%(AdditionalIncludeDirectories) - _WINDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;_CRT_SECURE_NO_WARNINGS;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) Console @@ -468,7 +476,7 @@ NotUsing false ..\..\include;%(AdditionalIncludeDirectories) - _WINDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;_CRT_SECURE_NO_WARNINGS;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) Console @@ -482,7 +490,7 @@ NotUsing false ..\..\include;%(AdditionalIncludeDirectories) - _WINDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;_CRT_SECURE_NO_WARNINGS;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) Console @@ -496,7 +504,7 @@ NotUsing false ..\..\include;%(AdditionalIncludeDirectories) - _WINDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;_CRT_SECURE_NO_WARNINGS;SDL_BUILDING_WINRT=1;%(PreprocessorDefinitions) Console diff --git a/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj.filters b/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj.filters index fb3195f91..108cc86b4 100644 --- a/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj.filters +++ b/VisualC-WinRT/SDL/SDL-WinRT_VS2012.vcxproj.filters @@ -283,6 +283,18 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -642,6 +654,18 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + diff --git a/include/SDL_config_winrt.h b/include/SDL_config_winrt.h index 2d9258132..78b43ab64 100644 --- a/include/SDL_config_winrt.h +++ b/include/SDL_config_winrt.h @@ -180,8 +180,7 @@ typedef unsigned int uintptr_t; #endif /* Enable system power support */ -// TODO, WinRT: investigate system power support. The Win32-based APIs don't work on WinRT. -#define SDL_POWER_DISABLED 1 +#define SDL_POWER_WINRT 1 /* Enable assembly routines (Win64 doesn't have inline asm) */ #ifndef _WIN64 diff --git a/src/core/winrt/SDL_winrtapp_xaml.cpp b/src/core/winrt/SDL_winrtapp_xaml.cpp index 67a5cddea..7fe3b822e 100644 --- a/src/core/winrt/SDL_winrtapp_xaml.cpp +++ b/src/core/winrt/SDL_winrtapp_xaml.cpp @@ -42,7 +42,7 @@ SDL_bool WINRT_XAMLWasEnabled = SDL_FALSE; #if WINAPI_FAMILY == WINAPI_FAMILY_APP -ISwapChainBackgroundPanelNative * WINRT_GlobalSwapChainBackgroundPanelNative = NULL; +extern "C" ISwapChainBackgroundPanelNative * WINRT_GlobalSwapChainBackgroundPanelNative = NULL; static Windows::Foundation::EventRegistrationToken WINRT_XAMLAppEventToken; #endif diff --git a/src/dynapi/SDL_dynapi.h b/src/dynapi/SDL_dynapi.h index 3752de1c5..d318552f0 100644 --- a/src/dynapi/SDL_dynapi.h +++ b/src/dynapi/SDL_dynapi.h @@ -45,6 +45,8 @@ #if TARGET_OS_IPHONE /* probably not useful on iOS. */ #define SDL_DYNAMIC_API 0 +#elif SDL_BUILDING_WINRT /* probaly not useful on WinRT, given current .dll loading restrictions */ +#define SDL_DYNAMIC_API 0 #else /* everyone else. */ #define SDL_DYNAMIC_API 1 #endif diff --git a/src/power/SDL_power.c b/src/power/SDL_power.c index 0e30f9037..10f8355f4 100644 --- a/src/power/SDL_power.c +++ b/src/power/SDL_power.c @@ -37,6 +37,7 @@ SDL_bool SDL_GetPowerInfo_Haiku(SDL_PowerState *, int *, int *); SDL_bool SDL_GetPowerInfo_UIKit(SDL_PowerState *, int *, int *); SDL_bool SDL_GetPowerInfo_Android(SDL_PowerState *, int *, int *); SDL_bool SDL_GetPowerInfo_PSP(SDL_PowerState *, int *, int *); +SDL_bool SDL_GetPowerInfo_WinRT(SDL_PowerState *, int *, int *); #ifndef SDL_POWER_DISABLED #ifdef SDL_POWER_HARDWIRED @@ -77,6 +78,9 @@ static SDL_GetPowerInfo_Impl implementations[] = { #ifdef SDL_POWER_PSP /* handles PSP. */ SDL_GetPowerInfo_PSP, #endif +#ifdef SDL_POWER_WINRT /* handles WinRT */ + SDL_GetPowerInfo_WinRT, +#endif #ifdef SDL_POWER_HARDWIRED SDL_GetPowerInfo_Hardwired, diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index 58673d465..2f683b2ca 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -961,11 +961,10 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer) D3D11_SAMPLER_DESC samplerDesc; D3D11_RASTERIZER_DESC rasterDesc; - // TODO, WinRT, Mar 11, 2014: once SDL/WinRT is back up and running, see if D3D11 init functions are loadable (via LoadPackagedLibrary/SDL_LoadObject, etc.) -//#ifdef __WINRT__ -// CreateDXGIFactoryFunc = CreateDXGIFactory; -// D3D11CreateDeviceFunc = D3D11CreateDevice; -//#else +#ifdef __WINRT__ + CreateDXGIFactoryFunc = CreateDXGIFactory1; + D3D11CreateDeviceFunc = D3D11CreateDevice; +#else data->hDXGIMod = SDL_LoadObject("dxgi.dll"); if (!data->hDXGIMod) { result = E_FAIL; @@ -989,7 +988,7 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer) result = E_FAIL; goto done; } -//#endif /* __WINRT__ */ +#endif /* __WINRT__ */ result = CreateDXGIFactoryFunc(&IID_IDXGIFactory2, &data->dxgiFactory); if (FAILED(result)) { @@ -2833,6 +2832,11 @@ D3D11_RenderPresent(SDL_Renderer * renderer) HRESULT result; DXGI_PRESENT_PARAMETERS parameters; +#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP + syncInterval = 1; + presentFlags = 0; + result = IDXGISwapChain_Present(data->swapChain, syncInterval, presentFlags); +#else if (renderer->info.flags & SDL_RENDERER_PRESENTVSYNC) { syncInterval = 1; presentFlags = 0; @@ -2841,9 +2845,6 @@ D3D11_RenderPresent(SDL_Renderer * renderer) presentFlags = DXGI_PRESENT_DO_NOT_WAIT; } -#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - result = IDXGISwapChain_Present(data->swapChain, syncInterval, presentFlags); -#else /* The application may optionally specify "dirty" or "scroll" * rects to improve efficiency in certain scenarios. * This option is not available on Windows Phone 8, to note. diff --git a/src/render/direct3d11/SDL_render_d3d11_winrthelpers.cpp b/src/render/direct3d11/SDL_render_d3d11_winrthelpers.cpp index 25e6765e9..78d99123a 100644 --- a/src/render/direct3d11/SDL_render_d3d11_winrthelpers.cpp +++ b/src/render/direct3d11/SDL_render_d3d11_winrthelpers.cpp @@ -37,6 +37,8 @@ extern "C" { using namespace Windows::UI::Core; using namespace Windows::Graphics::Display; +#include + extern "C" void * D3D11_GetCoreWindowFromSDLRenderer(SDL_Renderer * renderer) diff --git a/src/thread/stdcpp/SDL_sysmutex.cpp b/src/thread/stdcpp/SDL_sysmutex.cpp index ac325039f..c652aabd0 100644 --- a/src/thread/stdcpp/SDL_sysmutex.cpp +++ b/src/thread/stdcpp/SDL_sysmutex.cpp @@ -79,6 +79,21 @@ SDL_mutexP(SDL_mutex * mutex) } } +/* TryLock the mutex */ +int +SDL_TryLockMutex(SDL_mutex * mutex) +{ + int retval = 0; + if (mutex == NULL) { + return SDL_SetError("Passed a NULL mutex"); + } + + if (mutex->cpp_mutex.try_lock() == false) { + retval = SDL_MUTEX_TIMEDOUT; + } + return retval; +} + /* Unlock the mutex */ extern "C" int