From 4d1a66b38e9a23f690e367e86cd1f3bba11f386f Mon Sep 17 00:00:00 2001 From: SirMangler Date: Wed, 21 Dec 2022 21:35:17 +0000 Subject: [PATCH] Add support for UWP and the Xbox platforms --- .gitignore | 11 + Source/Core/Common/WindowSystemInfo.h | 5 + Source/Core/Core/HW/GCPadEmu.cpp | 55 ++- .../Core/HW/WiimoteEmu/Extension/Nunchuk.cpp | 20 +- Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp | 34 +- Source/Core/Core/IOS/USB/Bluetooth/BTReal.cpp | 2 + Source/Core/Core/IOS/USB/LibusbDevice.cpp | 2 + Source/Core/Core/LibusbUtils.cpp | 2 + Source/Core/DolphinUWP/App.cpp | 332 ++++++++++++++++ Source/Core/DolphinUWP/App.h | 44 +++ .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 2726 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 37126 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 20070 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 4599 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1768 bytes Source/Core/DolphinUWP/Assets/StoreLogo.png | Bin 0 -> 2830 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 12475 bytes Source/Core/DolphinUWP/DolphinUWP.vcxproj | 349 +++++++++++++++++ Source/Core/DolphinUWP/Package.appxmanifest | 70 ++++ Source/Core/DolphinUWP/PropertySheet.props | 16 + Source/Core/DolphinUWP/pch.h | 8 + .../ControllerInterface/SDL/SDL.cpp | 8 +- .../ControllerInterface/Win32/Win32.cpp | 12 + Source/Core/UICommon/DiscordPresence.cpp | 1 + .../Core/VideoBackends/D3D12/DX12Pipeline.cpp | 5 + .../VideoBackends/D3DCommon/SwapChain.cpp | 33 +- Source/Core/VideoCommon/VideoBackendBase.cpp | 5 + Source/VSProps/Base.Dolphin.props | 10 +- Source/VSProps/Base.Targets.props | 8 + Source/dolphin-emu.sln | 362 +++++++++++++++++- 30 files changed, 1365 insertions(+), 29 deletions(-) create mode 100644 Source/Core/DolphinUWP/App.cpp create mode 100644 Source/Core/DolphinUWP/App.h create mode 100644 Source/Core/DolphinUWP/Assets/LockScreenLogo.scale-200.png create mode 100644 Source/Core/DolphinUWP/Assets/SplashScreen.scale-200.png create mode 100644 Source/Core/DolphinUWP/Assets/Square150x150Logo.scale-200.png create mode 100644 Source/Core/DolphinUWP/Assets/Square44x44Logo.scale-200.png create mode 100644 Source/Core/DolphinUWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 Source/Core/DolphinUWP/Assets/StoreLogo.png create mode 100644 Source/Core/DolphinUWP/Assets/Wide310x150Logo.scale-200.png create mode 100644 Source/Core/DolphinUWP/DolphinUWP.vcxproj create mode 100644 Source/Core/DolphinUWP/Package.appxmanifest create mode 100644 Source/Core/DolphinUWP/PropertySheet.props create mode 100644 Source/Core/DolphinUWP/pch.h 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/Source/Core/Common/WindowSystemInfo.h b/Source/Core/Common/WindowSystemInfo.h index 8936ad1a02e7..425f7ed1b8b9 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..6e183483544c 100644 --- a/Source/Core/Core/HW/GCPadEmu.cpp +++ b/Source/Core/Core/HW/GCPadEmu.cpp @@ -171,11 +171,21 @@ 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 #else @@ -183,8 +193,22 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) // 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 m_dpad->SetControlExpression(2, "`F`"); // Left @@ -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,17 @@ 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 + + // 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..14b268a3273f 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 + +#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 -#ifdef _WIN32 +#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,14 +706,26 @@ 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 @@ -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/IOS/USB/Bluetooth/BTReal.cpp b/Source/Core/Core/IOS/USB/Bluetooth/BTReal.cpp index d57f913be3b1..aa6a9a53075c 100644 --- a/Source/Core/Core/IOS/USB/Bluetooth/BTReal.cpp +++ b/Source/Core/Core/IOS/USB/Bluetooth/BTReal.cpp @@ -1,6 +1,7 @@ // Copyright 2016 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#if defined(__LIBUSB__) #include "Core/IOS/USB/Bluetooth/BTReal.h" #include @@ -732,3 +733,4 @@ void BluetoothRealDevice::HandleBulkOrIntrTransfer(libusb_transfer* tr) m_current_transfers.erase(tr); } } // namespace IOS::HLE +#endif diff --git a/Source/Core/Core/IOS/USB/LibusbDevice.cpp b/Source/Core/Core/IOS/USB/LibusbDevice.cpp index e909169bf1d6..6469b82e141f 100644 --- a/Source/Core/Core/IOS/USB/LibusbDevice.cpp +++ b/Source/Core/Core/IOS/USB/LibusbDevice.cpp @@ -1,6 +1,7 @@ // Copyright 2017 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#if defined(__LIBUSB__) #include "Core/IOS/USB/LibusbDevice.h" #include @@ -474,3 +475,4 @@ int LibusbDevice::ReleaseAllInterfacesForCurrentConfig() const return ReleaseAllInterfaces(config_num); } } // namespace IOS::HLE::USB +#endif diff --git a/Source/Core/Core/LibusbUtils.cpp b/Source/Core/Core/LibusbUtils.cpp index 1b1852dddd11..666e7e008afe 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() diff --git a/Source/Core/DolphinUWP/App.cpp b/Source/Core/DolphinUWP/App.cpp new file mode 100644 index 000000000000..165fb47f1435 --- /dev/null +++ b/Source/Core/DolphinUWP/App.cpp @@ -0,0 +1,332 @@ +#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"); + openPicker.FileTypeFilter().Append(L".json"); + + 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, BootSessionData("", DeleteSavestateAfterBoot::No)); + + 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 0000000000000000000000000000000000000000..eef3e094d41da5ecab865f9298b89ca62a1bc745 GIT binary patch literal 2726 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2646ffa91756b8649d832c3434f825030ffdc4e1 GIT binary patch literal 37126 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..98c94ce550c63e68f0af559306c53e51bd24b1e0 GIT binary patch literal 20070 zcmd?P^;aCv(T04uS7$CuYga29E^lYh3pN6RxRf`@66k2-L2G4W=inkif6~%HPwQYUL2n?a&Z7>J zwXt_l@^!P(@zu};`Z@wdtm&mBu`$HGMPE2L+jv;gdOJJ0xQlvA(Ep3E=*$0qnz`v| z|Ape=C_yj%k3?ESbuC(1S2r74K`tRqAP=tqt*{6eub_~yh%g5&-wVvm1K{T4;p7n! z733G?;iLV}MgJm>mR8)&+E!FsPT@b|ULXm2dk+tgC^z?~PoKCx@pHMl*>UrVh=_3W z@Nx6;alT-1y8F0zSbB51xHJ5l$$!|$*|-DU96%lpt}e9yu(h;u_4JUSf6@5gU2z7f ztN#yo7x({I?8SE6-j*P4UM?PPXXk(V_b+UB4{e+OPnZ7{+g;ZOWW%j(I|2DEuW zXZSDiiw*zZg8o5#(MD9$&EaKqES=`qc>xh=J~=sF z83k#65d{H$Y1#kMD!aIQSh@gh{wv$zMfQJah5nzkqOxu_mL9Hdx~{HH|Mdnfdsh!v zcY9Y5t*q?7MxU0&z`@1Z^^-g6f5+-&wEo?BIU6?zFB@wGH&^{-22X2l}6=vvGL|HMf_TA}pcgLO@W_QkIj}^)@@oK@Bo7@Hy%5D|0@P zAKP#HkZJF~yof7}O;MU9Pto z+Gnq7ocic@(!lS&_8e%d;Q6WPvz@{E#MAXkGk;5_-?7N^ea?x%dqVmDAKW%*fI8jx z$!pL95{O)@880=BnU8#&W?YpRb$aYaLWvy_=4%{Y{4QKlh+H>-rrS=_NXJbnw>|oV z^-&I4^*yYTwQ$3mR{9N7FpG#9ok}8O_C%P_wzO}3z7&91ii0dQ?1hWatpvM@em)vR z-A*7ysC7Q9V==6e%z=Ti^1XN>S1ZYn9e|~hiBjC=ZjW}We%~RMZY?3xcxEBtOcdFh z%GlG7$Z|GZQ;TnMhLm*Pn;M#1yft&RDp&twoC6?0vV dm$N1NTJWaPV31B1}qiN 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

