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)