diff --git a/CMakeLists.txt b/CMakeLists.txt index bc0176ba82..19fa9014ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -369,11 +369,6 @@ if(ENABLE_VTUNE) ) endif() -if(WIN32) - message(STATUS "Building for Windows, disabling NoGUI frontend.") - set(ENABLE_NOGUI OFF) -endif() - if(ANDROID) message(STATUS "Building for Android") if(NOT ENABLE_HEADLESS) diff --git a/Externals/Bochs_disasm/Bochs_disasm.vcxproj b/Externals/Bochs_disasm/Bochs_disasm.vcxproj index fa8c63b8db..c614a5f793 100644 --- a/Externals/Bochs_disasm/Bochs_disasm.vcxproj +++ b/Externals/Bochs_disasm/Bochs_disasm.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/FreeSurround/FreeSurround.vcxproj b/Externals/FreeSurround/FreeSurround.vcxproj index 0e2e9e93d8..e94b3781e5 100644 --- a/Externals/FreeSurround/FreeSurround.vcxproj +++ b/Externals/FreeSurround/FreeSurround.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/LZO/LZO.vcxproj b/Externals/LZO/LZO.vcxproj index bf0509b1de..83af621942 100644 --- a/Externals/LZO/LZO.vcxproj +++ b/Externals/LZO/LZO.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/SFML/build/vc2010/SFML_Network.vcxproj b/Externals/SFML/build/vc2010/SFML_Network.vcxproj index 397a48a4ff..dedb7a7153 100644 --- a/Externals/SFML/build/vc2010/SFML_Network.vcxproj +++ b/Externals/SFML/build/vc2010/SFML_Network.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/cpp-optparse/cpp-optparse.vcxproj b/Externals/cpp-optparse/cpp-optparse.vcxproj index 22f3dd23bd..2398db0a82 100644 --- a/Externals/cpp-optparse/cpp-optparse.vcxproj +++ b/Externals/cpp-optparse/cpp-optparse.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/cubeb/msvc/cubeb.vcxproj b/Externals/cubeb/msvc/cubeb.vcxproj index 868fed5b81..2875d8ea19 100644 --- a/Externals/cubeb/msvc/cubeb.vcxproj +++ b/Externals/cubeb/msvc/cubeb.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/curl/curl.vcxproj b/Externals/curl/curl.vcxproj index 9a658a6879..d22b7b5ae3 100644 --- a/Externals/curl/curl.vcxproj +++ b/Externals/curl/curl.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/discord-rpc/src/discord-rpc.vcxproj b/Externals/discord-rpc/src/discord-rpc.vcxproj index 539bb24213..18eaf56887 100644 --- a/Externals/discord-rpc/src/discord-rpc.vcxproj +++ b/Externals/discord-rpc/src/discord-rpc.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -35,7 +43,7 @@ <_ProjectFileVersion>10.0.20506.1 - + ..\include;..\thirdparty\include;%(AdditionalIncludeDirectories) @@ -53,7 +61,7 @@ - + ..\include;..\thirdparty\include;%(AdditionalIncludeDirectories) @@ -90,4 +98,4 @@ - \ No newline at end of file + diff --git a/Externals/ed25519/ed25519.vcxproj b/Externals/ed25519/ed25519.vcxproj index 08fb96bc3c..23aadafabe 100644 --- a/Externals/ed25519/ed25519.vcxproj +++ b/Externals/ed25519/ed25519.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/enet/enet.vcxproj b/Externals/enet/enet.vcxproj index 93df1c1bdc..087b5a5e44 100644 --- a/Externals/enet/enet.vcxproj +++ b/Externals/enet/enet.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/glslang/glslang.vcxproj b/Externals/glslang/glslang.vcxproj index 7854aef3cf..8db1bd2b9f 100644 --- a/Externals/glslang/glslang.vcxproj +++ b/Externals/glslang/glslang.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/imgui/imgui.vcxproj b/Externals/imgui/imgui.vcxproj index dd56b22f63..a5b4749b0a 100644 --- a/Externals/imgui/imgui.vcxproj +++ b/Externals/imgui/imgui.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/libpng/png/png.vcxproj b/Externals/libpng/png/png.vcxproj index 03cf8a602e..e9e63bcf65 100644 --- a/Externals/libpng/png/png.vcxproj +++ b/Externals/libpng/png/png.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/libusb/libusb_static_2013.vcxproj b/Externals/libusb/libusb_static_2013.vcxproj index b56ccafce6..d1dd4c0e96 100644 --- a/Externals/libusb/libusb_static_2013.vcxproj +++ b/Externals/libusb/libusb_static_2013.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/mbedtls/mbedTLS.vcxproj b/Externals/mbedtls/mbedTLS.vcxproj index 678f9a4021..fd515be40b 100644 --- a/Externals/mbedtls/mbedTLS.vcxproj +++ b/Externals/mbedtls/mbedTLS.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/miniupnpc/miniupnpc.vcxproj b/Externals/miniupnpc/miniupnpc.vcxproj index 8d2f7bb695..b409ffed30 100644 --- a/Externals/miniupnpc/miniupnpc.vcxproj +++ b/Externals/miniupnpc/miniupnpc.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/minizip/minizip.vcxproj b/Externals/minizip/minizip.vcxproj index b05b61631e..af620547b7 100644 --- a/Externals/minizip/minizip.vcxproj +++ b/Externals/minizip/minizip.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/picojson/picojson.vcxproj b/Externals/picojson/picojson.vcxproj index 709c71046b..f4782b61d8 100644 --- a/Externals/picojson/picojson.vcxproj +++ b/Externals/picojson/picojson.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/pugixml/pugixml.vcxproj b/Externals/pugixml/pugixml.vcxproj index 21660751ba..05200bdb3f 100644 --- a/Externals/pugixml/pugixml.vcxproj +++ b/Externals/pugixml/pugixml.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/soundtouch/SoundTouch.vcxproj b/Externals/soundtouch/SoundTouch.vcxproj index 53ec0ceee1..bc99698372 100644 --- a/Externals/soundtouch/SoundTouch.vcxproj +++ b/Externals/soundtouch/SoundTouch.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/xxhash/xxhash.vcxproj b/Externals/xxhash/xxhash.vcxproj index 50737415e9..3aed79e621 100644 --- a/Externals/xxhash/xxhash.vcxproj +++ b/Externals/xxhash/xxhash.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Externals/zlib/zlib.vcxproj b/Externals/zlib/zlib.vcxproj index c0eea5f9a7..0ca8e7e40a 100644 --- a/Externals/zlib/zlib.vcxproj +++ b/Externals/zlib/zlib.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Languages/Languages.vcxproj b/Languages/Languages.vcxproj index 1b26426c8f..fc5ad9998a 100644 --- a/Languages/Languages.vcxproj +++ b/Languages/Languages.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/AudioCommon/AudioCommon.vcxproj b/Source/Core/AudioCommon/AudioCommon.vcxproj index 2c3e1a78ed..9da2eb3df7 100644 --- a/Source/Core/AudioCommon/AudioCommon.vcxproj +++ b/Source/Core/AudioCommon/AudioCommon.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/Common/Arm64Emitter.cpp b/Source/Core/Common/Arm64Emitter.cpp index 2bc6659b2c..2790b50a75 100644 --- a/Source/Core/Common/Arm64Emitter.cpp +++ b/Source/Core/Common/Arm64Emitter.cpp @@ -364,6 +364,8 @@ void ARM64XEmitter::FlushIcacheSection(u8* start, u8* end) #if defined(IOS) // Header file says this is equivalent to: sys_icache_invalidate(start, end - start); sys_cache_control(kCacheFunctionPrepareForExecution, start, end - start); +#elif defined(WIN32) + FlushInstructionCache(GetCurrentProcess(), start, end - start); #else // Don't rely on GCC's __clear_cache implementation, as it caches // icache/dcache cache line sizes, that can vary between cores on @@ -2172,6 +2174,8 @@ void ARM64XEmitter::ABI_PopRegisters(BitSet32 registers, BitSet32 ignore_mask) ARM64Reg second; if (!(num_regs & 1)) second = (ARM64Reg)(X0 + *it++); + else + second = {}; // 8 byte per register, but 16 byte alignment, so we may have to padd one register. // Only update the SP on the last load to avoid the dependency between those loads. @@ -4164,20 +4168,19 @@ void ARM64XEmitter::ANDSI2R(ARM64Reg Rd, ARM64Reg Rn, u64 imm, ARM64Reg scratch) void ARM64XEmitter::AddImmediate(ARM64Reg Rd, ARM64Reg Rn, u64 imm, bool shift, bool negative, bool flags) { - switch ((negative << 1) | flags) + if (!negative) { - case 0: - ADD(Rd, Rn, imm, shift); - break; - case 1: - ADDS(Rd, Rn, imm, shift); - break; - case 2: - SUB(Rd, Rn, imm, shift); - break; - case 3: - SUBS(Rd, Rn, imm, shift); - break; + if (!flags) + ADD(Rd, Rn, imm, shift); + else + ADDS(Rd, Rn, imm, shift); + } + else + { + if (!flags) + SUB(Rd, Rn, imm, shift); + else + SUBS(Rd, Rn, imm, shift); } } @@ -4185,7 +4188,7 @@ void ARM64XEmitter::ADDI2R_internal(ARM64Reg Rd, ARM64Reg Rn, u64 imm, bool nega ARM64Reg scratch) { bool has_scratch = scratch != INVALID_REG; - u64 imm_neg = Is64Bit(Rd) ? -imm : -imm & 0xFFFFFFFFuLL; + u64 imm_neg = Is64Bit(Rd) ? u64(-s64(imm)) : u64(-s64(imm)) & 0xFFFFFFFFuLL; bool neg_neg = negative ? false : true; // Fast paths, aarch64 immediate instructions @@ -4232,20 +4235,19 @@ void ARM64XEmitter::ADDI2R_internal(ARM64Reg Rd, ARM64Reg Rn, u64 imm, bool nega (u32)imm); negative ^= MOVI2R2(scratch, imm, imm_neg); - switch ((negative << 1) | flags) + if (!negative) { - case 0: - ADD(Rd, Rn, scratch); - break; - case 1: - ADDS(Rd, Rn, scratch); - break; - case 2: - SUB(Rd, Rn, scratch); - break; - case 3: - SUBS(Rd, Rn, scratch); - break; + if (!flags) + ADD(Rd, Rn, scratch); + else + ADDS(Rd, Rn, scratch); + } + else + { + if (!flags) + SUB(Rd, Rn, scratch); + else + SUBS(Rd, Rn, scratch); } } diff --git a/Source/Core/Common/ArmCPUDetect.cpp b/Source/Core/Common/ArmCPUDetect.cpp index 7ad619581c..53026bf5d2 100644 --- a/Source/Core/Common/ArmCPUDetect.cpp +++ b/Source/Core/Common/ArmCPUDetect.cpp @@ -2,13 +2,17 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. -#include #include #include #include #include +#include + +#ifndef _WIN32 +#include #include #include +#endif #include @@ -16,6 +20,8 @@ #include "Common/CommonTypes.h" #include "Common/FileUtil.h" +#ifndef WIN32 + const char procfile[] = "/proc/cpuinfo"; static std::string GetCPUString() @@ -42,6 +48,8 @@ static std::string GetCPUString() return cpu_string; } +#endif + CPUInfo cpu_info; CPUInfo::CPUInfo() @@ -60,6 +68,21 @@ void CPUInfo::Detect() Mode64bit = true; vendor = CPUVendor::ARM; +#ifdef _WIN32 + num_cores = std::thread::hardware_concurrency(); + + // Windows does not provide any mechanism for querying the system registers on ARMv8, unlike Linux + // which traps the register reads and emulates them in the kernel. There are environment variables + // containing some of the CPU-specific values, which we could use for a lookup table in the + // future. For now, assume all features are present as all known devices which are Windows-on-ARM + // compatible also support these extensions. + bFP = true; + bASIMD = true; + bAES = true; + bCRC32 = true; + bSHA1 = true; + bSHA2 = true; +#else // Get the information about the CPU num_cores = sysconf(_SC_NPROCESSORS_CONF); strncpy(cpu_string, GetCPUString().c_str(), sizeof(cpu_string)); @@ -71,6 +94,7 @@ void CPUInfo::Detect() bCRC32 = hwcaps & HWCAP_CRC32; bSHA1 = hwcaps & HWCAP_SHA1; bSHA2 = hwcaps & HWCAP_SHA2; +#endif } // Turn the CPU info into a string we can show diff --git a/Source/Core/Common/Common.vcxproj b/Source/Core/Common/Common.vcxproj index 39994601ae..db8f850615 100644 --- a/Source/Core/Common/Common.vcxproj +++ b/Source/Core/Common/Common.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -38,6 +46,12 @@ + + true + + + true + @@ -122,9 +136,15 @@ - - - + + true + + + true + + + true + @@ -165,9 +185,15 @@ - - - + + true + + + true + + + true + @@ -177,6 +203,12 @@ + + true + + + true + @@ -193,10 +225,19 @@ + + true + - - - + + true + + + true + + + true + @@ -226,10 +267,18 @@ - - - - + + true + + + true + + + true + + + true + @@ -261,4 +310,4 @@ - \ No newline at end of file + diff --git a/Source/Core/Common/Common.vcxproj.filters b/Source/Core/Common/Common.vcxproj.filters index 6a0261032f..b7a205b4a4 100644 --- a/Source/Core/Common/Common.vcxproj.filters +++ b/Source/Core/Common/Common.vcxproj.filters @@ -279,6 +279,8 @@ + + @@ -361,6 +363,9 @@ GL\GLInterface + + + diff --git a/Source/Core/Common/Hash.cpp b/Source/Core/Common/Hash.cpp index 193ff5257b..ea2375f3c7 100644 --- a/Source/Core/Common/Hash.cpp +++ b/Source/Core/Common/Hash.cpp @@ -11,7 +11,7 @@ #include "Common/CommonFuncs.h" #include "Common/Intrinsics.h" -#ifdef _M_ARM_64 +#if defined(_M_ARM_64) && !defined(_MSC_VER) #include #endif diff --git a/Source/Core/Common/SCMRevGen.vcxproj b/Source/Core/Common/SCMRevGen.vcxproj index e2d8b3b506..f8c9829144 100644 --- a/Source/Core/Common/SCMRevGen.vcxproj +++ b/Source/Core/Common/SCMRevGen.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index b0d6354b74..b884249266 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -275,26 +283,111 @@ - - - - - - - - - - - - - - - - - - - - + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + @@ -539,20 +632,63 @@ - - - - - - - - - - - - - - + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index 19b789b4bb..7fe19d606b 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -166,6 +166,12 @@ {68c09d7e-4f5a-435d-a0d2-7eb7a74d7054} + + {132cd43e-84be-4939-9f0c-0e7f26794598} + + + {9e91e72c-e432-4e02-8e03-c45c2b6f6957} + @@ -881,9 +887,6 @@ Config - - - HW %28Flipper/Hollywood%29\Wiimote\Emu @@ -936,6 +939,60 @@ HW %28Flipper/Hollywood%29 + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + + + PowerPC\Jit64 + @@ -1668,8 +1725,23 @@ HW %28Flipper/Hollywood%29 + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArm64 + + + PowerPC\JitArmCommon + - + \ No newline at end of file diff --git a/Source/Core/Core/MachineContext.h b/Source/Core/Core/MachineContext.h index a2658c0006..af077cf813 100644 --- a/Source/Core/Core/MachineContext.h +++ b/Source/Core/Core/MachineContext.h @@ -33,6 +33,10 @@ typedef CONTEXT SContext; #define CTX_R14 R14 #define CTX_R15 R15 #define CTX_RIP Rip +#elif _M_ARM64 +#define CTX_REG(x) X[x] +#define CTX_SP Sp +#define CTX_PC Pc #else #error No context definition for architecture #endif diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp index faee0210ff..a60035d47a 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp @@ -754,9 +754,9 @@ void JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC) LDR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(msr)); FixupBranch b1 = TBNZ(WA, 13); // Test FP enabled bit - FixupBranch far = B(); + FixupBranch far_addr = B(); SwitchToFarCode(); - SetJumpTarget(far); + SetJumpTarget(far_addr); gpr.Flush(FLUSH_MAINTAIN_STATE); fpr.Flush(FLUSH_MAINTAIN_STATE); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp index 97a81df2d4..a4150d86d7 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Branch.cpp @@ -143,9 +143,9 @@ void JitArm64::bcx(UGeckoInstruction inst) JumpIfCRFieldBit(inst.BI >> 2, 3 - (inst.BI & 3), !(inst.BO_2 & BO_BRANCH_IF_TRUE)); } - FixupBranch far = B(); + FixupBranch far_addr = B(); SwitchToFarCode(); - SetJumpTarget(far); + SetJumpTarget(far_addr); if (inst.LK) { @@ -160,12 +160,12 @@ void JitArm64::bcx(UGeckoInstruction inst) if (js.op->branchIsIdleLoop) { // make idle loops go faster - ARM64Reg WA = gpr.GetReg(); - ARM64Reg XA = EncodeRegTo64(WA); + ARM64Reg WA2 = gpr.GetReg(); + ARM64Reg XA2 = EncodeRegTo64(WA2); - MOVP2R(XA, &CoreTiming::Idle); - BLR(XA); - gpr.Unlock(WA); + MOVP2R(XA2, &CoreTiming::Idle); + BLR(XA2); + gpr.Unlock(WA2); WriteExceptionExit(js.op->branchTo); } @@ -260,9 +260,9 @@ void JitArm64::bclrx(UGeckoInstruction inst) if (conditional) { - FixupBranch far = B(); + FixupBranch far_addr = B(); SwitchToFarCode(); - SetJumpTarget(far); + SetJumpTarget(far_addr); } LDR(INDEX_UNSIGNED, WA, PPC_REG, PPCSTATE_OFF(spr[SPR_LR])); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp index 459d3d259e..5aa776c506 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp @@ -35,7 +35,7 @@ void JitArm64::fp_arith(UGeckoInstruction inst) bool inputs_are_singles = fpr.IsSingle(a, !packed) && (!use_b || fpr.IsSingle(b, !packed)) && (!use_c || fpr.IsSingle(c, !packed)); - ARM64Reg VA, VB, VC, VD; + ARM64Reg VA{}, VB{}, VC{}, VD{}; if (packed) { diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp index b4a98c76f7..08cff4e7e7 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Integer.cpp @@ -368,7 +368,11 @@ void JitArm64::cntlzwx(UGeckoInstruction inst) if (gpr.IsImm(s)) { +#ifdef _MSC_VER + gpr.SetImmediate(a, _CountLeadingZeros(gpr.GetImm(s))); +#else gpr.SetImmediate(a, __builtin_clz(gpr.GetImm(s))); +#endif if (inst.Rc) ComputeRC0(gpr.GetImm(a)); } @@ -931,7 +935,7 @@ void JitArm64::subfex(UGeckoInstruction inst) // d = ~a + b + carry; if (gpr.IsImm(a)) - MOVI2R(WA, ~gpr.GetImm(a)); + MOVI2R(WA, u32(~gpr.GetImm(a))); else MVN(WA, gpr.R(a)); ADCS(gpr.R(d), WA, gpr.R(b)); @@ -1187,7 +1191,7 @@ void JitArm64::divwx(UGeckoInstruction inst) if (inst.Rc) ComputeRC0(imm_d); } - else if (gpr.IsImm(b) && gpr.GetImm(b) != 0 && gpr.GetImm(b) != -1u) + else if (gpr.IsImm(b) && gpr.GetImm(b) != 0 && gpr.GetImm(b) != UINT32_C(0xFFFFFFFF)) { ARM64Reg WA = gpr.GetReg(); MOVI2R(WA, gpr.GetImm(b)); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp index 7daad1ef91..3df65cf644 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStore.cpp @@ -408,7 +408,7 @@ void JitArm64::stX(UGeckoInstruction inst) gpr.BindToRegister(a, false); ARM64Reg WA = gpr.GetReg(); - ARM64Reg RB; + ARM64Reg RB = {}; ARM64Reg RA = gpr.R(a); if (regOffset != -1) RB = gpr.R(regOffset); @@ -549,9 +549,9 @@ void JitArm64::dcbx(UGeckoInstruction inst) LSR(value, value, addr); // move current bit to bit 0 FixupBranch bit_not_set = TBZ(value, 0); - FixupBranch far = B(); + FixupBranch far_addr = B(); SwitchToFarCode(); - SetJumpTarget(far); + SetJumpTarget(far_addr); BitSet32 gprs_to_push = gpr.GetCallerSavedUsed(); BitSet32 fprs_to_push = fpr.GetCallerSavedUsed(); @@ -568,10 +568,10 @@ void JitArm64::dcbx(UGeckoInstruction inst) m_float_emit.ABI_PopRegisters(fprs_to_push, X30); ABI_PopRegisters(gprs_to_push); - FixupBranch near = B(); + FixupBranch near_addr = B(); SwitchToNearCode(); SetJumpTarget(bit_not_set); - SetJumpTarget(near); + SetJumpTarget(near_addr); gpr.Unlock(addr, value, W30); } diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp index 02f557b9b7..dc775ef607 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp @@ -149,6 +149,7 @@ Arm64GPRCache::GuestRegInfo Arm64GPRCache::GetGuestByIndex(size_t index) if (index >= GUEST_CR_OFFSET && index < GUEST_CR_OFFSET + GUEST_CR_COUNT) return GetGuestCR(index - GUEST_CR_OFFSET); ASSERT_MSG(DYNA_REC, false, "Invalid index for guest register"); + return GetGuestGPR(0); } void Arm64GPRCache::FlushRegister(size_t index, bool maintain_state) @@ -161,7 +162,7 @@ void Arm64GPRCache::FlushRegister(size_t index, bool maintain_state) { ARM64Reg host_reg = reg.GetReg(); if (reg.IsDirty()) - m_emit->STR(INDEX_UNSIGNED, host_reg, PPC_REG, guest_reg.ppc_offset); + m_emit->STR(INDEX_UNSIGNED, host_reg, PPC_REG, u32(guest_reg.ppc_offset)); if (!maintain_state) { @@ -173,14 +174,14 @@ void Arm64GPRCache::FlushRegister(size_t index, bool maintain_state) { if (!reg.GetImm()) { - m_emit->STR(INDEX_UNSIGNED, bitsize == 64 ? ZR : WZR, PPC_REG, guest_reg.ppc_offset); + m_emit->STR(INDEX_UNSIGNED, bitsize == 64 ? ZR : WZR, PPC_REG, u32(guest_reg.ppc_offset)); } else { ARM64Reg host_reg = bitsize != 64 ? GetReg() : EncodeRegTo64(GetReg()); m_emit->MOVI2R(host_reg, reg.GetImm()); - m_emit->STR(INDEX_UNSIGNED, host_reg, PPC_REG, guest_reg.ppc_offset); + m_emit->STR(INDEX_UNSIGNED, host_reg, PPC_REG, u32(guest_reg.ppc_offset)); UnlockRegister(DecodeReg(host_reg)); } @@ -207,7 +208,7 @@ void Arm64GPRCache::FlushRegisters(BitSet32 regs, bool maintain_state) size_t ppc_offset = GetGuestByIndex(i).ppc_offset; ARM64Reg RX1 = R(GetGuestByIndex(i)); ARM64Reg RX2 = R(GetGuestByIndex(i + 1)); - m_emit->STP(INDEX_SIGNED, RX1, RX2, PPC_REG, ppc_offset); + m_emit->STP(INDEX_SIGNED, RX1, RX2, PPC_REG, u32(ppc_offset)); if (!maintain_state) { UnlockRegister(DecodeReg(RX1)); @@ -285,7 +286,7 @@ ARM64Reg Arm64GPRCache::R(const GuestRegInfo& guest_reg) ARM64Reg host_reg = bitsize != 64 ? GetReg() : EncodeRegTo64(GetReg()); reg.Load(host_reg); reg.SetDirty(false); - m_emit->LDR(INDEX_UNSIGNED, host_reg, PPC_REG, guest_reg.ppc_offset); + m_emit->LDR(INDEX_UNSIGNED, host_reg, PPC_REG, u32(guest_reg.ppc_offset)); return host_reg; } break; @@ -318,7 +319,7 @@ void Arm64GPRCache::BindToRegister(const GuestRegInfo& guest_reg, bool do_load) ARM64Reg host_reg = bitsize != 64 ? GetReg() : EncodeRegTo64(GetReg()); reg.Load(host_reg); if (do_load) - m_emit->LDR(INDEX_UNSIGNED, host_reg, PPC_REG, guest_reg.ppc_offset); + m_emit->LDR(INDEX_UNSIGNED, host_reg, PPC_REG, u32(guest_reg.ppc_offset)); } } @@ -450,7 +451,7 @@ ARM64Reg Arm64FPRCache::R(size_t preg, RegType type) // Load the high 64bits from the file and insert them in to the high 64bits of the host // register ARM64Reg tmp_reg = GetReg(); - m_float_emit->LDR(64, INDEX_UNSIGNED, tmp_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps1)); + m_float_emit->LDR(64, INDEX_UNSIGNED, tmp_reg, PPC_REG, u32(PPCSTATE_OFF(ps[preg].ps1))); m_float_emit->INS(64, host_reg, 1, tmp_reg, 0); UnlockRegister(tmp_reg); @@ -503,7 +504,8 @@ ARM64Reg Arm64FPRCache::R(size_t preg, RegType type) reg.Load(host_reg, REG_LOWER_PAIR); } reg.SetDirty(false); - m_float_emit->LDR(load_size, INDEX_UNSIGNED, host_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps0)); + m_float_emit->LDR(load_size, INDEX_UNSIGNED, host_reg, PPC_REG, + u32(PPCSTATE_OFF(ps[preg].ps0))); return host_reg; } default: @@ -551,7 +553,7 @@ ARM64Reg Arm64FPRCache::RW(size_t preg, RegType type) // We are doing a full 128bit store because it takes 2 cycles on a Cortex-A57 to do a 128bit // store. // It would take longer to do an insert to a temporary and a 64bit store than to just do this. - m_float_emit->STR(128, INDEX_UNSIGNED, flush_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps0)); + m_float_emit->STR(128, INDEX_UNSIGNED, flush_reg, PPC_REG, u32(PPCSTATE_OFF(ps[preg].ps0))); break; case REG_DUP_SINGLE: flush_reg = GetReg(); @@ -559,7 +561,7 @@ ARM64Reg Arm64FPRCache::RW(size_t preg, RegType type) [[fallthrough]]; case REG_DUP: // Store PSR1 (which is equal to PSR0) in memory. - m_float_emit->STR(64, INDEX_UNSIGNED, flush_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps1)); + m_float_emit->STR(64, INDEX_UNSIGNED, flush_reg, PPC_REG, u32(PPCSTATE_OFF(ps[preg].ps1))); break; default: // All other types doesn't store anything in PSR1. @@ -684,7 +686,10 @@ void Arm64FPRCache::FlushRegister(size_t preg, bool maintain_state) store_size = 64; if (dirty) - m_float_emit->STR(store_size, INDEX_UNSIGNED, host_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps0)); + { + m_float_emit->STR(store_size, INDEX_UNSIGNED, host_reg, PPC_REG, + u32(PPCSTATE_OFF(ps[preg].ps0))); + } if (!maintain_state) { @@ -700,8 +705,8 @@ void Arm64FPRCache::FlushRegister(size_t preg, bool maintain_state) // Too bad moving them would break savestate compatibility between x86_64 and AArch64 // m_float_emit->STP(64, INDEX_SIGNED, host_reg, host_reg, PPC_REG, // PPCSTATE_OFF(ps[preg].ps0)); - m_float_emit->STR(64, INDEX_UNSIGNED, host_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps0)); - m_float_emit->STR(64, INDEX_UNSIGNED, host_reg, PPC_REG, PPCSTATE_OFF(ps[preg].ps1)); + m_float_emit->STR(64, INDEX_UNSIGNED, host_reg, PPC_REG, u32(PPCSTATE_OFF(ps[preg].ps0))); + m_float_emit->STR(64, INDEX_UNSIGNED, host_reg, PPC_REG, u32(PPCSTATE_OFF(ps[preg].ps1))); } if (!maintain_state) diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp index 7f567eca4d..d5889fd62c 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp @@ -32,6 +32,7 @@ FixupBranch JitArm64::JumpIfCRFieldBit(int field, int bit, bool jump_if_set) return jump_if_set ? TBNZ(XA, 62) : TBZ(XA, 62); default: ASSERT_MSG(DYNA_REC, false, "Invalid CR bit"); + return {}; } } @@ -196,9 +197,9 @@ void JitArm64::twx(UGeckoInstruction inst) SetJumpTarget(fixup); } - FixupBranch far = B(); + FixupBranch far_addr = B(); SwitchToFarCode(); - SetJumpTarget(far); + SetJumpTarget(far_addr); gpr.Flush(FlushMode::FLUSH_MAINTAIN_STATE); fpr.Flush(FlushMode::FLUSH_MAINTAIN_STATE); diff --git a/Source/Core/DiscIO/DiscIO.vcxproj b/Source/Core/DiscIO/DiscIO.vcxproj index a45dc43d62..7b0cf20bce 100644 --- a/Source/Core/DiscIO/DiscIO.vcxproj +++ b/Source/Core/DiscIO/DiscIO.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/DolphinNoGUI/CMakeLists.txt b/Source/Core/DolphinNoGUI/CMakeLists.txt index 6247dac2d0..3943582ad2 100644 --- a/Source/Core/DolphinNoGUI/CMakeLists.txt +++ b/Source/Core/DolphinNoGUI/CMakeLists.txt @@ -9,6 +9,10 @@ if(ENABLE_X11 AND X11_FOUND) target_sources(dolphin-nogui PRIVATE PlatformX11.cpp) endif() +if(WIN32) + target_sources(dolphin-nogui PRIVATE PlatformWin32.cpp) +endif() + if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") target_sources(dolphin-nogui PRIVATE PlatformFBDev.cpp) endif() diff --git a/Source/Core/DolphinNoGUI/DolphinNoGUI.exe.manifest b/Source/Core/DolphinNoGUI/DolphinNoGUI.exe.manifest new file mode 100644 index 0000000000..69f9e43d44 --- /dev/null +++ b/Source/Core/DolphinNoGUI/DolphinNoGUI.exe.manifest @@ -0,0 +1,30 @@ + + + +Dolphin NoGUI Frontend + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinNoGUI/DolphinNoGUI.rc b/Source/Core/DolphinNoGUI/DolphinNoGUI.rc new file mode 100644 index 0000000000..b1471b1760 --- /dev/null +++ b/Source/Core/DolphinNoGUI/DolphinNoGUI.rc @@ -0,0 +1,6 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" +IDI_ICON1 ICON "..\\..\\..\\Installer\\Dolphin.ico" +"dolphin" ICON "..\\..\\..\\Installer\\Dolphin.ico" + diff --git a/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj b/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj new file mode 100644 index 0000000000..74a14f6d97 --- /dev/null +++ b/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj @@ -0,0 +1,117 @@ + + + + + Debug + ARM64 + + + Debug + x64 + + + Release + ARM64 + + + Release + x64 + + + + {974E563D-23F8-4E8F-9083-F62876B04E08} + 10.0 + + + + Application + v142 + Unicode + + + true + + + false + + + + + + + + + + + + + + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;rpcrt4.lib;comctl32.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) + $(IntDir)..\discord-rpc\bin;%(AdditionalLibraryDirectories) + opengl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;%(AdditionalDependencies) + $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) + Console + + + + + {c636d9d1-82fe-42b5-9987-63b7d4836341} + + + {e54cf649-140e-4255-81a5-30a673c1fb36} + + + {604c8368-f34a-4d55-82c8-cc92a0c13254} + + + {96020103-4ba5-4fd2-b4aa-5b6d24492d4e} + + + {53a5391b-737e-49a8-bc8f-312ada00736f} + + + {ec1a314c-5588-4506-9c1e-2e58e5817f75} + + + {a4c423aa-f57c-46c7-a172-d1a777017d29} + + + {29f29a19-f141-45ad-9679-5a2923b49da3} + + + {3de9ee35-3e91-4f27-a014-2866ad8c3fe3} + + + {570215b7-e32f-4438-95ae-c8d955f9fca3} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj.filters b/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj.filters new file mode 100644 index 0000000000..1a368e0465 --- /dev/null +++ b/Source/Core/DolphinNoGUI/DolphinNoGUI.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinNoGUI/MainNoGUI.cpp b/Source/Core/DolphinNoGUI/MainNoGUI.cpp index 8c27992201..14fac966c9 100644 --- a/Source/Core/DolphinNoGUI/MainNoGUI.cpp +++ b/Source/Core/DolphinNoGUI/MainNoGUI.cpp @@ -12,8 +12,11 @@ #include #ifndef _WIN32 #include +#else +#include #endif +#include "Common/StringUtil.h" #include "Core/Analytics.h" #include "Core/Boot/Boot.h" #include "Core/BootManager.h" @@ -121,6 +124,11 @@ static std::unique_ptr GetPlatform(const optparse::Values& options) return Platform::CreateFBDevPlatform(); #endif +#ifdef _WIN32 + if (platform_name == "win32" || platform_name.empty()) + return Platform::CreateWin32Platform(); +#endif + if (platform_name == "headless" || platform_name.empty()) return Platform::CreateHeadlessPlatform(); @@ -142,6 +150,10 @@ int main(int argc, char* argv[]) #if HAVE_X11 , "x11" +#endif +#ifdef _WIN32 + , + "win32" #endif }); @@ -198,6 +210,10 @@ int main(int argc, char* argv[]) s_platform->Stop(); }); +#ifdef _WIN32 + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); +#else // Shut down cleanly on SIGINT and SIGTERM struct sigaction sa; sa.sa_handler = signal_handler; @@ -205,6 +221,7 @@ int main(int argc, char* argv[]) sa.sa_flags = SA_RESETHAND; sigaction(SIGINT, &sa, nullptr); sigaction(SIGTERM, &sa, nullptr); +#endif DolphinAnalytics::Instance().ReportDolphinStart("nogui"); diff --git a/Source/Core/DolphinNoGUI/Platform.h b/Source/Core/DolphinNoGUI/Platform.h index af39492447..b0d98e58be 100644 --- a/Source/Core/DolphinNoGUI/Platform.h +++ b/Source/Core/DolphinNoGUI/Platform.h @@ -35,10 +35,15 @@ public: #ifdef HAVE_X11 static std::unique_ptr CreateX11Platform(); #endif + #ifdef __linux__ static std::unique_ptr CreateFBDevPlatform(); #endif +#ifdef _WIN32 + static std::unique_ptr CreateWin32Platform(); +#endif + protected: void UpdateRunningFlag(); diff --git a/Source/Core/DolphinNoGUI/PlatformWin32.cpp b/Source/Core/DolphinNoGUI/PlatformWin32.cpp new file mode 100644 index 0000000000..add981b361 --- /dev/null +++ b/Source/Core/DolphinNoGUI/PlatformWin32.cpp @@ -0,0 +1,201 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "DolphinNoGUI/Platform.h" + +#include "Common/MsgHandler.h" +#include "Core/Config/MainSettings.h" +#include "Core/ConfigManager.h" +#include "Core/Core.h" +#include "Core/State.h" + +#include +#include +#include + +#include "VideoCommon/RenderBase.h" +#include "resource.h" + +namespace +{ +class PlatformWin32 : public Platform +{ +public: + ~PlatformWin32() override; + + bool Init() override; + void SetTitle(const std::string& string) override; + void MainLoop() override; + + WindowSystemInfo GetWindowSystemInfo() const; + +private: + static constexpr TCHAR WINDOW_CLASS_NAME[] = _T("DolphinNoGUI"); + + static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + + bool RegisterRenderWindowClass(); + bool CreateRenderWindow(); + void UpdateWindowPosition(); + void ProcessEvents(); + + HWND m_hwnd{}; + + int m_window_x = Config::Get(Config::MAIN_RENDER_WINDOW_XPOS); + int m_window_y = Config::Get(Config::MAIN_RENDER_WINDOW_YPOS); + int m_window_width = Config::Get(Config::MAIN_RENDER_WINDOW_WIDTH); + int m_window_height = Config::Get(Config::MAIN_RENDER_WINDOW_HEIGHT); +}; + +PlatformWin32::~PlatformWin32() +{ + if (m_hwnd) + DestroyWindow(m_hwnd); +} + +bool PlatformWin32::RegisterRenderWindowClass() +{ + WNDCLASSEX wc = {}; + wc.cbSize = sizeof(WNDCLASSEX); + wc.style = 0; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = GetModuleHandle(nullptr); + wc.hIcon = LoadIcon(NULL, IDI_ICON1); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = WINDOW_CLASS_NAME; + wc.hIconSm = LoadIcon(NULL, IDI_ICON1); + + if (!RegisterClassEx(&wc)) + { + MessageBox(nullptr, _T("Window registration failed."), _T("Error"), MB_ICONERROR | MB_OK); + return false; + } + + return true; +} + +bool PlatformWin32::CreateRenderWindow() +{ + m_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, WINDOW_CLASS_NAME, _T("Dolphin"), WS_OVERLAPPEDWINDOW, + m_window_x < 0 ? CW_USEDEFAULT : m_window_x, + m_window_y < 0 ? CW_USEDEFAULT : m_window_y, m_window_width, + m_window_height, nullptr, nullptr, GetModuleHandle(nullptr), this); + if (!m_hwnd) + { + MessageBox(nullptr, _T("CreateWindowEx failed."), _T("Error"), MB_ICONERROR | MB_OK); + return false; + } + + ShowWindow(m_hwnd, SW_SHOW); + UpdateWindow(m_hwnd); + return true; +} + +bool PlatformWin32::Init() +{ + if (!RegisterRenderWindowClass() || !CreateRenderWindow()) + return false; + + // TODO: Enter fullscreen if enabled. + if (Config::Get(Config::MAIN_FULLSCREEN)) + { + ProcessEvents(); + } + + UpdateWindowPosition(); + return true; +} + +void PlatformWin32::SetTitle(const std::string& string) +{ + SetWindowTextW(m_hwnd, UTF8ToUTF16(string).c_str()); +} + +void PlatformWin32::MainLoop() +{ + while (IsRunning()) + { + UpdateRunningFlag(); + Core::HostDispatchJobs(); + ProcessEvents(); + UpdateWindowPosition(); + + // TODO: Is this sleep appropriate? + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} + +WindowSystemInfo PlatformWin32::GetWindowSystemInfo() const +{ + WindowSystemInfo wsi; + wsi.type = WindowSystemType::Windows; + wsi.render_surface = reinterpret_cast(m_hwnd); + return wsi; +} + +void PlatformWin32::UpdateWindowPosition() +{ + if (m_window_fullscreen) + return; + + RECT rc = {}; + if (!GetWindowRect(m_hwnd, &rc)) + return; + + m_window_x = rc.left; + m_window_y = rc.top; + m_window_width = rc.right - rc.left; + m_window_height = rc.bottom - rc.top; +} + +void PlatformWin32::ProcessEvents() +{ + MSG msg; + while (PeekMessage(&msg, m_hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +LRESULT PlatformWin32::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + PlatformWin32* platform = reinterpret_cast(GetWindowLongPtr(hwnd, GWLP_USERDATA)); + switch (msg) + { + case WM_NCCREATE: + { + platform = + reinterpret_cast(reinterpret_cast(lParam)->lpCreateParams); + SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast(platform)); + return DefWindowProc(hwnd, msg, wParam, lParam); + } + + case WM_SIZE: + { + if (g_renderer) + g_renderer->ResizeSurface(); + } + break; + + case WM_CLOSE: + platform->RequestShutdown(); + break; + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + + return 0; +} +} // namespace + +std::unique_ptr Platform::CreateWin32Platform() +{ + return std::make_unique(); +} diff --git a/Source/Core/DolphinNoGUI/resource.h b/Source/Core/DolphinNoGUI/resource.h new file mode 100644 index 0000000000..18fcdb7f0b --- /dev/null +++ b/Source/Core/DolphinNoGUI/resource.h @@ -0,0 +1,24 @@ +// Copyright 2017 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by DolphinNoGui.rc +// +#ifdef RC_INVOKED +#define IDI_ICON1 101 +#else +#define IDI_ICON1 MAKEINTRESOURCE(101) +#endif + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Core/DolphinQt/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj index d89cf632ff..92a3be2edd 100644 --- a/Source/Core/DolphinQt/DolphinQt.vcxproj +++ b/Source/Core/DolphinQt/DolphinQt.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -47,7 +55,8 @@ $(ExternalsDir)ffmpeg\lib;$(IntDir)..\discord-rpc\bin;%(AdditionalLibraryDirectories) - avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;rpcrt4.lib;comctl32.lib;Shlwapi.lib;discord-rpc.lib;%(AdditionalDependencies) + opengl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;%(AdditionalDependencies) $(ProjectDir)VideoInterface;$(ProjectDir)GameList;$(ProjectDir)Debugger;$(ProjectDir)Settings;$(ProjectDir)Config;$(ProjectDir)Config\Mapping;$(ProjectDir)Config\Graphics;$(ProjectDir)Config\ControllerInterface;$(ProjectDir)NetPlay;$(ProjectDir)QtUtils;$(ProjectDir)TAS;$(ProjectDir)FIFO;%(AdditionalIncludeDirectories) @@ -479,10 +488,10 @@ {96020103-4ba5-4fd2-b4aa-5b6d24492d4e} - + {ec1a314c-5588-4506-9c1e-2e58e5817f75} - + {a4c423aa-f57c-46c7-a172-d1a777017d29} diff --git a/Source/Core/InputCommon/InputCommon.vcxproj b/Source/Core/InputCommon/InputCommon.vcxproj index 7e139bb29e..1b0b42c7ab 100644 --- a/Source/Core/InputCommon/InputCommon.vcxproj +++ b/Source/Core/InputCommon/InputCommon.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/UICommon/UICommon.vcxproj b/Source/Core/UICommon/UICommon.vcxproj index 9e497dbd3b..9feb25db4e 100644 --- a/Source/Core/UICommon/UICommon.vcxproj +++ b/Source/Core/UICommon/UICommon.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/UpdaterCommon/UpdaterCommon.vcxproj b/Source/Core/UpdaterCommon/UpdaterCommon.vcxproj index c95e118f1d..c9cbb526a7 100644 --- a/Source/Core/UpdaterCommon/UpdaterCommon.vcxproj +++ b/Source/Core/UpdaterCommon/UpdaterCommon.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/VideoBackends/D3D/D3D.vcxproj b/Source/Core/VideoBackends/D3D/D3D.vcxproj index 595b7331b7..5622e7d79e 100644 --- a/Source/Core/VideoBackends/D3D/D3D.vcxproj +++ b/Source/Core/VideoBackends/D3D/D3D.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/VideoBackends/D3D12/D3D12.vcxproj b/Source/Core/VideoBackends/D3D12/D3D12.vcxproj index f82b1735d4..c2957fc654 100644 --- a/Source/Core/VideoBackends/D3D12/D3D12.vcxproj +++ b/Source/Core/VideoBackends/D3D12/D3D12.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -35,18 +43,6 @@ - - - NotUsing - - - - - - NotUsing - - - @@ -91,4 +87,4 @@ - \ No newline at end of file + diff --git a/Source/Core/VideoBackends/D3DCommon/D3DCommon.vcxproj b/Source/Core/VideoBackends/D3DCommon/D3DCommon.vcxproj index 13502da791..5f07041cf5 100644 --- a/Source/Core/VideoBackends/D3DCommon/D3DCommon.vcxproj +++ b/Source/Core/VideoBackends/D3DCommon/D3DCommon.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -41,12 +49,26 @@ + + + NotUsing + + + + NotUsing + + + NotUsing + + + + diff --git a/Source/Core/VideoBackends/Null/Null.vcxproj b/Source/Core/VideoBackends/Null/Null.vcxproj index 4624d5e3ac..2c3cac1a43 100644 --- a/Source/Core/VideoBackends/Null/Null.vcxproj +++ b/Source/Core/VideoBackends/Null/Null.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/VideoBackends/OGL/OGL.vcxproj b/Source/Core/VideoBackends/OGL/OGL.vcxproj index 4213e8f090..fc552200ae 100644 --- a/Source/Core/VideoBackends/OGL/OGL.vcxproj +++ b/Source/Core/VideoBackends/OGL/OGL.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/VideoBackends/Software/Software.vcxproj b/Source/Core/VideoBackends/Software/Software.vcxproj index f4651e6908..93e7a6c84a 100644 --- a/Source/Core/VideoBackends/Software/Software.vcxproj +++ b/Source/Core/VideoBackends/Software/Software.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/VideoBackends/Vulkan/Vulkan.vcxproj b/Source/Core/VideoBackends/Vulkan/Vulkan.vcxproj index acf998a9d7..d1a7e520f0 100644 --- a/Source/Core/VideoBackends/Vulkan/Vulkan.vcxproj +++ b/Source/Core/VideoBackends/Vulkan/Vulkan.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/Core/VideoCommon/VertexLoaderARM64.cpp b/Source/Core/VideoCommon/VertexLoaderARM64.cpp index f4c4648ab5..c212ca7a81 100644 --- a/Source/Core/VideoCommon/VertexLoaderARM64.cpp +++ b/Source/Core/VideoCommon/VertexLoaderARM64.cpp @@ -379,7 +379,7 @@ void VertexLoaderARM64::GenerateVertexLoader() bool has_tc_scale = false; for (int i = 0; i < 8; i++) { - has_tc |= tc[i]; + has_tc |= tc[i] != 0; has_tc_scale |= !!m_VtxAttr.texCoord[i].Frac; } diff --git a/Source/Core/VideoCommon/VideoBackendBase.cpp b/Source/Core/VideoCommon/VideoBackendBase.cpp index e1ed233fa1..9a6a92a01a 100644 --- a/Source/Core/VideoCommon/VideoBackendBase.cpp +++ b/Source/Core/VideoCommon/VideoBackendBase.cpp @@ -17,14 +17,21 @@ #include "Core/ConfigManager.h" #include "Core/Core.h" +// OpenGL is not available on Windows-on-ARM64 +#if !defined(_WIN32) || !defined(_M_ARM64) +#define HAS_OPENGL 1 +#endif + // TODO: ugly #ifdef _WIN32 #include "VideoBackends/D3D/VideoBackend.h" #include "VideoBackends/D3D12/VideoBackend.h" #endif #include "VideoBackends/Null/VideoBackend.h" +#ifdef HAS_OPENGL #include "VideoBackends/OGL/VideoBackend.h" #include "VideoBackends/Software/VideoBackend.h" +#endif #include "VideoBackends/Vulkan/VideoBackend.h" #include "VideoCommon/AsyncRequests.h" @@ -182,13 +189,17 @@ u16 VideoBackendBase::Video_GetBoundingBox(int index) void VideoBackendBase::PopulateList() { // OGL > D3D11 > Vulkan > SW > Null +#ifdef HAS_OPENGL g_available_video_backends.push_back(std::make_unique()); +#endif #ifdef _WIN32 g_available_video_backends.push_back(std::make_unique()); g_available_video_backends.push_back(std::make_unique()); #endif g_available_video_backends.push_back(std::make_unique()); +#ifdef HAS_OPENGL g_available_video_backends.push_back(std::make_unique()); +#endif g_available_video_backends.push_back(std::make_unique()); const auto iter = diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj b/Source/Core/VideoCommon/VideoCommon.vcxproj index becac6d09c..668dbc34ec 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -41,7 +49,9 @@ - + + true + @@ -71,6 +81,9 @@ + + true + @@ -82,8 +95,13 @@ + + true + - + + true + @@ -96,7 +114,9 @@ - + + true + @@ -154,6 +174,9 @@ + + true + @@ -194,4 +217,4 @@ - \ No newline at end of file + diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters index f69a01a813..1535249e06 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters @@ -203,6 +203,12 @@ Util + + Decoding + + + Vertex Loading + @@ -398,8 +404,11 @@ Util + + Vertex Loading + - + \ No newline at end of file diff --git a/Source/Core/WinUpdater/WinUpdater.vcxproj b/Source/Core/WinUpdater/WinUpdater.vcxproj index a5aeba87b7..89c8553905 100644 --- a/Source/Core/WinUpdater/WinUpdater.vcxproj +++ b/Source/Core/WinUpdater/WinUpdater.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/DSPTool/DSPTool.vcxproj b/Source/DSPTool/DSPTool.vcxproj index fc275ddd07..1145e2f231 100644 --- a/Source/DSPTool/DSPTool.vcxproj +++ b/Source/DSPTool/DSPTool.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/PCH/pch.vcxproj b/Source/PCH/pch.vcxproj index b316d9fd50..8ed61f8fcd 100644 --- a/Source/PCH/pch.vcxproj +++ b/Source/PCH/pch.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 diff --git a/Source/UnitTests/UnitTests.vcxproj b/Source/UnitTests/UnitTests.vcxproj index 7afb74a386..ac2043ccff 100644 --- a/Source/UnitTests/UnitTests.vcxproj +++ b/Source/UnitTests/UnitTests.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -45,8 +53,9 @@ The following libs are needed since we pull in pretty much the entire dolphin codebase. --> - $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) - avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;Shlwapi.lib;%(AdditionalDependencies) + avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;rpcrt4.lib;comctl32.lib;Shlwapi.lib;%(AdditionalDependencies) + opengl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;%(AdditionalDependencies) + $(ExternalsDir)ffmpeg\lib;%(AdditionalLibraryDirectories) Console @@ -56,7 +65,9 @@ - + + true + @@ -69,10 +80,10 @@ {96020103-4ba5-4fd2-b4aa-5b6d24492d4e} - + {ec1a314c-5588-4506-9c1e-2e58e5817f75} - + {a4c423aa-f57c-46c7-a172-d1a777017d29} @@ -95,4 +106,4 @@ - \ No newline at end of file + diff --git a/Source/VSProps/Base.props b/Source/VSProps/Base.props index bd156bafc6..ef85a44f7b 100644 --- a/Source/VSProps/Base.props +++ b/Source/VSProps/Base.props @@ -55,16 +55,16 @@ $(ExternalsDir)Vulkan\include;%(AdditionalIncludeDirectories) $(ExternalsDir)xxhash;%(AdditionalIncludeDirectories) $(ExternalsDir)zlib;%(AdditionalIncludeDirectories) - HAVE_FFMPEG;%(PreprocessorDefinitions) FMT_HEADER_ONLY=1;%(PreprocessorDefinitions) _CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) USE_UPNP;USE_USBDK;__LIBUSB__;%(PreprocessorDefinitions) - _M_X86=1;%(PreprocessorDefinitions) SFML_STATIC;%(PreprocessorDefinitions) USE_ANALYTICS=1;%(PreprocessorDefinitions) USE_DISCORD_PRESENCE;%(PreprocessorDefinitions) CURL_STATICLIB;%(PreprocessorDefinitions) - _ARCH_64=1;_M_X86_64=1;%(PreprocessorDefinitions) + _ARCH_64=1;_M_X86=1;_M_X86_64=1;%(PreprocessorDefinitions) + _ARCH_64=1;_M_ARM_64=1;%(PreprocessorDefinitions) + HAVE_FFMPEG;%(PreprocessorDefinitions) diff --git a/Source/dolphin-emu.sln b/Source/dolphin-emu.sln index 6d90865dbe..a79713c95b 100644 --- a/Source/dolphin-emu.sln +++ b/Source/dolphin-emu.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26430.14 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29509.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dolphin", "Core\DolphinQt\DolphinQt.vcxproj", "{FA3FA62B-6F58-4B86-9453-4D149940A066}" EndProject @@ -97,188 +97,368 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "D3D12", "Core\VideoBackends EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "D3DCommon", "Core\VideoBackends\D3DCommon\D3DCommon.vcxproj", "{DEA96CF2-F237-4A1A-B32F-C916769EFB50}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DolphinNoGUI", "Core\DolphinNoGUI\DolphinNoGUI.vcxproj", "{974E563D-23F8-4E8F-9083-F62876B04E08}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FA3FA62B-6F58-4B86-9453-4D149940A066}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FA3FA62B-6F58-4B86-9453-4D149940A066}.Debug|x64.ActiveCfg = Debug|x64 {FA3FA62B-6F58-4B86-9453-4D149940A066}.Debug|x64.Build.0 = Debug|x64 + {FA3FA62B-6F58-4B86-9453-4D149940A066}.Release|ARM64.ActiveCfg = Release|ARM64 {FA3FA62B-6F58-4B86-9453-4D149940A066}.Release|x64.ActiveCfg = Release|x64 {FA3FA62B-6F58-4B86-9453-4D149940A066}.Release|x64.Build.0 = Release|x64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|ARM64.Build.0 = Debug|ARM64 {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|x64.ActiveCfg = Debug|x64 {E54CF649-140E-4255-81A5-30A673C1FB36}.Debug|x64.Build.0 = Debug|x64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|ARM64.ActiveCfg = Release|ARM64 + {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|ARM64.Build.0 = Release|ARM64 {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|x64.ActiveCfg = Release|x64 {E54CF649-140E-4255-81A5-30A673C1FB36}.Release|x64.Build.0 = Release|x64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|ARM64.Build.0 = Debug|ARM64 {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|x64.ActiveCfg = Debug|x64 {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Debug|x64.Build.0 = Debug|x64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|ARM64.ActiveCfg = Release|ARM64 + {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|ARM64.Build.0 = Release|ARM64 {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|x64.ActiveCfg = Release|x64 {54AA7840-5BEB-4A0C-9452-74BA4CC7FD44}.Release|x64.Build.0 = Release|x64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|ARM64.Build.0 = Debug|ARM64 {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|x64.ActiveCfg = Debug|x64 {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Debug|x64.Build.0 = Debug|x64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|ARM64.ActiveCfg = Release|ARM64 + {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|ARM64.Build.0 = Release|ARM64 {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|x64.ActiveCfg = Release|x64 {2E6C348C-C75C-4D94-8D1E-9C1FCBF3EFE4}.Release|x64.Build.0 = Release|x64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|ARM64.Build.0 = Debug|ARM64 {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|x64.ActiveCfg = Debug|x64 {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Debug|x64.Build.0 = Debug|x64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|ARM64.ActiveCfg = Release|ARM64 + {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|ARM64.Build.0 = Release|ARM64 {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|x64.ActiveCfg = Release|x64 {160BDC25-5626-4B0D-BDD8-2953D9777FB5}.Release|x64.Build.0 = Release|x64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|ARM64.Build.0 = Debug|ARM64 {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|x64.ActiveCfg = Debug|x64 {6BBD47CF-91FD-4077-B676-8B76980178A9}.Debug|x64.Build.0 = Debug|x64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|ARM64.ActiveCfg = Release|ARM64 + {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|ARM64.Build.0 = Release|ARM64 {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|x64.ActiveCfg = Release|x64 {6BBD47CF-91FD-4077-B676-8B76980178A9}.Release|x64.Build.0 = Release|x64 + {604C8368-F34A-4D55-82C8-CC92A0C13254}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {604C8368-F34A-4D55-82C8-CC92A0C13254}.Debug|ARM64.Build.0 = Debug|ARM64 {604C8368-F34A-4D55-82C8-CC92A0C13254}.Debug|x64.ActiveCfg = Debug|x64 {604C8368-F34A-4D55-82C8-CC92A0C13254}.Debug|x64.Build.0 = Debug|x64 + {604C8368-F34A-4D55-82C8-CC92A0C13254}.Release|ARM64.ActiveCfg = Release|ARM64 + {604C8368-F34A-4D55-82C8-CC92A0C13254}.Release|ARM64.Build.0 = Release|ARM64 {604C8368-F34A-4D55-82C8-CC92A0C13254}.Release|x64.ActiveCfg = Release|x64 {604C8368-F34A-4D55-82C8-CC92A0C13254}.Release|x64.Build.0 = Release|x64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|ARM64.Build.0 = Debug|ARM64 {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|x64.ActiveCfg = Debug|x64 {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Debug|x64.Build.0 = Debug|x64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|ARM64.ActiveCfg = Release|ARM64 + {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|ARM64.Build.0 = Release|ARM64 {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|x64.ActiveCfg = Release|x64 {3DE9EE35-3E91-4F27-A014-2866AD8C3FE3}.Release|x64.Build.0 = Release|x64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|ARM64.Build.0 = Debug|ARM64 {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|x64.ActiveCfg = Debug|x64 {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Debug|x64.Build.0 = Debug|x64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|ARM64.ActiveCfg = Release|ARM64 + {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|ARM64.Build.0 = Release|ARM64 {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|x64.ActiveCfg = Release|x64 {8ADA04D7-6DB1-4DA4-AB55-64FB12A0997B}.Release|x64.Build.0 = Release|x64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|ARM64.Build.0 = Debug|ARM64 {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|x64.ActiveCfg = Debug|x64 {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Debug|x64.Build.0 = Debug|x64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|ARM64.ActiveCfg = Release|ARM64 + {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|ARM64.Build.0 = Release|ARM64 {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|x64.ActiveCfg = Release|x64 {0E033BE3-2E08-428E-9AE9-BC673EFA12B5}.Release|x64.Build.0 = Release|x64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|ARM64.Build.0 = Debug|ARM64 {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|x64.ActiveCfg = Debug|x64 {AB993F38-C31D-4897-B139-A620C42BC565}.Debug|x64.Build.0 = Debug|x64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Release|ARM64.ActiveCfg = Release|ARM64 + {AB993F38-C31D-4897-B139-A620C42BC565}.Release|ARM64.Build.0 = Release|ARM64 {AB993F38-C31D-4897-B139-A620C42BC565}.Release|x64.ActiveCfg = Release|x64 {AB993F38-C31D-4897-B139-A620C42BC565}.Release|x64.Build.0 = Release|x64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|ARM64.Build.0 = Debug|ARM64 {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|x64.ActiveCfg = Debug|x64 {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Debug|x64.Build.0 = Debug|x64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|ARM64.ActiveCfg = Release|ARM64 + {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|ARM64.Build.0 = Release|ARM64 {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|x64.ActiveCfg = Release|x64 {31643FDB-1BB8-4965-9DE7-000FC88D35AE}.Release|x64.Build.0 = Release|x64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|ARM64.Build.0 = Debug|ARM64 {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|x64.ActiveCfg = Debug|x64 {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Debug|x64.Build.0 = Debug|x64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|ARM64.ActiveCfg = Release|ARM64 + {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|ARM64.Build.0 = Release|ARM64 {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|x64.ActiveCfg = Release|x64 {4C9F135B-A85E-430C-BAD4-4C67EF5FC12C}.Release|x64.Build.0 = Release|x64 + {677EA016-1182-440C-9345-DC88D1E98C0C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {677EA016-1182-440C-9345-DC88D1E98C0C}.Debug|ARM64.Build.0 = Debug|ARM64 {677EA016-1182-440C-9345-DC88D1E98C0C}.Debug|x64.ActiveCfg = Debug|x64 {677EA016-1182-440C-9345-DC88D1E98C0C}.Debug|x64.Build.0 = Debug|x64 + {677EA016-1182-440C-9345-DC88D1E98C0C}.Release|ARM64.ActiveCfg = Release|ARM64 + {677EA016-1182-440C-9345-DC88D1E98C0C}.Release|ARM64.Build.0 = Release|ARM64 {677EA016-1182-440C-9345-DC88D1E98C0C}.Release|x64.ActiveCfg = Release|x64 {677EA016-1182-440C-9345-DC88D1E98C0C}.Release|x64.Build.0 = Release|x64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|ARM64.Build.0 = Debug|ARM64 {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|x64.ActiveCfg = Debug|x64 {FF213B23-2C26-4214-9F88-85271E557E87}.Debug|x64.Build.0 = Debug|x64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Release|ARM64.ActiveCfg = Release|ARM64 + {FF213B23-2C26-4214-9F88-85271E557E87}.Release|ARM64.Build.0 = Release|ARM64 {FF213B23-2C26-4214-9F88-85271E557E87}.Release|x64.ActiveCfg = Release|x64 {FF213B23-2C26-4214-9F88-85271E557E87}.Release|x64.Build.0 = Release|x64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|ARM64.Build.0 = Debug|ARM64 {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|x64.ActiveCfg = Debug|x64 {EC082900-B4D8-42E9-9663-77F02F6936AE}.Debug|x64.Build.0 = Debug|x64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|ARM64.ActiveCfg = Release|ARM64 + {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|ARM64.Build.0 = Release|ARM64 {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|x64.ActiveCfg = Release|x64 {EC082900-B4D8-42E9-9663-77F02F6936AE}.Release|x64.Build.0 = Release|x64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|ARM64.Build.0 = Debug|ARM64 {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|x64.ActiveCfg = Debug|x64 {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Debug|x64.Build.0 = Debug|x64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|ARM64.ActiveCfg = Release|ARM64 + {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|ARM64.Build.0 = Release|ARM64 {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|x64.ActiveCfg = Release|x64 {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|x64.Build.0 = Release|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|ARM64.Build.0 = Debug|ARM64 {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.ActiveCfg = Debug|x64 {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.Build.0 = Debug|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|ARM64.ActiveCfg = Release|ARM64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|ARM64.Build.0 = Release|ARM64 {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.ActiveCfg = Release|x64 {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.Build.0 = Release|x64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|ARM64.Build.0 = Debug|ARM64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.ActiveCfg = Debug|x64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.Build.0 = Debug|x64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|ARM64.ActiveCfg = Release|ARM64 + {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|ARM64.Build.0 = Release|ARM64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|x64.ActiveCfg = Release|x64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Release|x64.Build.0 = Release|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|ARM64.Build.0 = Debug|ARM64 {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.ActiveCfg = Debug|x64 {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Debug|x64.Build.0 = Debug|x64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|ARM64.ActiveCfg = Release|ARM64 + {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|ARM64.Build.0 = Release|ARM64 {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.ActiveCfg = Release|x64 {349EE8F9-7D25-4909-AAF5-FF3FADE72187}.Release|x64.Build.0 = Release|x64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|ARM64.Build.0 = Debug|ARM64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|x64.ActiveCfg = Debug|x64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Debug|x64.Build.0 = Debug|x64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|ARM64.ActiveCfg = Release|ARM64 + {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|ARM64.Build.0 = Release|ARM64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.ActiveCfg = Release|x64 {1970D175-3DE8-4738-942A-4D98D1CDBF64}.Release|x64.Build.0 = Release|x64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|ARM64.Build.0 = Debug|ARM64 {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|x64.ActiveCfg = Debug|x64 {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Debug|x64.Build.0 = Debug|x64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|ARM64.ActiveCfg = Release|ARM64 + {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|ARM64.Build.0 = Release|ARM64 {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|x64.ActiveCfg = Release|x64 {96020103-4BA5-4FD2-B4AA-5B6D24492D4E}.Release|x64.Build.0 = Release|x64 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|ARM64.ActiveCfg = Debug|ARM64 {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|x64.ActiveCfg = Debug|x64 {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Debug|x64.Build.0 = Debug|x64 + {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|ARM64.ActiveCfg = Release|ARM64 {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|x64.ActiveCfg = Release|x64 {EC1A314C-5588-4506-9C1E-2E58E5817F75}.Release|x64.Build.0 = Release|x64 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|x64.ActiveCfg = Debug|x64 {A4C423AA-F57C-46C7-A172-D1A777017D29}.Debug|x64.Build.0 = Debug|x64 + {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|ARM64.ActiveCfg = Release|ARM64 {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|x64.ActiveCfg = Release|x64 {A4C423AA-F57C-46C7-A172-D1A777017D29}.Release|x64.Build.0 = Release|x64 + {53A5391B-737E-49A8-BC8F-312ADA00736F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {53A5391B-737E-49A8-BC8F-312ADA00736F}.Debug|ARM64.Build.0 = Debug|ARM64 {53A5391B-737E-49A8-BC8F-312ADA00736F}.Debug|x64.ActiveCfg = Debug|x64 {53A5391B-737E-49A8-BC8F-312ADA00736F}.Debug|x64.Build.0 = Debug|x64 + {53A5391B-737E-49A8-BC8F-312ADA00736F}.Release|ARM64.ActiveCfg = Release|ARM64 + {53A5391B-737E-49A8-BC8F-312ADA00736F}.Release|ARM64.Build.0 = Release|ARM64 {53A5391B-737E-49A8-BC8F-312ADA00736F}.Release|x64.ActiveCfg = Release|x64 {53A5391B-737E-49A8-BC8F-312ADA00736F}.Release|x64.Build.0 = Release|x64 + {29F29A19-F141-45AD-9679-5A2923B49DA3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {29F29A19-F141-45AD-9679-5A2923B49DA3}.Debug|ARM64.Build.0 = Debug|ARM64 {29F29A19-F141-45AD-9679-5A2923B49DA3}.Debug|x64.ActiveCfg = Debug|x64 {29F29A19-F141-45AD-9679-5A2923B49DA3}.Debug|x64.Build.0 = Debug|x64 + {29F29A19-F141-45AD-9679-5A2923B49DA3}.Release|ARM64.ActiveCfg = Release|ARM64 + {29F29A19-F141-45AD-9679-5A2923B49DA3}.Release|ARM64.Build.0 = Release|ARM64 {29F29A19-F141-45AD-9679-5A2923B49DA3}.Release|x64.ActiveCfg = Release|x64 {29F29A19-F141-45AD-9679-5A2923B49DA3}.Release|x64.Build.0 = Release|x64 + {76563A7F-1011-4EAD-B667-7BB18D09568E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {76563A7F-1011-4EAD-B667-7BB18D09568E}.Debug|ARM64.Build.0 = Debug|ARM64 {76563A7F-1011-4EAD-B667-7BB18D09568E}.Debug|x64.ActiveCfg = Debug|x64 {76563A7F-1011-4EAD-B667-7BB18D09568E}.Debug|x64.Build.0 = Debug|x64 + {76563A7F-1011-4EAD-B667-7BB18D09568E}.Release|ARM64.ActiveCfg = Release|ARM64 + {76563A7F-1011-4EAD-B667-7BB18D09568E}.Release|ARM64.Build.0 = Release|ARM64 {76563A7F-1011-4EAD-B667-7BB18D09568E}.Release|x64.ActiveCfg = Release|x64 {76563A7F-1011-4EAD-B667-7BB18D09568E}.Release|x64.Build.0 = Release|x64 + {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Debug|ARM64.Build.0 = Debug|ARM64 {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Debug|x64.ActiveCfg = Debug|x64 {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Debug|x64.Build.0 = Debug|x64 + {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Release|ARM64.ActiveCfg = Release|ARM64 + {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Release|ARM64.Build.0 = Release|ARM64 {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Release|x64.ActiveCfg = Release|x64 {474661E7-C73A-43A6-AFEE-EE1EC433D49E}.Release|x64.Build.0 = Release|x64 + {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|ARM64.Build.0 = Debug|ARM64 {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|x64.ActiveCfg = Debug|x64 {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|x64.Build.0 = Debug|x64 + {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|ARM64.ActiveCfg = Release|ARM64 + {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|ARM64.Build.0 = Release|ARM64 {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|x64.ActiveCfg = Release|x64 {CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|x64.Build.0 = Release|x64 + {BB00605C-125F-4A21-B33B-7BF418322DCB}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BB00605C-125F-4A21-B33B-7BF418322DCB}.Debug|ARM64.Build.0 = Debug|ARM64 {BB00605C-125F-4A21-B33B-7BF418322DCB}.Debug|x64.ActiveCfg = Debug|x64 {BB00605C-125F-4A21-B33B-7BF418322DCB}.Debug|x64.Build.0 = Debug|x64 + {BB00605C-125F-4A21-B33B-7BF418322DCB}.Release|ARM64.ActiveCfg = Release|ARM64 + {BB00605C-125F-4A21-B33B-7BF418322DCB}.Release|ARM64.Build.0 = Release|ARM64 {BB00605C-125F-4A21-B33B-7BF418322DCB}.Release|x64.ActiveCfg = Release|x64 {BB00605C-125F-4A21-B33B-7BF418322DCB}.Release|x64.Build.0 = Release|x64 + {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Debug|ARM64.Build.0 = Debug|ARM64 {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Debug|x64.ActiveCfg = Debug|x64 {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Debug|x64.Build.0 = Debug|x64 + {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Release|ARM64.ActiveCfg = Release|ARM64 + {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Release|ARM64.Build.0 = Release|ARM64 {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Release|x64.ActiveCfg = Release|x64 {D178061B-84D3-44F9-BEED-EFD18D9033F0}.Release|x64.Build.0 = Release|x64 + {C636D9D1-82FE-42B5-9987-63B7D4836341}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C636D9D1-82FE-42B5-9987-63B7D4836341}.Debug|ARM64.Build.0 = Debug|ARM64 {C636D9D1-82FE-42B5-9987-63B7D4836341}.Debug|x64.ActiveCfg = Debug|x64 {C636D9D1-82FE-42B5-9987-63B7D4836341}.Debug|x64.Build.0 = Debug|x64 + {C636D9D1-82FE-42B5-9987-63B7D4836341}.Release|ARM64.ActiveCfg = Release|ARM64 + {C636D9D1-82FE-42B5-9987-63B7D4836341}.Release|ARM64.Build.0 = Release|ARM64 {C636D9D1-82FE-42B5-9987-63B7D4836341}.Release|x64.ActiveCfg = Release|x64 {C636D9D1-82FE-42B5-9987-63B7D4836341}.Release|x64.Build.0 = Release|x64 + {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Debug|ARM64.Build.0 = Debug|ARM64 {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Debug|x64.ActiveCfg = Debug|x64 {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Debug|x64.Build.0 = Debug|x64 + {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Release|ARM64.ActiveCfg = Release|ARM64 + {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Release|ARM64.Build.0 = Release|ARM64 {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Release|x64.ActiveCfg = Release|x64 {8EA11166-6512-44FC-B7A5-A4D1ECC81170}.Release|x64.Build.0 = Release|x64 + {38FEE76F-F347-484B-949C-B4649381CFFB}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {38FEE76F-F347-484B-949C-B4649381CFFB}.Debug|ARM64.Build.0 = Debug|ARM64 {38FEE76F-F347-484B-949C-B4649381CFFB}.Debug|x64.ActiveCfg = Debug|x64 {38FEE76F-F347-484B-949C-B4649381CFFB}.Debug|x64.Build.0 = Debug|x64 + {38FEE76F-F347-484B-949C-B4649381CFFB}.Release|ARM64.ActiveCfg = Release|ARM64 + {38FEE76F-F347-484B-949C-B4649381CFFB}.Release|ARM64.Build.0 = Release|ARM64 {38FEE76F-F347-484B-949C-B4649381CFFB}.Release|x64.ActiveCfg = Release|x64 {38FEE76F-F347-484B-949C-B4649381CFFB}.Release|x64.Build.0 = Release|x64 + {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Debug|ARM64.Build.0 = Debug|ARM64 {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Debug|x64.ActiveCfg = Debug|x64 {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Debug|x64.Build.0 = Debug|x64 + {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Release|ARM64.ActiveCfg = Release|ARM64 + {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Release|ARM64.Build.0 = Release|ARM64 {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Release|x64.ActiveCfg = Release|x64 {2C0D058E-DE35-4471-AD99-E68A2CAF9E18}.Release|x64.Build.0 = Release|x64 + {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Debug|ARM64.Build.0 = Debug|ARM64 {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Debug|x64.ActiveCfg = Debug|x64 {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Debug|x64.Build.0 = Debug|x64 + {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Release|ARM64.ActiveCfg = Release|ARM64 + {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Release|ARM64.Build.0 = Release|ARM64 {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Release|x64.ActiveCfg = Release|x64 {5BDF4B91-1491-4FB0-BC27-78E9A8E97DC3}.Release|x64.Build.0 = Release|x64 + {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Debug|ARM64.Build.0 = Debug|ARM64 {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Debug|x64.ActiveCfg = Debug|x64 {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Debug|x64.Build.0 = Debug|x64 + {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Release|ARM64.ActiveCfg = Release|ARM64 + {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Release|ARM64.Build.0 = Release|ARM64 {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Release|x64.ActiveCfg = Release|x64 {E4BECBAB-9C6E-41AB-BB56-F9D70AB6BE03}.Release|x64.Build.0 = Release|x64 + {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Debug|ARM64.Build.0 = Debug|ARM64 {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Debug|x64.ActiveCfg = Debug|x64 {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Debug|x64.Build.0 = Debug|x64 + {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Release|ARM64.ActiveCfg = Release|ARM64 + {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Release|ARM64.Build.0 = Release|ARM64 {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Release|x64.ActiveCfg = Release|x64 {8498F2FA-5CA6-4169-9971-DE5B1FE6132C}.Release|x64.Build.0 = Release|x64 + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Debug|ARM64.Build.0 = Debug|ARM64 {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Debug|x64.ActiveCfg = Debug|x64 {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Debug|x64.Build.0 = Debug|x64 + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Release|ARM64.ActiveCfg = Release|ARM64 + {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Release|ARM64.Build.0 = Release|ARM64 {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Release|x64.ActiveCfg = Release|x64 {4482FD2A-EC43-3FFB-AC20-2E5C54B05EAD}.Release|x64.Build.0 = Release|x64 + {23114507-079A-4418-9707-CFA81A03CA99}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {23114507-079A-4418-9707-CFA81A03CA99}.Debug|ARM64.Build.0 = Debug|ARM64 {23114507-079A-4418-9707-CFA81A03CA99}.Debug|x64.ActiveCfg = Debug|x64 {23114507-079A-4418-9707-CFA81A03CA99}.Debug|x64.Build.0 = Debug|x64 + {23114507-079A-4418-9707-CFA81A03CA99}.Release|ARM64.ActiveCfg = Release|ARM64 + {23114507-079A-4418-9707-CFA81A03CA99}.Release|ARM64.Build.0 = Release|ARM64 {23114507-079A-4418-9707-CFA81A03CA99}.Release|x64.ActiveCfg = Release|x64 {23114507-079A-4418-9707-CFA81A03CA99}.Release|x64.Build.0 = Release|x64 + {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Debug|ARM64.Build.0 = Debug|ARM64 {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Debug|x64.ActiveCfg = Debug|x64 {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Debug|x64.Build.0 = Debug|x64 + {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Release|ARM64.ActiveCfg = Release|ARM64 + {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Release|ARM64.Build.0 = Release|ARM64 {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Release|x64.ActiveCfg = Release|x64 {4C3B2264-EA73-4A7B-9CFE-65B0FD635EBB}.Release|x64.Build.0 = Release|x64 + {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Debug|ARM64.Build.0 = Debug|ARM64 {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Debug|x64.ActiveCfg = Debug|x64 {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Debug|x64.Build.0 = Debug|x64 + {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Release|ARM64.ActiveCfg = Release|ARM64 + {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Release|ARM64.Build.0 = Release|ARM64 {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Release|x64.ActiveCfg = Release|x64 {B001D13E-7EAB-4689-842D-801E5ACFFAC5}.Release|x64.Build.0 = Release|x64 + {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Debug|ARM64.Build.0 = Debug|ARM64 {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Debug|x64.ActiveCfg = Debug|x64 {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Debug|x64.Build.0 = Debug|x64 + {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Release|ARM64.ActiveCfg = Release|ARM64 + {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Release|ARM64.Build.0 = Release|ARM64 {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Release|x64.ActiveCfg = Release|x64 {570215B7-E32F-4438-95AE-C8D955F9FCA3}.Release|x64.Build.0 = Release|x64 + {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Debug|ARM64.Build.0 = Debug|ARM64 {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Debug|x64.ActiveCfg = Debug|x64 {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Debug|x64.Build.0 = Debug|x64 + {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Release|ARM64.ActiveCfg = Release|ARM64 + {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Release|ARM64.Build.0 = Release|ARM64 {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Release|x64.ActiveCfg = Release|x64 {DEA96CF2-F237-4A1A-B32F-C916769EFB50}.Release|x64.Build.0 = Release|x64 + {974E563D-23F8-4E8F-9083-F62876B04E08}.Debug|x64.ActiveCfg = Debug|x64 + {974E563D-23F8-4E8F-9083-F62876B04E08}.Release|x64.ActiveCfg = Release|x64 + {974E563D-23F8-4E8F-9083-F62876B04E08}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {974E563D-23F8-4E8F-9083-F62876B04E08}.Debug|ARM64.Build.0 = Debug|ARM64 + {974E563D-23F8-4E8F-9083-F62876B04E08}.Release|ARM64.ActiveCfg = Release|ARM64 + {974E563D-23F8-4E8F-9083-F62876B04E08}.Release|ARM64.Build.0 = Release|ARM64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -324,6 +504,6 @@ Global {DEA96CF2-F237-4A1A-B32F-C916769EFB50} = {AAD1BCD6-9804-44A5-A5FC-4782EA00E9D4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {710976F2-1BC7-4F2A-B32D-5DD2BBCB44E1} + SolutionGuid = {64B0A343-3B94-4522-9C24-6937FE5EFB22} EndGlobalSection EndGlobal