duU`x4;dy! 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 H`Jn#`@&W9D literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..be542f7064595fecb497d215df882d4af2c412ae GIT binary patch literal 4599 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 O7ehT`%u}5!5&r>JRst^o literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6c9c746475abda4a5a8a28dc7abc11ba8d43d748 GIT binary patch literal 1768 zcmaJ?c~BE)6ptWsd7xH}2eJmJpltTYCYxOe3ON8FhyfMRS~r^oA|xBK!9=MtqEc}j zk)mje7ha`Wt<-AkAW~&UtrzIjqbh2L4yTHUG8RO;;jsSUxHI2=`@ZkJ-@ATqHa|Wt za+ucyFM&WXEILZ1<9DHRc?{v-kL`-r{5FWwMMemYU7ys<3xiX`wc!Fmd4cyE%8i#j zEl~?Ofna#Ga}B!4mKg*B*FDC>BwLa;mZVvem@=?>M(i+Icx{0obf&{X(dmp0&@-t< zvqIEXQ6&P528C#WR10e@N+!)1wbIHYtc**fSEkd1K{PXLm{+KSsxh!Lp_C-4ve6hQ5P~2e7==(2#>$$2-g1-1kA%YD3<0M|5D-tn zagf3=1|%>92laAXW{}DdxeSww`t1!Ll(CPt{0X0qWgse2j?n}yM+qf>zhDNkDGz(DUO#wop@I>yY8nw6iauVZdR z2?Q=TqgCOFQ87=8a-tIEes-~j%Pt|mpDs-${EG@p{weU7@@`{Sby)~_!Y?3TaI{a) z+%02NBfBD1wSL~SM@0x5LS~BsbeN>un76s`V3Xxra@CXV_wPTf*wyXW6kC?_!mr)+ zQFhIY#xvZr%C@j1>fh>19r|gD(9Elvz|!+&enIZog4dacG8LQM=d~{zee`^{vQn7- zjlQbS`P-@7;?Df)U@jP`x(=cVoj;;@)FNMf&0q18=Kee%-P%ati#2T z6mGcVqHo$u^ysUMY$m<(>|CWV(1Q|=@{jlT+Ol@G$R*(M&P~&1<(%|cUkq=XFt04h?c9_65zCjHoA#G*ez0_$zl$oO)ThmR zX!qxJb!TSQ=3Z&aYf!$tySJ?9xN4nugz7i+VfX3Odq{GwHW$-SFSFMAHoG-Ez3KY9 zaQJd;R}j=WWBrM|3zqar;#rMZ+H+4Xz4pOdeypxbE-$oou77$UcBuF5_B(z@PrOo3 zJz)2_kWpVX{m&Jcg~eosbKzF)%Bi#o0B zZ~f(4rQr=xtz(=*NpL&})?fK%3N1E?Wtq82GBHJHSOuQSA zT$?tgHS1*0owCZNCGST3T;eft$L?kJ%2ioQqbJ1Qel*VeG?iWcazE%s-$M30ZyW(F lboFZM2;FvVOfe*=68tKZ)JK(^+V1?_M62Ue$0C;I{s-lAkoEuo literal 0 HcmV?d00001 diff --git a/Source/Core/DolphinUWP/Assets/StoreLogo.png b/Source/Core/DolphinUWP/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..9c01f551c173fadb51b5031bcfeb191d22d43d47 GIT binary patch literal 2830 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 hAFF?BKul@wg8aQCk58_iFz=r}B{?{vXW`FD3v0 literal 0 HcmV?d00001 diff --git a/Source/Core/DolphinUWP/DolphinUWP.vcxproj b/Source/Core/DolphinUWP/DolphinUWP.vcxproj new file mode 100644 index 000000000000..cd4b9f6ba609 --- /dev/null +++ b/Source/Core/DolphinUWP/DolphinUWP.vcxproj @@ -0,0 +1,349 @@ + + + + + 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) + + + 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;%(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 + + + + $(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;%(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/Package.appxmanifest b/Source/Core/DolphinUWP/Package.appxmanifest new file mode 100644 index 000000000000..5aac9956072e --- /dev/null +++ b/Source/Core/DolphinUWP/Package.appxmanifest @@ -0,0 +1,70 @@ + + + + + + Dolphin Emulator + Dolphin Emulator + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + .iso + .ciso + .wbfs + .rvz + .gcz + .gcm + .json + + + + + + + .iso + .ciso + .rvz + .wbfs + .gcm + .gcz + .json + + 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/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/UICommon/DiscordPresence.cpp b/Source/Core/UICommon/DiscordPresence.cpp index ff0afb5d2565..bffcd74cdcc4 100644 --- a/Source/Core/UICommon/DiscordPresence.cpp +++ b/Source/Core/UICommon/DiscordPresence.cpp @@ -259,6 +259,7 @@ bool UpdateDiscordPresenceRaw(const std::string& details, const std::string& sta return true; #endif + return false; } void UpdateDiscordPresence(int party_size, SecretType type, const std::string& secret, 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..9e4849f8a837 100644 --- a/Source/Core/VideoCommon/VideoBackendBase.cpp +++ b/Source/Core/VideoCommon/VideoBackendBase.cpp @@ -224,8 +224,13 @@ const std::vector>& VideoBackendBase::GetAvail #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 #ifdef __APPLE__ backends.push_back(std::make_unique()); #endif diff --git a/Source/VSProps/Base.Dolphin.props b/Source/VSProps/Base.Dolphin.props index 0cbbab961793..beef9d621089 100644 --- a/Source/VSProps/Base.Dolphin.props +++ b/Source/VSProps/Base.Dolphin.props @@ -35,16 +35,18 @@ _ARCH_64=1;_M_X86=1;_M_X86_64=1;%(PreprocessorDefinitions) _ARCH_64=1;_M_ARM_64=1;%(PreprocessorDefinitions) - USE_UPNP;__LIBUSB__;%(PreprocessorDefinitions) + USE_UPNP;%(PreprocessorDefinitions) + __LIBUSB__;%(PreprocessorDefinitions) USE_ANALYTICS=1;%(PreprocessorDefinitions) - USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) + USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) HAVE_FFMPEG;%(PreprocessorDefinitions) - HAS_OPENGL;%(PreprocessorDefinitions) - HAS_VULKAN;%(PreprocessorDefinitions) + HAS_OPENGL;%(PreprocessorDefinitions) + HAS_VULKAN;%(PreprocessorDefinitions) HAS_LIBMGBA;%(PreprocessorDefinitions) AUTOUPDATE;%(PreprocessorDefinitions) HAVE_SDL2;%(PreprocessorDefinitions) STEAM;%(PreprocessorDefinitions) + _UWP=1;%(PreprocessorDefinitions)