mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-11-24 10:23:21 +00:00
Merge pull request #13870 from cristian64/broadband_adapter_ipc
Core/HW: Add Broadband Adapter (IPC).
This commit is contained in:
commit
b920182c97
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -114,6 +114,10 @@
|
||||
path = Externals/pugixml/pugixml
|
||||
url = https://github.com/zeux/pugixml.git
|
||||
shallow = true
|
||||
[submodule "Externals/cpp-ipc/cpp-ipc"]
|
||||
path = Externals/cpp-ipc/cpp-ipc
|
||||
url = https://github.com/mutouyun/cpp-ipc.git
|
||||
shallow = true
|
||||
[submodule "Externals/cpp-optparse/cpp-optparse"]
|
||||
path = Externals/cpp-optparse/cpp-optparse
|
||||
url = https://github.com/weisslj/cpp-optparse.git
|
||||
|
||||
@ -793,6 +793,10 @@ endif()
|
||||
|
||||
add_subdirectory(Externals/watcher)
|
||||
|
||||
if(WIN32 OR LINUX)
|
||||
add_subdirectory(Externals/cpp-ipc)
|
||||
endif()
|
||||
|
||||
########################################
|
||||
# Pre-build events: Define configuration variables and write SCM info header
|
||||
#
|
||||
|
||||
9
Externals/cpp-ipc/CMakeLists.txt
vendored
Normal file
9
Externals/cpp-ipc/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
add_subdirectory(cpp-ipc)
|
||||
|
||||
dolphin_disable_warnings(ipc)
|
||||
|
||||
if (NOT MSVC)
|
||||
target_compile_options(ipc PRIVATE "-fexceptions")
|
||||
endif ()
|
||||
|
||||
add_library(cpp-ipc::ipc ALIAS ipc)
|
||||
1
Externals/cpp-ipc/cpp-ipc
vendored
Submodule
1
Externals/cpp-ipc/cpp-ipc
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit a0c7725a1441d18bc768d748a93e512a0fa7ab52
|
||||
78
Externals/cpp-ipc/cpp-ipc.vcxproj
vendored
Normal file
78
Externals/cpp-ipc/cpp-ipc.vcxproj
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project>
|
||||
<Import Project="..\..\Source\VSProps\Base.Macros.props" />
|
||||
<Import Project="$(VSPropsDir)Base.Targets.props" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{7299DDD3-BBEC-4027-AF30-8DACC5415F96}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<Import Project="$(VSPropsDir)Configuration.StaticLibrary.props" />
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings" />
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VSPropsDir)Base.props" />
|
||||
<Import Project="$(VSPropsDir)ClDisableAllWarnings.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>cpp-ipc\include;cpp-ipc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="cpp-ipc\include\libipc\buffer.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\condition.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\def.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\export.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\ipc.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\mutex.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\pool_alloc.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\rw_lock.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\semaphore.h" />
|
||||
<ClInclude Include="cpp-ipc\include\libipc\shm.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\circ\elem_array.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\circ\elem_def.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\memory\alloc.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\memory\allocator_wrapper.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\memory\resource.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\memory\wrapper.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\platform\win\condition.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\platform\win\get_sa.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\platform\win\mutex.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\platform\win\semaphore.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\platform\win\to_tchar.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\platform\detail.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\utility\concept.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\utility\id_pool.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\utility\log.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\utility\pimpl.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\utility\scope_guard.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\utility\utility.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\policy.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\prod_cons.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\queue.h" />
|
||||
<ClInclude Include="cpp-ipc\src\libipc\waiter.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="cpp-ipc\src\libipc\platform\platform.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\sync\condition.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\sync\mutex.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\sync\semaphore.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\sync\waiter.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\buffer.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\ipc.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\pool_alloc.cpp" />
|
||||
<ClCompile Include="cpp-ipc\src\libipc\shm.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="cpp-ipc\LICENSE" />
|
||||
<None Include="cpp-ipc\README.md" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="CMakeLists.txt" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
13
Externals/cpp-ipc/exports.props
vendored
Normal file
13
Externals/cpp-ipc/exports.props
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(ExternalsDir)cpp-ipc\cpp-ipc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$(ExternalsDir)cpp-ipc\cpp-ipc.vcxproj">
|
||||
<Project>{7299DDD3-BBEC-4027-AF30-8DACC5415F96}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
2
Externals/licenses.md
vendored
2
Externals/licenses.md
vendored
@ -8,6 +8,8 @@ Dolphin includes or links code of the following third-party software projects:
|
||||
[LGPLv2.1+](http://bochs.sourceforge.net/cgi-bin/lxr/source/COPYING)
|
||||
- [bzip2](https://www.sourceware.org/bzip2/):
|
||||
[bzip2 license](https://www.sourceware.org/git/?p=bzip2.git;a=blob;f=LICENSE;hb=HEAD) (similar to 3-clause BSD)
|
||||
- [cpp-ipc](https://github.com/mutouyun/cpp-ipc):
|
||||
[MIT](https://github.com/mutouyun/cpp-ipc/blob/master/LICENSE)
|
||||
- [cubeb](https://github.com/kinetiknz/cubeb):
|
||||
[ISC](https://github.com/kinetiknz/cubeb/blob/master/LICENSE)
|
||||
- [Discord-RPC](https://github.com/discordapp/discord-rpc):
|
||||
|
||||
@ -797,6 +797,11 @@ if(UNIX)
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WIN32 OR LINUX)
|
||||
target_sources(core PRIVATE HW/EXI/BBA/IPC.cpp)
|
||||
target_link_libraries(core PRIVATE cpp-ipc::ipc)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
# Add precompiled header
|
||||
target_link_libraries(core PRIVATE use_pch)
|
||||
|
||||
101
Source/Core/Core/HW/EXI/BBA/IPC.cpp
Normal file
101
Source/Core/Core/HW/EXI/BBA/IPC.cpp
Normal file
@ -0,0 +1,101 @@
|
||||
// Copyright 2025 Dolphin Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include <libipc/ipc.h>
|
||||
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Core/HW/EXI/EXI_DeviceEthernet.h"
|
||||
|
||||
namespace ExpansionInterface
|
||||
{
|
||||
|
||||
bool CEXIETHERNET::IPCBBAInterface::Activate()
|
||||
{
|
||||
if (m_active)
|
||||
return false;
|
||||
|
||||
m_channel.connect("dolphin-emu-bba-ipc", ipc::sender | ipc::receiver);
|
||||
if (!m_channel.valid())
|
||||
return false;
|
||||
|
||||
m_read_enabled.Clear();
|
||||
m_read_thread_shutdown.Clear();
|
||||
|
||||
m_active = true;
|
||||
|
||||
return RecvInit();
|
||||
}
|
||||
|
||||
void CEXIETHERNET::IPCBBAInterface::Deactivate()
|
||||
{
|
||||
m_read_enabled.Clear();
|
||||
m_read_thread_shutdown.Set();
|
||||
|
||||
if (m_read_thread.joinable())
|
||||
{
|
||||
m_read_thread.join();
|
||||
}
|
||||
|
||||
m_channel.disconnect();
|
||||
|
||||
m_active = false;
|
||||
}
|
||||
|
||||
bool CEXIETHERNET::IPCBBAInterface::IsActivated()
|
||||
{
|
||||
return m_active;
|
||||
}
|
||||
|
||||
bool CEXIETHERNET::IPCBBAInterface::SendFrame(const u8* const frame, const u32 size)
|
||||
{
|
||||
if (!m_active)
|
||||
return false;
|
||||
|
||||
static constexpr u64 TIMEOUT_IN_MS{3000};
|
||||
if (!m_channel.send(frame, size, TIMEOUT_IN_MS))
|
||||
{
|
||||
ERROR_LOG_FMT(SP1, "Failed to send frame");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_eth_ref->SendComplete();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CEXIETHERNET::IPCBBAInterface::RecvInit()
|
||||
{
|
||||
m_read_thread = std::thread(&CEXIETHERNET::IPCBBAInterface::ReadThreadHandler, this);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CEXIETHERNET::IPCBBAInterface::RecvStart()
|
||||
{
|
||||
m_read_enabled.Set();
|
||||
}
|
||||
|
||||
void CEXIETHERNET::IPCBBAInterface::RecvStop()
|
||||
{
|
||||
m_read_enabled.Clear();
|
||||
}
|
||||
|
||||
void CEXIETHERNET::IPCBBAInterface::ReadThreadHandler()
|
||||
{
|
||||
while (!m_read_thread_shutdown.IsSet())
|
||||
{
|
||||
const ipc::buff_t buffer{m_channel.recv(50)};
|
||||
if (buffer.empty() || !m_read_enabled.IsSet())
|
||||
continue;
|
||||
|
||||
const u8* const frame{reinterpret_cast<const u8*>(buffer.data())};
|
||||
const u64 size{buffer.size()};
|
||||
|
||||
std::memcpy(m_eth_ref->mRecvBuffer.get(), frame, size);
|
||||
m_eth_ref->mRecvBufferLength = static_cast<u32>(size);
|
||||
m_eth_ref->RecvHandlePacket();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ExpansionInterface
|
||||
@ -160,6 +160,10 @@ std::unique_ptr<IEXIDevice> EXIDevice_Create(Core::System& system, const EXIDevi
|
||||
result = std::make_unique<CEXIETHERNET>(system, BBADeviceType::BuiltIn);
|
||||
break;
|
||||
|
||||
case EXIDeviceType::EthernetIPC:
|
||||
result = std::make_unique<CEXIETHERNET>(system, BBADeviceType::IPC);
|
||||
break;
|
||||
|
||||
case EXIDeviceType::ModemTapServer:
|
||||
result = std::make_unique<CEXIModem>(system, ModemDeviceType::TAPSERVER);
|
||||
break;
|
||||
|
||||
@ -40,6 +40,7 @@ enum class EXIDeviceType : int
|
||||
EthernetTapServer,
|
||||
EthernetBuiltIn,
|
||||
ModemTapServer,
|
||||
EthernetIPC,
|
||||
None = 0xFF
|
||||
};
|
||||
|
||||
@ -86,7 +87,7 @@ std::unique_ptr<IEXIDevice> EXIDevice_Create(Core::System& system, EXIDeviceType
|
||||
|
||||
template <>
|
||||
struct fmt::formatter<ExpansionInterface::EXIDeviceType>
|
||||
: EnumFormatter<ExpansionInterface::EXIDeviceType::ModemTapServer>
|
||||
: EnumFormatter<ExpansionInterface::EXIDeviceType::EthernetIPC>
|
||||
{
|
||||
static constexpr array_type names = {
|
||||
_trans("Dummy"),
|
||||
@ -104,6 +105,7 @@ struct fmt::formatter<ExpansionInterface::EXIDeviceType>
|
||||
_trans("Broadband Adapter (tapserver)"),
|
||||
_trans("Broadband Adapter (HLE)"),
|
||||
_trans("Modem Adapter (tapserver)"),
|
||||
_trans("Broadband Adapter (IPC)"),
|
||||
};
|
||||
|
||||
constexpr formatter() : EnumFormatter(names) {}
|
||||
|
||||
@ -60,6 +60,11 @@ CEXIETHERNET::CEXIETHERNET(Core::System& system, BBADeviceType type) : IEXIDevic
|
||||
this, Config::Get(Config::MAIN_BBA_BUILTIN_DNS), Config::Get(Config::MAIN_BBA_BUILTIN_IP));
|
||||
INFO_LOG_FMT(SP1, "Created Built in network interface.");
|
||||
break;
|
||||
case BBADeviceType::IPC:
|
||||
mac_addr = Common::GenerateMacAddress(Common::MACConsumer::BBA); // Always randomize
|
||||
m_network_interface = std::make_unique<IPCBBAInterface>(this);
|
||||
INFO_LOG_FMT(SP1, "Created IPC-based network interface.");
|
||||
break;
|
||||
case BBADeviceType::XLINK:
|
||||
// TODO start BBA with network link down, bring it up after "connected" response from XLink
|
||||
|
||||
|
||||
@ -15,6 +15,9 @@
|
||||
#endif
|
||||
|
||||
#include <SFML/Network.hpp>
|
||||
#if defined(WIN32) || (defined(__linux__) && !defined(__ANDROID__))
|
||||
#include <libipc/ipc.h>
|
||||
#endif
|
||||
|
||||
#include "Common/Flag.h"
|
||||
#include "Common/Network.h"
|
||||
@ -210,6 +213,7 @@ enum class BBADeviceType
|
||||
XLINK,
|
||||
TAPSERVER,
|
||||
BuiltIn,
|
||||
IPC,
|
||||
};
|
||||
|
||||
class CEXIETHERNET : public IEXIDevice
|
||||
@ -474,6 +478,43 @@ private:
|
||||
const Common::MACAddress& ResolveAddress(u32 inet_ip);
|
||||
};
|
||||
|
||||
class IPCBBAInterface : public NetworkInterface
|
||||
{
|
||||
public:
|
||||
explicit IPCBBAInterface(CEXIETHERNET* const eth_ref) : NetworkInterface(eth_ref) {}
|
||||
|
||||
#if defined(WIN32) || (defined(__linux__) && !defined(__ANDROID__))
|
||||
|
||||
bool Activate() override;
|
||||
void Deactivate() override;
|
||||
bool IsActivated() override;
|
||||
bool SendFrame(const u8* frame, u32 size) override;
|
||||
bool RecvInit() override;
|
||||
void RecvStart() override;
|
||||
void RecvStop() override;
|
||||
|
||||
private:
|
||||
void ReadThreadHandler();
|
||||
|
||||
bool m_active{};
|
||||
ipc::channel m_channel;
|
||||
std::thread m_read_thread;
|
||||
Common::Flag m_read_enabled;
|
||||
Common::Flag m_read_thread_shutdown;
|
||||
|
||||
#else
|
||||
|
||||
bool Activate() override { return false; }
|
||||
void Deactivate() override {}
|
||||
bool IsActivated() override { return false; }
|
||||
bool SendFrame(const u8* const frame, const u32 size) override { return false; }
|
||||
bool RecvInit() override { return false; }
|
||||
void RecvStart() override {}
|
||||
void RecvStop() override {}
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
std::unique_ptr<NetworkInterface> m_network_interface;
|
||||
|
||||
std::unique_ptr<u8[]> mRecvBuffer;
|
||||
|
||||
@ -962,6 +962,7 @@
|
||||
<ClCompile Include="Core\HW\DVD\DVDThread.cpp" />
|
||||
<ClCompile Include="Core\HW\DVD\FileMonitor.cpp" />
|
||||
<ClCompile Include="Core\HW\EXI\BBA\BuiltIn.cpp" />
|
||||
<ClCompile Include="Core\HW\EXI\BBA\IPC.cpp" />
|
||||
<ClCompile Include="Core\HW\EXI\BBA\TAP_Win32.cpp" />
|
||||
<ClCompile Include="Core\HW\EXI\BBA\TAPServerConnection.cpp" />
|
||||
<ClCompile Include="Core\HW\EXI\BBA\TAPServerBBA.cpp" />
|
||||
|
||||
@ -30,6 +30,7 @@
|
||||
</ItemGroup>
|
||||
<Import Project="$(ExternalsDir)Bochs_disasm\exports.props" />
|
||||
<Import Project="$(ExternalsDir)bzip2\exports.props" />
|
||||
<Import Project="$(ExternalsDir)cpp-ipc\exports.props" />
|
||||
<Import Project="$(ExternalsDir)cpp-optparse\exports.props" />
|
||||
<Import Project="$(ExternalsDir)cubeb\exports.props" />
|
||||
<Import Project="$(ExternalsDir)curl\exports.props" />
|
||||
|
||||
@ -143,6 +143,9 @@ void GameCubePane::CreateWidgets()
|
||||
EXIDeviceType::EthernetXLink,
|
||||
EXIDeviceType::EthernetTapServer,
|
||||
EXIDeviceType::EthernetBuiltIn,
|
||||
#if defined(WIN32) || (defined(__linux__) && !defined(__ANDROID__))
|
||||
EXIDeviceType::EthernetIPC,
|
||||
#endif
|
||||
EXIDeviceType::ModemTapServer,
|
||||
})
|
||||
{
|
||||
|
||||
@ -49,6 +49,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curl", "..\Externals\curl\c
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glslang", "..\Externals\glslang\glslang.vcxproj", "{D178061B-84D3-44F9-BEED-EFD18D9033F0}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-ipc", "..\Externals\cpp-ipc\cpp-ipc.vcxproj", "{7299DDD3-BBEC-4027-AF30-8DACC5415F96}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-optparse", "..\Externals\cpp-optparse\cpp-optparse.vcxproj", "{C636D9D1-82FE-42B5-9987-63B7D4836341}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cubeb", "..\Externals\cubeb\msvc\cubeb.vcxproj", "{8EA11166-6512-44FC-B7A5-A4D1ECC81170}"
|
||||
@ -271,6 +273,14 @@ Global
|
||||
{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
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Debug|x64.Build.0 = Debug|x64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.Release|x64.ActiveCfg = Release|x64
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96}.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
|
||||
@ -456,6 +466,7 @@ Global
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
{BB00605C-125F-4A21-B33B-7BF418322DCB} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
{D178061B-84D3-44F9-BEED-EFD18D9033F0} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
{7299DDD3-BBEC-4027-AF30-8DACC5415F96} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
{C636D9D1-82FE-42B5-9987-63B7D4836341} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
{8EA11166-6512-44FC-B7A5-A4D1ECC81170} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
{38FEE76F-F347-484B-949C-B4649381CFFB} = {87ADDFF9-5768-4DA2-A33B-2477593D6677}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user