diff --git a/.gitignore b/.gitignore index cebabd2c39e0..d7b1e057fd8a 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,14 @@ CMakeLists.txt.user /.idea/ # Ignore Visual Studio Code's working dir /.vscode/ + +# Ignore UWP generated content and packages +/Source/x64/Release/DolphinUWP +/Source/packages/ +/Source/Core/DolphinUWP/x64/Release +/Source/Core/DolphinUWP/Generated Files/winrt +/Source/AppPackages/DolphinUWP +/Source/Core/DolphinUWP/BundleArtifacts +/Source/Core/DolphinUWP/DolphinUWP_TemporaryKey.pfx +/Source/Core/DolphinNoGUI/DolphinNoGUI.aps +/Source/Core/DolphinUWP/Generated Files diff --git a/Externals/Bochs_disasm/Bochs_disasm.vcxproj b/Externals/Bochs_disasm/Bochs_disasm.vcxproj index ca6e249b7d95..1e7a109dadb8 100644 --- a/Externals/Bochs_disasm/Bochs_disasm.vcxproj +++ b/Externals/Bochs_disasm/Bochs_disasm.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B} diff --git a/Externals/FatFs/FatFs.vcxproj b/Externals/FatFs/FatFs.vcxproj index 659f66083bfa..c8963b4680cc 100644 --- a/Externals/FatFs/FatFs.vcxproj +++ b/Externals/FatFs/FatFs.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {3F17D282-A77D-4931-B844-903AD0809A5E} @@ -30,4 +64,4 @@ - + \ No newline at end of file diff --git a/Externals/FreeSurround/FreeSurround.vcxproj b/Externals/FreeSurround/FreeSurround.vcxproj index da3a11776abd..7a4bea53e40b 100644 --- a/Externals/FreeSurround/FreeSurround.vcxproj +++ b/Externals/FreeSurround/FreeSurround.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {8498F2FA-5CA6-4169-9971-DE5B1FE6132C} diff --git a/Externals/LZO/LZO.vcxproj b/Externals/LZO/LZO.vcxproj index df9855ccf9c0..101a85c5fb0b 100644 --- a/Externals/LZO/LZO.vcxproj +++ b/Externals/LZO/LZO.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {AB993F38-C31D-4897-B139-A620C42BC565} diff --git a/Externals/SDL/SDL2.vcxproj b/Externals/SDL/SDL2.vcxproj index 7847419e3229..4617e36e3441 100644 --- a/Externals/SDL/SDL2.vcxproj +++ b/Externals/SDL/SDL2.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {8DC244EE-A0BD-4038-BAF7-CFAFA5EB2BAA} diff --git a/Externals/SFML/build/vc2010/SFML_Network.vcxproj b/Externals/SFML/build/vc2010/SFML_Network.vcxproj index f93a95f09272..b92b5ab3c711 100644 --- a/Externals/SFML/build/vc2010/SFML_Network.vcxproj +++ b/Externals/SFML/build/vc2010/SFML_Network.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {93D73454-2512-424E-9CDA-4BB357FE13DD} diff --git a/Externals/bzip2/bzip2.vcxproj b/Externals/bzip2/bzip2.vcxproj index 4b9ab54472e7..253a920bc638 100644 --- a/Externals/bzip2/bzip2.vcxproj +++ b/Externals/bzip2/bzip2.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {1D8C51D2-FFA4-418E-B183-9F42B6A6717E} diff --git a/Externals/cpp-optparse/cpp-optparse.vcxproj b/Externals/cpp-optparse/cpp-optparse.vcxproj index 93196962de80..e979fc2dcf3e 100644 --- a/Externals/cpp-optparse/cpp-optparse.vcxproj +++ b/Externals/cpp-optparse/cpp-optparse.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {C636D9D1-82FE-42B5-9987-63B7D4836341} diff --git a/Externals/cubeb/msvc/cubeb.vcxproj b/Externals/cubeb/msvc/cubeb.vcxproj index d492b4ac9c50..17b1c245ebbc 100644 --- a/Externals/cubeb/msvc/cubeb.vcxproj +++ b/Externals/cubeb/msvc/cubeb.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {8EA11166-6512-44FC-B7A5-A4D1ECC81170} @@ -26,6 +60,11 @@ NDEBUG;%(PreprocessorDefinitions) + + + NDEBUG;%(PreprocessorDefinitions) + + diff --git a/Externals/curl/curl.vcxproj b/Externals/curl/curl.vcxproj index d69ae6e875cc..75baf97a6ecb 100644 --- a/Externals/curl/curl.vcxproj +++ b/Externals/curl/curl.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {BB00605C-125F-4A21-B33B-7BF418322DCB} diff --git a/Externals/discord-rpc/src/discord-rpc.vcxproj b/Externals/discord-rpc/src/discord-rpc.vcxproj index a3f1b38e7fe9..301195fd1e43 100644 --- a/Externals/discord-rpc/src/discord-rpc.vcxproj +++ b/Externals/discord-rpc/src/discord-rpc.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD} @@ -41,4 +75,4 @@ - + \ No newline at end of file diff --git a/Externals/ed25519/ed25519.vcxproj b/Externals/ed25519/ed25519.vcxproj index fa79d4deb9eb..96ed74c61699 100644 --- a/Externals/ed25519/ed25519.vcxproj +++ b/Externals/ed25519/ed25519.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3} diff --git a/Externals/enet/enet.vcxproj b/Externals/enet/enet.vcxproj index 21f16b6b0765..bacf30b76a85 100644 --- a/Externals/enet/enet.vcxproj +++ b/Externals/enet/enet.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {CBC76802-C128-4B17-BF6C-23B08C313E5E} diff --git a/Externals/fmt/fmt.vcxproj b/Externals/fmt/fmt.vcxproj index 3f0259177c36..8b337fd708fb 100644 --- a/Externals/fmt/fmt.vcxproj +++ b/Externals/fmt/fmt.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {4BC5A148-0AB3-440F-A980-A29B4B999190} diff --git a/Externals/glslang/glslang.vcxproj b/Externals/glslang/glslang.vcxproj index a602d6e24c1e..340f394d8f4e 100644 --- a/Externals/glslang/glslang.vcxproj +++ b/Externals/glslang/glslang.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {D178061B-84D3-44F9-BEED-EFD18D9033F0} @@ -131,4 +165,4 @@ - + \ No newline at end of file diff --git a/Externals/imgui/imgui.vcxproj b/Externals/imgui/imgui.vcxproj index bcbd4d0766a6..33ecea3ed1b3 100644 --- a/Externals/imgui/imgui.vcxproj +++ b/Externals/imgui/imgui.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB} diff --git a/Externals/liblzma/liblzma.vcxproj b/Externals/liblzma/liblzma.vcxproj index a4b7ff4a9d94..719e55718069 100644 --- a/Externals/liblzma/liblzma.vcxproj +++ b/Externals/liblzma/liblzma.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {055A775F-B4F5-4970-9240-F6CF7661F37B} diff --git a/Externals/libspng/spng.vcxproj b/Externals/libspng/spng.vcxproj index 3a37bbaf5ace..29846ca0323f 100644 --- a/Externals/libspng/spng.vcxproj +++ b/Externals/libspng/spng.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {447B7B1E-1D74-4AEF-B2B9-6EB41C5D5313} diff --git a/Externals/libusb/libusb-1.0.vcxproj b/Externals/libusb/libusb-1.0.vcxproj index 5834338af97a..4404e245a78a 100644 --- a/Externals/libusb/libusb-1.0.vcxproj +++ b/Externals/libusb/libusb-1.0.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {349EE8F9-7D25-4909-AAF5-FF3FADE72187} diff --git a/Externals/mGBA/mgba.vcxproj b/Externals/mGBA/mgba.vcxproj index 56112ae8b67a..c188f79c1be3 100644 --- a/Externals/mGBA/mgba.vcxproj +++ b/Externals/mGBA/mgba.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {864C4C8E-296D-3DBC-AD83-F1D5CB6E8EC6} diff --git a/Externals/mbedtls/mbedTLS.vcxproj b/Externals/mbedtls/mbedTLS.vcxproj index bb8f86cae9d8..28544cc21780 100644 --- a/Externals/mbedtls/mbedTLS.vcxproj +++ b/Externals/mbedtls/mbedTLS.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {BDB6578B-0691-4E80-A46C-DF21639FD3B8} diff --git a/Externals/miniupnpc/miniupnpc.vcxproj b/Externals/miniupnpc/miniupnpc.vcxproj index 44cd1b3c4569..6719725c3bcb 100644 --- a/Externals/miniupnpc/miniupnpc.vcxproj +++ b/Externals/miniupnpc/miniupnpc.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {31643FDB-1BB8-4965-9DE7-000FC88D35AE} diff --git a/Externals/minizip/minizip.vcxproj b/Externals/minizip/minizip.vcxproj index d6e06b7aa3bc..ef0f15abd428 100644 --- a/Externals/minizip/minizip.vcxproj +++ b/Externals/minizip/minizip.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {23114507-079A-4418-9707-CFA81A03CA99} diff --git a/Externals/picojson/picojson.vcxproj b/Externals/picojson/picojson.vcxproj index ae446bd54a03..288f97432ab1 100644 --- a/Externals/picojson/picojson.vcxproj +++ b/Externals/picojson/picojson.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {2C0D058E-DE35-4471-AD99-E68A2CAF9E18} diff --git a/Externals/pugixml/pugixml.vcxproj b/Externals/pugixml/pugixml.vcxproj index ee37612163f5..69442231f068 100644 --- a/Externals/pugixml/pugixml.vcxproj +++ b/Externals/pugixml/pugixml.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {38FEE76F-F347-484B-949C-B4649381CFFB} diff --git a/Externals/soundtouch/SoundTouch.vcxproj b/Externals/soundtouch/SoundTouch.vcxproj index cd4da6e480e1..a4b721b49e9b 100644 --- a/Externals/soundtouch/SoundTouch.vcxproj +++ b/Externals/soundtouch/SoundTouch.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {EC082900-B4D8-42E9-9663-77F02F6936AE} diff --git a/Externals/spirv_cross/spirv_cross.vcxproj b/Externals/spirv_cross/spirv_cross.vcxproj index de93abda1b95..027a7c99a9ff 100644 --- a/Externals/spirv_cross/spirv_cross.vcxproj +++ b/Externals/spirv_cross/spirv_cross.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {3d780617-ec8c-4721-b9fd-dfc9bb658c7c} diff --git a/Externals/xxhash/xxhash.vcxproj b/Externals/xxhash/xxhash.vcxproj index 80c7bb56544c..1ffbf2bbd87b 100644 --- a/Externals/xxhash/xxhash.vcxproj +++ b/Externals/xxhash/xxhash.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {677EA016-1182-440C-9345-DC88D1E98C0C} diff --git a/Externals/zlib-ng/zlib-ng.vcxproj b/Externals/zlib-ng/zlib-ng.vcxproj index 1366e1da77b9..1f27c2c047d9 100644 --- a/Externals/zlib-ng/zlib-ng.vcxproj +++ b/Externals/zlib-ng/zlib-ng.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {F6EA7144-8D64-4EBB-A13E-76DFBD911EAE} diff --git a/Externals/zstd/zstd.vcxproj b/Externals/zstd/zstd.vcxproj index 8ea103a3c256..57c1b489221f 100644 --- a/Externals/zstd/zstd.vcxproj +++ b/Externals/zstd/zstd.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {1BEA10F3-80CE-4BC4-9331-5769372CDF99} diff --git a/Languages/Languages.vcxproj b/Languages/Languages.vcxproj index 925884ea0435..e3dea1abec68 100644 --- a/Languages/Languages.vcxproj +++ b/Languages/Languages.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5} @@ -25,7 +59,7 @@ - + diff --git a/Source/Core/Common/SCMRevGen.vcxproj b/Source/Core/Common/SCMRevGen.vcxproj index eea1446caa52..fccb6de4d928 100644 --- a/Source/Core/Common/SCMRevGen.vcxproj +++ b/Source/Core/Common/SCMRevGen.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {41279555-F94F-4EBC-99DE-AF863C10C5C4} diff --git a/Source/Core/Common/WindowSystemInfo.h b/Source/Core/Common/WindowSystemInfo.h index 8936ad1a02e7..d9c5fe88a627 100644 --- a/Source/Core/Common/WindowSystemInfo.h +++ b/Source/Core/Common/WindowSystemInfo.h @@ -13,6 +13,7 @@ enum class WindowSystemType Wayland, FBDev, Haiku, + UWP }; struct WindowSystemInfo @@ -43,4 +44,8 @@ struct WindowSystemInfo // Scale of the render surface. For hidpi systems, this will be >1. float render_surface_scale = 1.0f; + + // Renderer size for Core Windows + uint32_t render_width = 0; + uint32_t render_height = 0; }; diff --git a/Source/Core/Core/HW/GCPadEmu.cpp b/Source/Core/Core/HW/GCPadEmu.cpp index 470d2b8c2f8c..e1be153dd755 100644 --- a/Source/Core/Core/HW/GCPadEmu.cpp +++ b/Source/Core/Core/HW/GCPadEmu.cpp @@ -171,19 +171,43 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) EmulatedController::LoadDefaults(ciface); // Buttons - m_buttons->SetControlExpression(0, "`X`"); // A - m_buttons->SetControlExpression(1, "`Z`"); // B - m_buttons->SetControlExpression(2, "`C`"); // X - m_buttons->SetControlExpression(3, "`S`"); // Y - m_buttons->SetControlExpression(4, "`D`"); // Z +#if _UWP + // If we're running on UWP, we're likely on an Xbox. These defaults work for Xbox One & Series. + m_buttons->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Button A`"); // A + m_buttons->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Button B`"); // B + m_buttons->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Button X`"); // X + m_buttons->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Button Y`"); // Y + m_buttons->SetControlExpression(4, "`WGInput/0/Xbox One Game Controller:Bumper R`"); // Z + m_buttons->SetControlExpression(5, "`WGInput/0/Xbox One Game Controller:Menu`"); // Start +#else + m_buttons->SetControlExpression(0, "`Button A`"); // A + m_buttons->SetControlExpression(1, "`Button B`"); // B + m_buttons->SetControlExpression(2, "`Button X`"); // X + m_buttons->SetControlExpression(3, "`Button Y`"); // Y + m_buttons->SetControlExpression(4, "`Bumper R`"); // Z + #ifdef _WIN32 - m_buttons->SetControlExpression(5, "`RETURN`"); // Start + m_buttons->SetControlExpression(5, "`RETURN`"); // Start #else // OS X/Linux // Start m_buttons->SetControlExpression(5, "`Return`"); #endif +#endif +#if _UWP + // D-Pad + m_dpad->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Pad N`"); // Up + m_dpad->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Pad S`"); // Down + m_dpad->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Pad W`"); // Left + m_dpad->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Pad E`"); // Right + + // C Stick + m_c_stick->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Right Y+`"); // Up + m_c_stick->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Right Y-`"); // Down + m_c_stick->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Right X-`"); // Left + m_c_stick->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Right X+`"); // Right +#else // D-Pad m_dpad->SetControlExpression(0, "`T`"); // Up m_dpad->SetControlExpression(1, "`G`"); // Down @@ -197,9 +221,15 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) m_c_stick->SetControlExpression(3, "`L`"); // Right // Modifier m_c_stick->SetControlExpression(4, "`Ctrl`"); +#endif // Control Stick -#ifdef _WIN32 +#if _UWP + m_main_stick->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Left Y+`"); // Up + m_main_stick->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Left Y-`"); // Down + m_main_stick->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Left X-`"); // Left + m_main_stick->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Left X+`"); // Right +#elif _WIN32 m_main_stick->SetControlExpression(0, "`UP`"); // Up m_main_stick->SetControlExpression(1, "`DOWN`"); // Down m_main_stick->SetControlExpression(2, "`LEFT`"); // Left @@ -215,6 +245,7 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) m_main_stick->SetControlExpression(2, "`Left`"); // Left m_main_stick->SetControlExpression(3, "`Right`"); // Right #endif + // Modifier m_main_stick->SetControlExpression(4, "`Shift`"); @@ -222,9 +253,21 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) m_c_stick->SetCalibrationFromGate(ControllerEmu::SquareStickGate(1.0)); m_main_stick->SetCalibrationFromGate(ControllerEmu::SquareStickGate(1.0)); +#if _UWP // Triggers - m_triggers->SetControlExpression(0, "`Q`"); // L - m_triggers->SetControlExpression(1, "`W`"); // R + m_triggers->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Trigger L`"); // L + m_triggers->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Trigger R`"); // R + m_triggers->SetControlExpression(3, + "`WGInput/0/Xbox One Game Controller:Trigger L`"); // Analog L + m_triggers->SetControlExpression(4, + "`WGInput/0/Xbox One Game Controller:Trigger R`"); // Analog R + + // Rumble + m_rumble->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Rumble 0`"); +#else + m_triggers->SetControlExpression(0, "`Q`"); // L + m_triggers->SetControlExpression(1, "`W`"); // R +#endif } bool GCPad::GetMicButton() const diff --git a/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp b/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp index dbad8fbead11..04af4a0b4101 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Extension/Nunchuk.cpp @@ -198,17 +198,27 @@ void Nunchuk::DoState(PointerWrap& p) void Nunchuk::LoadDefaults(const ControllerInterface& ciface) { +#if _UWP // Stick - m_stick->SetControlExpression(0, "W"); // up - m_stick->SetControlExpression(1, "S"); // down - m_stick->SetControlExpression(2, "A"); // left - m_stick->SetControlExpression(3, "D"); // right + m_stick->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Left Y+`"); // up + m_stick->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Left Y-`"); // down + m_stick->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Left X-`"); // left + m_stick->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Left X+`"); // right +#else + m_stick->SetControlExpression(0, "W"); // up + m_stick->SetControlExpression(1, "S"); // down + m_stick->SetControlExpression(2, "A"); // left + m_stick->SetControlExpression(3, "D"); // right +#endif // Because our defaults use keyboard input, set calibration shape to a square. m_stick->SetCalibrationFromGate(ControllerEmu::SquareStickGate(1.0)); // Buttons -#ifdef _WIN32 +#if _UWP + m_buttons->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Trigger L`"); // C + m_buttons->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Trigger R`"); // Z +#elif _WIN32 m_buttons->SetControlExpression(0, "LCONTROL"); // C m_buttons->SetControlExpression(1, "LSHIFT"); // Z #elif __APPLE__ diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp index 5bc19f48e89a..daccaaa48bca 100644 --- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp @@ -666,18 +666,32 @@ void Wiimote::LoadDefaults(const ControllerInterface& ciface) m_buttons->SetControlExpression(0, "`Left Click`"); // B m_buttons->SetControlExpression(1, "`Right Click`"); +#elif _UWP + // If we're running on UWP, we're likely on an Xbox. These defaults work for Xbox One & Series. + m_buttons->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Button A`"); // A + m_buttons->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Button B`"); // B #else // A m_buttons->SetControlExpression(0, "`Click 0`"); // B m_buttons->SetControlExpression(1, "`Click 1`"); #endif - m_buttons->SetControlExpression(2, "`1`"); // 1 - m_buttons->SetControlExpression(3, "`2`"); // 2 - m_buttons->SetControlExpression(4, "Q"); // - - m_buttons->SetControlExpression(5, "E"); // + -#ifdef _WIN32 +#if _UWP + m_buttons->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Button X`"); + m_buttons->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Button Y`"); + m_buttons->SetControlExpression(4, "WGInput/0/Xbox One Game Controller:View"); + m_buttons->SetControlExpression(5, "WGInput/0/Xbox One Game Controller:Menu"); +#else + m_buttons->SetControlExpression(2, "`1`"); // 1 + m_buttons->SetControlExpression(3, "`2`"); // 2 + m_buttons->SetControlExpression(4, "Q"); // - + m_buttons->SetControlExpression(5, "E"); // + +#endif + +#if _UWP + m_buttons->SetControlExpression(6, "WGInput/0/Xbox One Game Controller:Menu & View"); // Home +#elif _WIN32 m_buttons->SetControlExpression(6, "RETURN"); // Home #else // Home @@ -692,25 +706,37 @@ void Wiimote::LoadDefaults(const ControllerInterface& ciface) m_shake->SetControlExpression(i, "`Click 2`"); #endif +#if _UWP // Pointing (IR) + m_ir->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Right Y+`"); + m_ir->SetControlExpression(1, "`WGInput/0/Xbox One Game Controller:Right Y-`"); + m_ir->SetControlExpression(2, "`WGInput/0/Xbox One Game Controller:Right X-`"); + m_ir->SetControlExpression(3, "`WGInput/0/Xbox One Game Controller:Right X+`"); +#else m_ir->SetControlExpression(0, "`Cursor Y-`"); m_ir->SetControlExpression(1, "`Cursor Y+`"); m_ir->SetControlExpression(2, "`Cursor X-`"); m_ir->SetControlExpression(3, "`Cursor X+`"); +#endif // DPad -#ifdef _WIN32 +#if _UWP + m_dpad->SetControlExpression(0, "WGInput/0/Xbox One Game Controller:Pad N"); // Up + m_dpad->SetControlExpression(1, "WGInput/0/Xbox One Game Controller:Pad S"); // Down + m_dpad->SetControlExpression(2, "WGInput/0/Xbox One Game Controller:Pad W"); // Left + m_dpad->SetControlExpression(3, "WGInput/0/Xbox One Game Controller:Pad E"); // Right +#elif _WIN32 m_dpad->SetControlExpression(0, "UP"); // Up m_dpad->SetControlExpression(1, "DOWN"); // Down m_dpad->SetControlExpression(2, "LEFT"); // Left m_dpad->SetControlExpression(3, "RIGHT"); // Right #elif __APPLE__ - m_dpad->SetControlExpression(0, "`Up Arrow`"); // Up + m_dpad->SetControlExpression(0, "`Up Arrow`"); // Up m_dpad->SetControlExpression(1, "`Down Arrow`"); // Down m_dpad->SetControlExpression(2, "`Left Arrow`"); // Left m_dpad->SetControlExpression(3, "`Right Arrow`"); // Right #else - m_dpad->SetControlExpression(0, "Up"); // Up + m_dpad->SetControlExpression(0, "Up"); // Up m_dpad->SetControlExpression(1, "Down"); // Down m_dpad->SetControlExpression(2, "Left"); // Left m_dpad->SetControlExpression(3, "Right"); // Right @@ -730,6 +756,10 @@ void Wiimote::LoadDefaults(const ControllerInterface& ciface) m_imu_gyroscope->SetControlExpression(4, "`Gyro Yaw Left`"); m_imu_gyroscope->SetControlExpression(5, "`Gyro Yaw Right`"); +#if _UWP + m_rumble->SetControlExpression(0, "`WGInput/0/Xbox One Game Controller:Rumble 0`"); +#endif + // Enable Nunchuk: constexpr ExtensionNumber DEFAULT_EXT = ExtensionNumber::NUNCHUK; m_attachments->SetSelectedAttachment(DEFAULT_EXT); diff --git a/Source/Core/Core/LibusbUtils.cpp b/Source/Core/Core/LibusbUtils.cpp index 1b1852dddd11..538778e83f64 100644 --- a/Source/Core/Core/LibusbUtils.cpp +++ b/Source/Core/Core/LibusbUtils.cpp @@ -22,6 +22,7 @@ class Context::Impl public: Impl() { +#if !_UWP const int ret = libusb_init(&m_context); ASSERT_MSG(IOS_USB, ret == LIBUSB_SUCCESS, "Failed to init libusb: {}", ErrorWrap(ret)); if (ret != LIBUSB_SUCCESS) @@ -34,6 +35,7 @@ class Context::Impl #endif m_event_thread_running.Set(); m_event_thread = std::thread(&Impl::EventThread, this); +#endif } ~Impl() @@ -105,6 +107,7 @@ Context::operator libusb_context*() const return m_impl->GetContext(); } +// Throws an exception and interrupts the other shutdown sequences on UWP bool Context::IsValid() const { return m_impl->GetContext() != nullptr; diff --git a/Source/Core/DolphinLib.vcxproj b/Source/Core/DolphinLib.vcxproj index 1aad7a65c3c4..187985f797bc 100644 --- a/Source/Core/DolphinLib.vcxproj +++ b/Source/Core/DolphinLib.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {d79392f7-06d6-4b4b-a39f-4d587c215d3a} @@ -20,6 +54,9 @@ + + + @@ -67,20 +104,16 @@ - + - - - + - + ]]> @@ -88,10 +121,6 @@ - + \ No newline at end of file diff --git a/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj b/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj index b7569a88c519..8843acfb950a 100644 --- a/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj +++ b/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {974E563D-23F8-4E8F-9083-F62876B04E08} @@ -63,4 +97,4 @@ - + \ No newline at end of file diff --git a/Source/Core/DolphinQt/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj index 3c37f4ca1e8a..3103bf2ec46d 100644 --- a/Source/Core/DolphinQt/DolphinQt.vcxproj +++ b/Source/Core/DolphinQt/DolphinQt.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {FA3FA62B-6F58-4B86-9453-4D149940A066} Dolphin @@ -31,10 +65,8 @@ $(ProjectDir)Settings;%(AdditionalIncludeDirectories) $(ProjectDir)TAS;%(AdditionalIncludeDirectories) $(ProjectDir)VideoInterface;%(AdditionalIncludeDirectories) - _SILENCE_CXX23_ALIGNED_STORAGE_DEPRECATION_WARNING;%(PreprocessorDefinitions) - $(SourceDir)PCH;%(AdditionalIncludeDirectories) Use diff --git a/Source/Core/DolphinTool/DolphinTool.vcxproj b/Source/Core/DolphinTool/DolphinTool.vcxproj index 2ea89a0fce94..293a1c99b333 100644 --- a/Source/Core/DolphinTool/DolphinTool.vcxproj +++ b/Source/Core/DolphinTool/DolphinTool.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {8F91523C-5C5E-4B22-A1F1-67560B6DC714} @@ -66,4 +100,4 @@ - + \ No newline at end of file diff --git a/Source/Core/DolphinUWP/App.cpp b/Source/Core/DolphinUWP/App.cpp new file mode 100644 index 000000000000..de7de0cbb78a --- /dev/null +++ b/Source/Core/DolphinUWP/App.cpp @@ -0,0 +1,330 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#define SDL_MAIN_HANDLED + +using namespace winrt; + +using namespace Windows; +using namespace Windows::Storage; +using namespace Windows::ApplicationModel::Core; +using namespace Windows::Foundation::Numerics; +using namespace Windows::UI::Composition; +using namespace winrt::Windows::Storage; +using namespace winrt::Windows::Storage::Pickers; +using namespace Windows::Graphics::Display::Core; + +using winrt::Windows::UI::Core::BackRequestedEventArgs; +using winrt::Windows::UI::Core::CoreProcessEventsOption; +using winrt::Windows::UI::Core::CoreWindow; + +Common::Flag m_running{true}; +Common::Flag m_shutdown_requested{false}; +Common::Flag m_tried_graceful_shutdown{false}; +winrt::hstring m_launchOnExit; + +struct App : implements +{ + IFrameworkView CreateView() { return *this; } + + void Initialize(CoreApplicationView const& v) + { + v.Activated({this, &App::OnActivate}); + CoreApplication::EnteredBackground({this, &App::EnteredBackground}); + CoreApplication::Suspending({this, &App::Suspending}); + } + + void Load(hstring const&) {} + + void Uninitialize() {} + + void Run() + { + while (m_running.IsSet()) + { + if (m_shutdown_requested.TestAndClear()) + { + const auto ios = IOS::HLE::GetIOS(); + const auto stm = ios ? ios->GetDeviceByName("/dev/stm/eventhook") : nullptr; + if (!m_tried_graceful_shutdown.IsSet() && stm && + std::static_pointer_cast(stm)->HasHookInstalled()) + { + ProcessorInterface::PowerButton_Tap(); + m_tried_graceful_shutdown.Set(); + } + else + { + m_running.Clear(); + } + } + + ::Core::HostDispatchJobs(); + CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents( + CoreProcessEventsOption::ProcessAllIfPresent); + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + } + + winrt::fire_and_forget InitializeDolphinFromFile(std::string path) + { + if (path.empty()) + { + FileOpenPicker openPicker; + openPicker.ViewMode(PickerViewMode::List); + openPicker.SuggestedStartLocation(PickerLocationId::ComputerFolder); + openPicker.FileTypeFilter().Append(L".iso"); + openPicker.FileTypeFilter().Append(L".ciso"); + openPicker.FileTypeFilter().Append(L".rvz"); + openPicker.FileTypeFilter().Append(L".wbfs"); + openPicker.FileTypeFilter().Append(L".gcm"); + openPicker.FileTypeFilter().Append(L".gcz"); + + auto file = co_await openPicker.PickSingleFileAsync(); + if (file) + { + path = winrt::to_string(file.Path().data()); + } + } + + CoreWindow window = CoreWindow::GetForCurrentThread(); + void* abi = winrt::get_abi(window); + + WindowSystemInfo wsi; + wsi.type = WindowSystemType::UWP; + wsi.render_window = abi; + wsi.render_surface = abi; + wsi.render_width = window.Bounds().Width; + wsi.render_height = window.Bounds().Height; + + auto navigation = winrt::Windows::UI::Core::SystemNavigationManager::GetForCurrentView(); + + // UWP on Xbox One triggers a back request whenever the B button is pressed + // which can result in the app being suspended if unhandled + navigation.BackRequested([](const winrt::Windows::Foundation::IInspectable&, + const BackRequestedEventArgs& args) { args.Handled(true); }); + + GAMING_DEVICE_MODEL_INFORMATION info = {}; + GetGamingDeviceModelInformation(&info); + if (info.vendorId == GAMING_DEVICE_VENDOR_ID_MICROSOFT) + { + HdmiDisplayInformation hdi = HdmiDisplayInformation::GetForCurrentView(); + if (hdi) + { + wsi.render_width = hdi.GetCurrentDisplayMode().ResolutionWidthInRawPixels(); + wsi.render_height = hdi.GetCurrentDisplayMode().ResolutionHeightInRawPixels(); + } + } + + std::unique_ptr boot = BootParameters::GenerateFromFile(path); + + UICommon::SetUserDirectory(winrt::to_string(ApplicationData::Current().LocalFolder().Path())); + UICommon::CreateDirectories(); + UICommon::Init(); + UICommon::InitControllers(wsi); + + if (!BootManager::BootCore(std::move(boot), wsi)) + { + fprintf(stderr, "Could not boot the specified file\n"); + } + } + + void SetWindow(CoreWindow const& w) { w.Closed({this, &App::OnClosed}); } + + void OnClosed(const IInspectable&, const winrt::Windows::UI::Core::CoreWindowEventArgs& args) + { + m_shutdown_requested.Set(); + } + + void OnActivate(const winrt::Windows::ApplicationModel::Core::CoreApplicationView&, + const winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs& args) + { + std::stringstream filePath; + + if (args.Kind() == Windows::ApplicationModel::Activation::ActivationKind::Protocol) + { + auto protocolActivatedEventArgs{ + args.as()}; + auto query = protocolActivatedEventArgs.Uri().QueryParsed(); + + for (uint32_t i = 0; i < query.Size(); i++) + { + auto arg = query.GetAt(i); + + // parse command line string + if (arg.Name() == winrt::hstring(L"cmd")) + { + std::string argVal = winrt::to_string(arg.Value()); + + // Strip the executable from the cmd argument + if (argVal.starts_with("dolphin.exe")) + { + argVal = argVal.substr(11, argVal.length()); + } + + std::istringstream iss(argVal); + std::string s; + + // Maintain slashes while reading the quotes + while (iss >> std::quoted(s, '"', (char)0)) + { + filePath << s; + } + } + else if (arg.Name() == winrt::hstring(L"launchOnExit")) + { + // For if we want to return to a frontend + m_launchOnExit = arg.Value(); + } + } + } + + // Defaults to file picker if no path is present. + InitializeDolphinFromFile(filePath.str()); + + CoreWindow window = CoreWindow::GetForCurrentThread(); + window.Activate(); + } + + void EnteredBackground(const IInspectable&, + const winrt::Windows::ApplicationModel::EnteredBackgroundEventArgs& args) + { + } + + void Suspending(const IInspectable&, + const winrt::Windows::ApplicationModel::SuspendingEventArgs& args) + { + m_shutdown_requested.Set(); + + // The Series S/X quits fast, so let's immediately shutdown to ensure all the caches save. + Core::Stop(); + Core::Shutdown(); + UICommon::Shutdown(); + + if (!m_launchOnExit.empty()) + { + winrt::Windows::Foundation::Uri m_uri{m_launchOnExit}; + auto asyncOperation = winrt::Windows::System::Launcher::LaunchUriAsync(m_uri); + asyncOperation.Completed([](winrt::Windows::Foundation::IAsyncOperation const& sender, + winrt::Windows::Foundation::AsyncStatus const asyncStatus) { + CoreApplication::Exit(); + }); + } + } +}; + +int WINAPIV WinMain() +{ + winrt::init_apartment(); + + CoreApplication::Run(make()); + + winrt::uninit_apartment(); + + return 0; +} + +std::vector Host_GetPreferredLocales() +{ + return {}; +} + +void Host_NotifyMapLoaded() +{ +} + +void Host_RefreshDSPDebuggerWindow() +{ +} + +bool Host_UIBlocksControllerState() +{ + return false; +} + +void Host_Message(HostMessageID id) +{ +} + +void Host_UpdateTitle(const std::string& title) +{ +} + +void Host_UpdateDisasmDialog() +{ +} + +void Host_UpdateMainFrame() +{ +} + +void Host_RequestRenderWindowSize(int width, int height) +{ +} + +bool Host_RendererHasFocus() +{ + return true; +} + +bool Host_RendererHasFullFocus() +{ + // Mouse capturing isn't implemented + return Host_RendererHasFocus(); +} + +bool Host_RendererIsFullscreen() +{ + return true; +} + +void Host_YieldToUI() +{ +} + +void Host_TitleChanged() +{ +} + +void Host_UpdateDiscordClientID(const std::string& client_id) +{ +} + +bool Host_UpdateDiscordPresenceRaw(const std::string& details, const std::string& state, + const std::string& large_image_key, + const std::string& large_image_text, + const std::string& small_image_key, + const std::string& small_image_text, + const int64_t start_timestamp, const int64_t end_timestamp, + const int party_size, const int party_max) +{ + return false; +} + +std::unique_ptr Host_CreateGBAHost(std::weak_ptr core) +{ + return nullptr; +} diff --git a/Source/Core/DolphinUWP/App.h b/Source/Core/DolphinUWP/App.h new file mode 100644 index 000000000000..a780352d89f7 --- /dev/null +++ b/Source/Core/DolphinUWP/App.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class App + : public winrt::implements +{ +public: + winrt::Windows::ApplicationModel::Core::IFrameworkView CreateView(); + void Initialize(const winrt::Windows::ApplicationModel::Core::CoreApplicationView&); + void Load(const winrt::hstring&); + void Uninitialize(); + void Run(); + void SetWindow(const winrt::Windows::UI::Core::CoreWindow& window); + void UpdateRunningFlag(); + void OnActivated(CoreApplicationView const& /*applicationView*/, + winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const& /*args*/); + +private: + Common::Flag m_running{true}; + Common::Flag m_shutdown_requested{false}; + Common::Flag m_tried_graceful_shutdown{false}; + winrt::Windows::UI::Core::CoreDispatcher m_dispatcher{nullptr}; +}; diff --git a/Source/Core/DolphinUWP/Assets/LockScreenLogo.scale-200.png b/Source/Core/DolphinUWP/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 000000000000..eef3e094d41d Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/LockScreenLogo.scale-200.png differ diff --git a/Source/Core/DolphinUWP/Assets/SplashScreen.scale-200.png b/Source/Core/DolphinUWP/Assets/SplashScreen.scale-200.png new file mode 100644 index 000000000000..2646ffa91756 Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/SplashScreen.scale-200.png differ diff --git a/Source/Core/DolphinUWP/Assets/Square150x150Logo.scale-200.png b/Source/Core/DolphinUWP/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 000000000000..98c94ce550c6 Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/Square150x150Logo.scale-200.png differ diff --git a/Source/Core/DolphinUWP/Assets/Square44x44Logo.scale-200.png b/Source/Core/DolphinUWP/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 000000000000..be542f706459 Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/Square44x44Logo.scale-200.png differ diff --git a/Source/Core/DolphinUWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/Source/Core/DolphinUWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 000000000000..6c9c746475ab Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/Source/Core/DolphinUWP/Assets/StoreLogo.png b/Source/Core/DolphinUWP/Assets/StoreLogo.png new file mode 100644 index 000000000000..9c01f551c173 Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/StoreLogo.png differ diff --git a/Source/Core/DolphinUWP/Assets/Wide310x150Logo.scale-200.png b/Source/Core/DolphinUWP/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 000000000000..d72053b3b8c0 Binary files /dev/null and b/Source/Core/DolphinUWP/Assets/Wide310x150Logo.scale-200.png differ diff --git a/Source/Core/DolphinUWP/DolphinUWP.vcxproj b/Source/Core/DolphinUWP/DolphinUWP.vcxproj new file mode 100644 index 000000000000..dd446a613311 --- /dev/null +++ b/Source/Core/DolphinUWP/DolphinUWP.vcxproj @@ -0,0 +1,347 @@ + + + + + true + true + true + {de8732bc-4ca5-4d39-b5d3-03d318ba9c02} + DolphinUWP + DolphinUWP + en-US + 15.0 + true + Windows Store + 10.0 + 10.0.22000.0 + 10.0.17134.0 + true + + + + + Debug UWP + ARM64 + + + Debug UWP + Win32 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + Win32 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + Application + v143 + v142 + v141 + v140 + Unicode + + + true + true + + + true + true + + + false + true + false + + + false + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + True + C9F9E628DB2F5338D9F5D62D65BBD452442B5079 + SHA256 + False + True + Always + x64 + 0 + + + Dolphin$(TargetSuffix) + + + Dolphin$(TargetSuffix) + + + + NotUsing + pch.h + $(IntDir)pch.pch + Level2 + %(AdditionalOptions) /bigobj + WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;%(PreprocessorDefinitions) + + + false + + + + + _DEBUG;%(PreprocessorDefinitions) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + + + + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + + + + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + + + + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2-UWP/bin/SDL2-UWP.lib;OpenAL/bin/openal32.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + + + + + + _DEBUG;%(PreprocessorDefinitions) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + + + + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + + + + + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + + + + + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2-UWP/bin/SDL2-UWP.lib;OpenAL/bin/openal32.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + + + + + + + NDEBUG;_UWP;%(PreprocessorDefinitions) + stdcpp20 + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + + + true + true + + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2-UWP/bin/SDL2-UWP.lib;%(AdditionalDependencies) + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + comsuppw.lib;comsuppwd.lib + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + comsuppw.lib;comsuppwd.lib + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + + + NDEBUG;_UWP;%(PreprocessorDefinitions) + stdcpp20 + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + $(ExternalsDir)fmt\include;$(ExternalsDir)SDL;%(AdditionalIncludeDirectories) + + + true + true + + + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2-UWP/bin/SDL2-UWP.lib;%(AdditionalDependencies) + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + comsuppw.lib;comsuppwd.lib + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + DolphinLib/bin/DolphinLib.lib;Bochs_disasm/bin/Bochs_disasm.lib;bzip2/bin/bzip2.lib;cubeb/bin/cubeb.lib;curl/bin/curl.lib;discord-rpc/bin/discord-rpc.lib;ed25519/bin/ed25519.lib;enet/bin/enet.lib;FatFs/bin/FatFs.lib;fmt/bin/fmt.lib;FreeSurround/bin/FreeSurround.lib;glslang/bin/glslang.lib;imgui/bin/imgui.lib;liblzma/bin/liblzma.lib;libusb-1.0/bin/libusb-1.0.lib;LZO/bin/LZO.lib;mbedtls/bin/mbedtls.lib;mGBA/bin/mGBA.lib;miniupnpc/bin/miniupnpc.lib;minizip/bin/minizip.lib;picojson/bin/picojson.lib;pugixml/bin/pugixml.lib;SoundTouch/bin/SoundTouch.lib;spirv_cross/bin/spirv_cross.lib;xxhash/bin/xxhash.lib;zlib-ng/bin/zlib-ng.lib;zstd/bin/zstd.lib;spng/bin/spng.lib;SFML_Network/bin/SFML_Network.lib;SDL2/bin/SDL2.lib;%(AdditionalDependencies) + comsuppw.lib;comsuppwd.lib + comsuppw.lib;comsuppwd.lib + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + $(BuildRootDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + {89e9b32e-a86a-47c3-a948-d2b1622925ce} + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinUWP/DolphinUWP.vcxproj.filters b/Source/Core/DolphinUWP/DolphinUWP.vcxproj.filters new file mode 100644 index 000000000000..28244884cb7b --- /dev/null +++ b/Source/Core/DolphinUWP/DolphinUWP.vcxproj.filters @@ -0,0 +1,45 @@ + + + + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + + + + + + {db9086fe-bacc-4437-8272-1aa6642082db} + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinUWP/Package.appxmanifest b/Source/Core/DolphinUWP/Package.appxmanifest new file mode 100644 index 000000000000..e2807967eef8 --- /dev/null +++ b/Source/Core/DolphinUWP/Package.appxmanifest @@ -0,0 +1,68 @@ + + + + + + Dolphin Emulator + SirMangler + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + .iso + .ciso + .wbfs + .rvz + .gcz + .gcm + + + + + + + .iso + .ciso + .rvz + .wbfs + .gcm + .gcz + + Dolphin Emulator + + + + + Dolphin Emulator + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinUWP/PropertySheet.props b/Source/Core/DolphinUWP/PropertySheet.props new file mode 100644 index 000000000000..e34141b019cc --- /dev/null +++ b/Source/Core/DolphinUWP/PropertySheet.props @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinUWP/packages.config b/Source/Core/DolphinUWP/packages.config new file mode 100644 index 000000000000..c3135569dc87 Binary files /dev/null and b/Source/Core/DolphinUWP/packages.config differ diff --git a/Source/Core/DolphinUWP/pch.h b/Source/Core/DolphinUWP/pch.h new file mode 100644 index 000000000000..1a5ff3e7a254 --- /dev/null +++ b/Source/Core/DolphinUWP/pch.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp index 327002c3a301..1f7f95b3abe1 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp @@ -199,7 +199,11 @@ InputBackend::InputBackend(ControllerInterface* controller_interface) { Common::ScopeGuard init_guard([this] { m_init_event.Set(); }); +#if _UWP + if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) != 0) +#else if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER) != 0) +#endif { ERROR_LOG_FMT(CONTROLLERINTERFACE, "SDL failed to initialize"); return; @@ -227,7 +231,7 @@ InputBackend::InputBackend(ControllerInterface* controller_interface) } } -#ifdef _WIN32 +#if defined(_WIN32) && !_UWP // This is a hack to workaround SDL_hidapi using window messages to detect device // removal/arrival, yet no part of SDL pumps messages for it. It can hopefully be removed in the // future when SDL fixes the issue. Note this is a separate issue from SDL_HINT_JOYSTICK_THREAD. @@ -244,7 +248,7 @@ InputBackend::InputBackend(ControllerInterface* controller_interface) if (!HandleEventAndContinue(e)) return; -#ifdef _WIN32 +#if defined(_WIN32) && !_UWP MSG msg; while (window_handle && PeekMessage(&msg, window_handle, 0, 0, PM_NOREMOVE)) { diff --git a/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp b/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp index 21e984796468..cb106cbe7fe9 100644 --- a/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp +++ b/Source/Core/InputCommon/ControllerInterface/Win32/Win32.cpp @@ -14,7 +14,11 @@ #include "Common/Flag.h" #include "Common/Logging/Log.h" + +#if !_UWP #include "InputCommon/ControllerInterface/DInput/DInput.h" +#endif + #include "InputCommon/ControllerInterface/WGInput/WGInput.h" #include "InputCommon/ControllerInterface/XInput/XInput.h" @@ -44,7 +48,9 @@ _Pre_satisfies_(EventDataSize >= sizeof(CM_NOTIFY_EVENT_DATA)) static DWORD CALL // TODO: we could easily use the message passed alongside this event, which tells // whether a device was added or removed, to avoid removing old, still connected, devices g_controller_interface.PlatformPopulateDevices([] { +#if !_UWP ciface::DInput::PopulateDevices(s_hwnd); +#endif ciface::XInput::PopulateDevices(); }); } @@ -75,7 +81,9 @@ void ciface::Win32::PopulateDevices(void* hwnd) s_hwnd = static_cast(hwnd); std::lock_guard lk_population(s_populate_mutex); s_first_populate_devices_asked.Set(); +#if !_UWP ciface::DInput::PopulateDevices(s_hwnd); +#endif ciface::XInput::PopulateDevices(); ciface::WGInput::PopulateDevices(); } @@ -84,13 +92,17 @@ void ciface::Win32::ChangeWindow(void* hwnd) { s_hwnd = static_cast(hwnd); std::lock_guard lk_population(s_populate_mutex); +#if !_UWP ciface::DInput::ChangeWindow(s_hwnd); +#endif } void ciface::Win32::DeInit() { s_first_populate_devices_asked.Clear(); +#if !_UWP DInput::DeInit(); +#endif s_hwnd = nullptr; if (s_notify_handle) diff --git a/Source/Core/InputCommon/GCAdapter.cpp b/Source/Core/InputCommon/GCAdapter.cpp index 1e91a08ebad3..ed4160d6c65d 100644 --- a/Source/Core/InputCommon/GCAdapter.cpp +++ b/Source/Core/InputCommon/GCAdapter.cpp @@ -659,7 +659,7 @@ void Shutdown() { StopScanThread(); #if GCADAPTER_USE_LIBUSB_IMPLEMENTATION -#if LIBUSB_API_HAS_HOTPLUG +#if !_UWP if (s_libusb_context->IsValid() && s_libusb_hotplug_enabled) libusb_hotplug_deregister_callback(*s_libusb_context, s_hotplug_handle); #endif diff --git a/Source/Core/VideoBackends/D3D12/DX12Pipeline.cpp b/Source/Core/VideoBackends/D3D12/DX12Pipeline.cpp index bca820a2c3b3..f43d47542fa4 100644 --- a/Source/Core/VideoBackends/D3D12/DX12Pipeline.cpp +++ b/Source/Core/VideoBackends/D3D12/DX12Pipeline.cpp @@ -224,6 +224,7 @@ std::unique_ptr DXPipeline::Create(const AbstractPipelineConfig& con AbstractPipeline::CacheData DXPipeline::GetCacheData() const { +#if !_UWP ComPtr blob; HRESULT hr = m_pipeline->GetCachedBlob(&blob); if (FAILED(hr)) @@ -235,5 +236,9 @@ AbstractPipeline::CacheData DXPipeline::GetCacheData() const CacheData data(blob->GetBufferSize()); std::memcpy(data.data(), blob->GetBufferPointer(), blob->GetBufferSize()); return data; +#else + // Xbox's graphics driver under UWP does not support this feature. + return {}; +#endif } } // namespace DX12 diff --git a/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp b/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp index a6abc9159f5f..f8062e0b2955 100644 --- a/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp +++ b/Source/Core/VideoBackends/D3DCommon/SwapChain.cpp @@ -60,7 +60,12 @@ u32 SwapChain::GetSwapChainFlags() const bool SwapChain::CreateSwapChain(bool stereo) { RECT client_rc; - if (GetClientRect(static_cast(m_wsi.render_surface), &client_rc)) + if (m_wsi.type == WindowSystemType::UWP) + { + m_width = m_wsi.render_width; + m_height = m_wsi.render_height; + } + else if (GetClientRect(static_cast(m_wsi.render_surface), &client_rc)) { m_width = client_rc.right - client_rc.left; m_height = client_rc.bottom - client_rc.top; @@ -87,9 +92,19 @@ bool SwapChain::CreateSwapChain(bool stereo) swap_chain_desc.Flags = GetSwapChainFlags(); Microsoft::WRL::ComPtr swap_chain1; - hr = dxgi_factory2->CreateSwapChainForHwnd(m_d3d_device.Get(), - static_cast(m_wsi.render_surface), - &swap_chain_desc, nullptr, nullptr, &swap_chain1); + if (m_wsi.type == WindowSystemType::UWP) + { + hr = dxgi_factory2->CreateSwapChainForCoreWindow( + m_d3d_device.Get(), static_cast<::IUnknown*>(m_wsi.render_surface), &swap_chain_desc, + nullptr, &swap_chain1); + } + else + { + hr = dxgi_factory2->CreateSwapChainForHwnd(m_d3d_device.Get(), + static_cast(m_wsi.render_surface), + &swap_chain_desc, nullptr, nullptr, &swap_chain1); + } + if (FAILED(hr)) { // Flip-model discard swapchains aren't supported on Windows 8, so here we fall back to @@ -131,9 +146,13 @@ bool SwapChain::CreateSwapChain(bool stereo) return false; } - // We handle fullscreen ourselves. - hr = m_dxgi_factory->MakeWindowAssociation(static_cast(m_wsi.render_surface), - DXGI_MWA_NO_WINDOW_CHANGES | DXGI_MWA_NO_ALT_ENTER); + if (m_wsi.type != WindowSystemType::UWP) + { + // We handle fullscreen ourselves. + hr = m_dxgi_factory->MakeWindowAssociation(static_cast(m_wsi.render_surface), + DXGI_MWA_NO_WINDOW_CHANGES | DXGI_MWA_NO_ALT_ENTER); + } + if (FAILED(hr)) WARN_LOG_FMT(VIDEO, "MakeWindowAssociation() failed: {}", Common::HRWrap(hr)); diff --git a/Source/Core/VideoCommon/VideoBackendBase.cpp b/Source/Core/VideoCommon/VideoBackendBase.cpp index 2b4883d22bc8..9f76b1c642fb 100644 --- a/Source/Core/VideoCommon/VideoBackendBase.cpp +++ b/Source/Core/VideoCommon/VideoBackendBase.cpp @@ -28,11 +28,11 @@ #include "VideoBackends/D3D12/VideoBackend.h" #endif #include "VideoBackends/Null/VideoBackend.h" -#ifdef HAS_OPENGL +#if defined(HAS_OPENGL) && !_UWP #include "VideoBackends/OGL/VideoBackend.h" #include "VideoBackends/Software/VideoBackend.h" #endif -#ifdef HAS_VULKAN +#if defined(HAS_VULKAN) && !_UWP #include "VideoBackends/Vulkan/VideoBackend.h" #endif #ifdef __APPLE__ @@ -219,17 +219,23 @@ const std::vector>& VideoBackendBase::GetAvail // OGL > D3D11 > D3D12 > Vulkan > SW > Null // On macOS, we prefer Vulkan over OpenGL due to OpenGL support being deprecated by Apple. -#ifdef HAS_OPENGL - backends.push_back(std::make_unique()); -#endif #ifdef _WIN32 backends.push_back(std::make_unique()); +#if _UWP + // If on UWP, give D3D12 precedence as on the S/X, D3D11 is just a 'less supported' and wrapped + // version of D3D12. + backends.emplace(backends.begin(), std::make_unique()); +#else backends.push_back(std::make_unique()); #endif +#endif +#if HAS_OPENGL && !_UWP + backends.push_back(std::make_unique()); +#endif #ifdef __APPLE__ backends.push_back(std::make_unique()); #endif -#ifdef HAS_VULKAN +#if defined(HAS_VULKAN) && !_UWP #ifdef __APPLE__ // Emplace the Vulkan backend at the beginning so it takes precedence over OpenGL. backends.emplace(backends.begin(), std::make_unique()); @@ -237,7 +243,7 @@ const std::vector>& VideoBackendBase::GetAvail backends.push_back(std::make_unique()); #endif #endif -#ifdef HAS_OPENGL +#if defined(HAS_OPENGL) && !_UWP backends.push_back(std::make_unique()); #endif backends.push_back(std::make_unique()); diff --git a/Source/Core/WinUpdater/WinUpdater.vcxproj b/Source/Core/WinUpdater/WinUpdater.vcxproj index 28ae61bb34f3..89d31bde53d9 100644 --- a/Source/Core/WinUpdater/WinUpdater.vcxproj +++ b/Source/Core/WinUpdater/WinUpdater.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03} diff --git a/Source/DSPTool/DSPTool.vcxproj b/Source/DSPTool/DSPTool.vcxproj index 3cfb41b5fcbb..176f08174b54 100644 --- a/Source/DSPTool/DSPTool.vcxproj +++ b/Source/DSPTool/DSPTool.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {1970D175-3DE8-4738-942A-4D98D1CDBF64} diff --git a/Source/PCH/pch.vcxproj b/Source/PCH/pch.vcxproj index 1ee60c60c071..588a639486b7 100644 --- a/Source/PCH/pch.vcxproj +++ b/Source/PCH/pch.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {76563A7F-1011-4EAD-B667-7BB18D09568E} diff --git a/Source/UnitTests/UnitTests.vcxproj b/Source/UnitTests/UnitTests.vcxproj index 6cf886c6c6fe..fe3e9481ec9f 100644 --- a/Source/UnitTests/UnitTests.vcxproj +++ b/Source/UnitTests/UnitTests.vcxproj @@ -2,6 +2,40 @@ + + + Debug UWP + ARM64 + + + Debug UWP + x64 + + + Debug + ARM64 + + + Debug + x64 + + + Release UWP + ARM64 + + + Release UWP + x64 + + + Release + ARM64 + + + Release + x64 + + {474661E7-C73A-43A6-AFEE-EE1EC433D49E} diff --git a/Source/VSProps/Base.Dolphin.props b/Source/VSProps/Base.Dolphin.props index 0cbbab961793..65d681c3d2fa 100644 --- a/Source/VSProps/Base.Dolphin.props +++ b/Source/VSProps/Base.Dolphin.props @@ -45,6 +45,7 @@ AUTOUPDATE;%(PreprocessorDefinitions) HAVE_SDL2;%(PreprocessorDefinitions) STEAM;%(PreprocessorDefinitions) + _UWP=1;%(PreprocessorDefinitions)