2013-07-22 04:21:56 -04:00
|
|
|
// Copyright 2013 Dolphin Emulator Project
|
2021-07-05 03:22:19 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2014-02-10 13:54:46 -05:00
|
|
|
#pragma once
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2015-08-16 00:08:09 -04:00
|
|
|
#include <array>
|
2021-07-04 13:33:58 +02:00
|
|
|
#include <string>
|
2015-05-08 17:28:03 -04:00
|
|
|
#include <vector>
|
2021-03-06 18:58:19 +01:00
|
|
|
|
2014-09-07 20:06:58 -05:00
|
|
|
#include "Common/CommonTypes.h"
|
2021-03-06 18:58:19 +01:00
|
|
|
#include "Core/Config/SYSCONFSettings.h"
|
2017-01-20 15:33:43 -05:00
|
|
|
#include "Core/HW/EXI/EXI_Device.h"
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2021-03-06 18:58:19 +01:00
|
|
|
namespace DiscIO
|
|
|
|
{
|
|
|
|
enum class Region;
|
|
|
|
}
|
2018-07-04 17:01:50 -04:00
|
|
|
namespace IOS::HLE::FS
|
|
|
|
{
|
|
|
|
class FileSystem;
|
|
|
|
}
|
2018-06-15 08:11:18 -04:00
|
|
|
namespace PowerPC
|
|
|
|
{
|
|
|
|
enum class CPUCore;
|
|
|
|
}
|
|
|
|
|
2018-07-06 19:39:42 -04:00
|
|
|
namespace NetPlay
|
|
|
|
{
|
2013-07-22 04:21:56 -04:00
|
|
|
struct NetSettings
|
|
|
|
{
|
2013-08-18 01:43:49 -04:00
|
|
|
bool m_CPUthread;
|
2018-06-15 08:11:18 -04:00
|
|
|
PowerPC::CPUCore m_CPUcore;
|
2016-07-04 17:48:04 -06:00
|
|
|
bool m_EnableCheats;
|
2015-06-14 13:59:41 +02:00
|
|
|
int m_SelectedLanguage;
|
2019-06-30 11:48:49 +02:00
|
|
|
bool m_OverrideRegionSettings;
|
2013-07-22 04:21:56 -04:00
|
|
|
bool m_DSPHLE;
|
|
|
|
bool m_DSPEnableJIT;
|
|
|
|
bool m_WriteToMemcard;
|
2021-05-20 05:32:07 -04:00
|
|
|
bool m_RAMOverrideEnable;
|
2021-03-06 18:58:19 +01:00
|
|
|
u32 m_Mem1Size;
|
|
|
|
u32 m_Mem2Size;
|
|
|
|
DiscIO::Region m_FallbackRegion;
|
2021-05-20 05:32:07 -04:00
|
|
|
bool m_AllowSDWrites;
|
2016-12-23 20:37:23 -05:00
|
|
|
bool m_CopyWiiSave;
|
2014-12-31 10:24:14 -08:00
|
|
|
bool m_OCEnable;
|
|
|
|
float m_OCFactor;
|
2019-04-01 09:14:28 -04:00
|
|
|
std::array<ExpansionInterface::TEXIDevices, 3> m_EXIDevice;
|
2021-03-06 18:58:19 +01:00
|
|
|
|
|
|
|
std::array<u32, Config::SYSCONF_SETTINGS.size()> m_SYSCONFSettings;
|
|
|
|
|
2018-07-19 18:10:37 -04:00
|
|
|
bool m_EFBAccessEnable;
|
|
|
|
bool m_BBoxEnable;
|
|
|
|
bool m_ForceProgressive;
|
|
|
|
bool m_EFBToTextureEnable;
|
|
|
|
bool m_XFBToTextureEnable;
|
|
|
|
bool m_DisableCopyToVRAM;
|
|
|
|
bool m_ImmediateXFBEnable;
|
|
|
|
bool m_EFBEmulateFormatChanges;
|
|
|
|
int m_SafeTextureCacheColorSamples;
|
|
|
|
bool m_PerfQueriesEnable;
|
|
|
|
bool m_FPRF;
|
|
|
|
bool m_AccurateNaNs;
|
2020-07-05 14:15:33 -07:00
|
|
|
bool m_DisableICache;
|
2018-07-19 18:10:37 -04:00
|
|
|
bool m_SyncOnSkipIdle;
|
|
|
|
bool m_SyncGPU;
|
|
|
|
int m_SyncGpuMaxDistance;
|
|
|
|
int m_SyncGpuMinDistance;
|
|
|
|
float m_SyncGpuOverclock;
|
|
|
|
bool m_JITFollowBranch;
|
|
|
|
bool m_FastDiscSpeed;
|
|
|
|
bool m_MMU;
|
|
|
|
bool m_Fastmem;
|
|
|
|
bool m_SkipIPL;
|
|
|
|
bool m_LoadIPLDump;
|
|
|
|
bool m_VertexRounding;
|
|
|
|
int m_InternalResolution;
|
|
|
|
bool m_EFBScaledCopy;
|
|
|
|
bool m_FastDepthCalc;
|
|
|
|
bool m_EnablePixelLighting;
|
|
|
|
bool m_WidescreenHack;
|
|
|
|
bool m_ForceFiltering;
|
|
|
|
int m_MaxAnisotropy;
|
|
|
|
bool m_ForceTrueColor;
|
|
|
|
bool m_DisableCopyFilter;
|
|
|
|
bool m_DisableFog;
|
|
|
|
bool m_ArbitraryMipmapDetection;
|
|
|
|
float m_ArbitraryMipmapDetectionThreshold;
|
|
|
|
bool m_EnableGPUTextureDecoding;
|
2018-11-12 20:45:12 -05:00
|
|
|
bool m_DeferEFBCopies;
|
2021-06-06 19:02:07 +02:00
|
|
|
int m_EFBAccessTileSize;
|
2019-03-28 00:38:52 -04:00
|
|
|
bool m_EFBAccessDeferInvalidation;
|
2021-03-06 18:58:19 +01:00
|
|
|
|
2018-07-19 18:10:37 -04:00
|
|
|
bool m_StrictSettingsSync;
|
2018-07-04 17:01:50 -04:00
|
|
|
bool m_SyncSaveData;
|
2018-10-04 18:49:41 -04:00
|
|
|
bool m_SyncCodes;
|
2018-07-04 17:01:50 -04:00
|
|
|
std::string m_SaveDataRegion;
|
2018-10-02 09:16:12 -04:00
|
|
|
bool m_SyncAllWiiSaves;
|
2018-11-22 06:52:48 -05:00
|
|
|
std::array<int, 4> m_WiimoteExtension;
|
2019-04-02 08:08:27 -04:00
|
|
|
bool m_GolfMode;
|
NetPlay/Jit64: Avoid using software FMA
When I added the software FMA path in 2c38d64 and made us use
it when determinism is enabled, I was assuming that either the
performance impact of software FMA wouldn't be too large or CPUs
that were too old to have FMA instructions were too slow to run
Dolphin well anyway. This was wrong. To give an example, the
netplay performance went from 60 FPS to 30 FPS in one case.
This change makes netplay clients negotiate whether FMA should
be used. If all clients use an x64 CPU that supports FMA, or
AArch64, then FMA is enabled, and otherwise FMA is disabled.
In other words, we sacrifice accuracy if needed to avoid massive
slowdown, but not otherwise. When not using netplay, whether to
enable FMA is simply based on whether the host CPU supports it.
The only remaining case where the software FMA path gets used
under normal circumstances is when an input recording is created
on a CPU with FMA support and then played back on a CPU without.
This is not an especially common scenario (though it can happen),
and TASers are generally less picky about performance and more
picky about accuracy than other users anyway.
With this change, FMA desyncs are avoided between AArch64 and
modern x64 CPUs (unlike before 2c38d64), but we do get FMA
desyncs between AArch64 and old x64 CPUs (like before 2c38d64).
This desync can be avoided by adding a non-FMA path to JitArm64 as
an option, which I will wait with for another pull request so that
we can get the performance regression fixed as quickly as possible.
https://bugs.dolphin-emu.org/issues/12542
2021-06-09 20:16:41 +02:00
|
|
|
bool m_UseFMA;
|
2021-07-04 13:33:58 +02:00
|
|
|
bool m_HideRemoteGBAs;
|
2019-04-02 08:08:27 -04:00
|
|
|
|
|
|
|
// These aren't sent over the network directly
|
2018-07-04 17:01:50 -04:00
|
|
|
bool m_IsHosting;
|
NetPlay host input authority mode
Currently, each player buffers their own inputs and sends them to the
host. The host then relays those inputs to everyone else. Every player
waits on inputs from all players to be buffered before continuing. What
this means is all clients run in lockstep, and the total latency of
inputs cannot be lower than the sum of the 2 highest client ping times
in the game (in 3+ player sessions with people across the world, the
latency can be very high).
Host input authority mode changes it so players no longer buffer their
own inputs, and only send them to the host. The host stores only the
most recent input received from a player. The host then sends inputs
for all pads at the SI poll interval, similar to the existing code. If
a player sends inputs to slowly, their last received input is simply
sent again. If they send too quickly, inputs are dropped. This means
that the host has full control over what inputs are actually read by
the game, hence the name of the mode. Also, because the rate at which
inputs are received by SI is decoupled from the rate at which players
are sending inputs, clients are no longer dependent on each other. They
only care what the host is doing. This means that they can set their
buffer individually based on their latency to the host, rather than the
highest latency between any 2 players, allowing someone with lower ping
to the host to have less latency than someone else.
This is a catch to this: as a necessity of how the host's input sending
works, the host has 0 latency. There isn't a good way to fix this, as
input delay is now solely dependent on the real latency to the host's
server. Having differing latency between players would be considered
unfair for competitive play, but for casual play we don't really care.
For this reason though, combined with the potential for a few inputs to
be dropped on a bad connection, the old mode will remain and this new
mode is entirely optional.
2018-08-24 04:17:18 -04:00
|
|
|
bool m_HostInputAuthority;
|
2021-07-04 13:33:58 +02:00
|
|
|
std::array<std::string, 4> m_GBARomPaths;
|
2013-07-22 04:21:56 -04:00
|
|
|
};
|
|
|
|
|
2017-08-07 00:22:33 -07:00
|
|
|
struct NetTraversalConfig
|
|
|
|
{
|
|
|
|
NetTraversalConfig() = default;
|
|
|
|
NetTraversalConfig(bool use_traversal_, std::string traversal_host_, u16 traversal_port_)
|
|
|
|
: use_traversal{use_traversal_}, traversal_host{std::move(traversal_host_)},
|
|
|
|
traversal_port{traversal_port_}
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool use_traversal = false;
|
|
|
|
std::string traversal_host;
|
|
|
|
u16 traversal_port = 0;
|
|
|
|
};
|
|
|
|
|
2013-07-22 04:21:56 -04:00
|
|
|
// messages
|
|
|
|
enum
|
|
|
|
{
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_PLAYER_JOIN = 0x10,
|
|
|
|
NP_MSG_PLAYER_LEAVE = 0x11,
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_CHAT_MESSAGE = 0x30,
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2018-10-18 04:33:05 -04:00
|
|
|
NP_MSG_CHUNKED_DATA_START = 0x40,
|
|
|
|
NP_MSG_CHUNKED_DATA_END = 0x41,
|
|
|
|
NP_MSG_CHUNKED_DATA_PAYLOAD = 0x42,
|
|
|
|
NP_MSG_CHUNKED_DATA_PROGRESS = 0x43,
|
|
|
|
NP_MSG_CHUNKED_DATA_COMPLETE = 0x44,
|
2019-03-28 02:32:06 -04:00
|
|
|
NP_MSG_CHUNKED_DATA_ABORT = 0x45,
|
2018-10-18 04:33:05 -04:00
|
|
|
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_PAD_DATA = 0x60,
|
|
|
|
NP_MSG_PAD_MAPPING = 0x61,
|
|
|
|
NP_MSG_PAD_BUFFER = 0x62,
|
2019-04-01 22:36:48 -04:00
|
|
|
NP_MSG_PAD_HOST_DATA = 0x63,
|
2021-07-04 13:33:58 +02:00
|
|
|
NP_MSG_GBA_CONFIG = 0x64,
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_WIIMOTE_DATA = 0x70,
|
|
|
|
NP_MSG_WIIMOTE_MAPPING = 0x71,
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2019-04-02 08:08:27 -04:00
|
|
|
NP_MSG_GOLF_REQUEST = 0x90,
|
|
|
|
NP_MSG_GOLF_SWITCH = 0x91,
|
|
|
|
NP_MSG_GOLF_ACQUIRE = 0x92,
|
|
|
|
NP_MSG_GOLF_RELEASE = 0x93,
|
|
|
|
NP_MSG_GOLF_PREPARE = 0x94,
|
|
|
|
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_START_GAME = 0xA0,
|
|
|
|
NP_MSG_CHANGE_GAME = 0xA1,
|
|
|
|
NP_MSG_STOP_GAME = 0xA2,
|
|
|
|
NP_MSG_DISABLE_GAME = 0xA3,
|
2016-07-10 10:13:34 +02:00
|
|
|
NP_MSG_GAME_STATUS = 0xA4,
|
NetPlay/Jit64: Avoid using software FMA
When I added the software FMA path in 2c38d64 and made us use
it when determinism is enabled, I was assuming that either the
performance impact of software FMA wouldn't be too large or CPUs
that were too old to have FMA instructions were too slow to run
Dolphin well anyway. This was wrong. To give an example, the
netplay performance went from 60 FPS to 30 FPS in one case.
This change makes netplay clients negotiate whether FMA should
be used. If all clients use an x64 CPU that supports FMA, or
AArch64, then FMA is enabled, and otherwise FMA is disabled.
In other words, we sacrifice accuracy if needed to avoid massive
slowdown, but not otherwise. When not using netplay, whether to
enable FMA is simply based on whether the host CPU supports it.
The only remaining case where the software FMA path gets used
under normal circumstances is when an input recording is created
on a CPU with FMA support and then played back on a CPU without.
This is not an especially common scenario (though it can happen),
and TASers are generally less picky about performance and more
picky about accuracy than other users anyway.
With this change, FMA desyncs are avoided between AArch64 and
modern x64 CPUs (unlike before 2c38d64), but we do get FMA
desyncs between AArch64 and old x64 CPUs (like before 2c38d64).
This desync can be avoided by adding a non-FMA path to JitArm64 as
an option, which I will wait with for another pull request so that
we can get the performance regression fixed as quickly as possible.
https://bugs.dolphin-emu.org/issues/12542
2021-06-09 20:16:41 +02:00
|
|
|
NP_MSG_CLIENT_CAPABILITIES = 0xA5,
|
NetPlay host input authority mode
Currently, each player buffers their own inputs and sends them to the
host. The host then relays those inputs to everyone else. Every player
waits on inputs from all players to be buffered before continuing. What
this means is all clients run in lockstep, and the total latency of
inputs cannot be lower than the sum of the 2 highest client ping times
in the game (in 3+ player sessions with people across the world, the
latency can be very high).
Host input authority mode changes it so players no longer buffer their
own inputs, and only send them to the host. The host stores only the
most recent input received from a player. The host then sends inputs
for all pads at the SI poll interval, similar to the existing code. If
a player sends inputs to slowly, their last received input is simply
sent again. If they send too quickly, inputs are dropped. This means
that the host has full control over what inputs are actually read by
the game, hence the name of the mode. Also, because the rate at which
inputs are received by SI is decoupled from the rate at which players
are sending inputs, clients are no longer dependent on each other. They
only care what the host is doing. This means that they can set their
buffer individually based on their latency to the host, rather than the
highest latency between any 2 players, allowing someone with lower ping
to the host to have less latency than someone else.
This is a catch to this: as a necessity of how the host's input sending
works, the host has 0 latency. There isn't a good way to fix this, as
input delay is now solely dependent on the real latency to the host's
server. Having differing latency between players would be considered
unfair for competitive play, but for casual play we don't really care.
For this reason though, combined with the potential for a few inputs to
be dropped on a bad connection, the old mode will remain and this new
mode is entirely optional.
2018-08-24 04:17:18 -04:00
|
|
|
NP_MSG_HOST_INPUT_AUTHORITY = 0xA6,
|
2018-11-10 22:37:49 -05:00
|
|
|
NP_MSG_POWER_BUTTON = 0xA7,
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2015-03-08 06:50:47 -04:00
|
|
|
NP_MSG_TIMEBASE = 0xB0,
|
|
|
|
NP_MSG_DESYNC_DETECTED = 0xB1,
|
|
|
|
|
2016-07-14 00:45:38 +02:00
|
|
|
NP_MSG_COMPUTE_MD5 = 0xC0,
|
|
|
|
NP_MSG_MD5_PROGRESS = 0xC1,
|
|
|
|
NP_MSG_MD5_RESULT = 0xC2,
|
|
|
|
NP_MSG_MD5_ABORT = 0xC3,
|
|
|
|
NP_MSG_MD5_ERROR = 0xC4,
|
|
|
|
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_READY = 0xD0,
|
|
|
|
NP_MSG_NOT_READY = 0xD1,
|
2013-07-22 04:21:56 -04:00
|
|
|
|
2015-02-02 01:56:53 -08:00
|
|
|
NP_MSG_PING = 0xE0,
|
|
|
|
NP_MSG_PONG = 0xE1,
|
2013-08-05 05:50:26 -04:00
|
|
|
NP_MSG_PLAYER_PING_DATA = 0xE2,
|
2015-06-14 13:59:41 +02:00
|
|
|
|
|
|
|
NP_MSG_SYNC_GC_SRAM = 0xF0,
|
2018-07-04 17:01:50 -04:00
|
|
|
NP_MSG_SYNC_SAVE_DATA = 0xF1,
|
2018-10-04 18:49:41 -04:00
|
|
|
NP_MSG_SYNC_CODES = 0xF2,
|
2013-07-22 04:21:56 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
2015-02-02 01:56:53 -08:00
|
|
|
CON_ERR_SERVER_FULL = 1,
|
|
|
|
CON_ERR_GAME_RUNNING = 2,
|
2018-11-21 00:15:44 -05:00
|
|
|
CON_ERR_VERSION_MISMATCH = 3,
|
|
|
|
CON_ERR_NAME_TOO_LONG = 4
|
2013-07-22 04:21:56 -04:00
|
|
|
};
|
|
|
|
|
2018-07-04 17:01:50 -04:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
SYNC_SAVE_DATA_NOTIFY = 0,
|
|
|
|
SYNC_SAVE_DATA_SUCCESS = 1,
|
|
|
|
SYNC_SAVE_DATA_FAILURE = 2,
|
|
|
|
SYNC_SAVE_DATA_RAW = 3,
|
|
|
|
SYNC_SAVE_DATA_GCI = 4,
|
2021-07-04 13:33:58 +02:00
|
|
|
SYNC_SAVE_DATA_WII = 5,
|
|
|
|
SYNC_SAVE_DATA_GBA = 6
|
2018-07-04 17:01:50 -04:00
|
|
|
};
|
|
|
|
|
2018-10-04 18:49:41 -04:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
SYNC_CODES_NOTIFY = 0,
|
|
|
|
SYNC_CODES_NOTIFY_GECKO = 1,
|
|
|
|
SYNC_CODES_NOTIFY_AR = 2,
|
|
|
|
SYNC_CODES_DATA_GECKO = 3,
|
|
|
|
SYNC_CODES_DATA_AR = 4,
|
|
|
|
SYNC_CODES_SUCCESS = 5,
|
|
|
|
SYNC_CODES_FAILURE = 6,
|
|
|
|
};
|
|
|
|
|
2018-11-21 00:15:44 -05:00
|
|
|
constexpr u32 MAX_NAME_LENGTH = 30;
|
2018-10-18 04:33:05 -04:00
|
|
|
constexpr size_t CHUNKED_DATA_UNIT_SIZE = 16384;
|
2021-05-28 20:53:02 -04:00
|
|
|
|
|
|
|
enum : u8
|
|
|
|
{
|
|
|
|
DEFAULT_CHANNEL,
|
|
|
|
CHUNKED_DATA_CHANNEL,
|
|
|
|
CHANNEL_COUNT
|
|
|
|
};
|
2018-07-04 17:01:50 -04:00
|
|
|
|
2020-09-27 12:36:19 -05:00
|
|
|
struct WiimoteInput
|
|
|
|
{
|
|
|
|
u8 report_id;
|
|
|
|
std::vector<u8> data;
|
|
|
|
};
|
2015-08-16 00:00:59 -04:00
|
|
|
using MessageId = u8;
|
|
|
|
using PlayerId = u8;
|
|
|
|
using FrameNum = u32;
|
2018-11-19 05:30:39 -05:00
|
|
|
using PadIndex = s8;
|
|
|
|
using PadMappingArray = std::array<PlayerId, 4>;
|
2021-07-04 13:33:58 +02:00
|
|
|
struct GBAConfig
|
|
|
|
{
|
|
|
|
bool enabled;
|
|
|
|
bool has_rom;
|
|
|
|
std::string title;
|
|
|
|
std::array<u8, 20> hash;
|
|
|
|
};
|
|
|
|
using GBAConfigArray = std::array<GBAConfig, 4>;
|
|
|
|
|
|
|
|
struct PadDetails
|
|
|
|
{
|
|
|
|
std::string player_name;
|
|
|
|
bool is_local;
|
|
|
|
int local_pad;
|
|
|
|
bool hide_gba;
|
|
|
|
};
|
2015-08-16 00:00:59 -04:00
|
|
|
|
2021-07-04 13:33:58 +02:00
|
|
|
std::string GetPlayerMappingString(PlayerId pid, const PadMappingArray& pad_map,
|
|
|
|
const GBAConfigArray& gba_config,
|
|
|
|
const PadMappingArray& wiimote_map);
|
2013-09-07 00:27:35 -04:00
|
|
|
bool IsNetPlayRunning();
|
2018-07-09 15:52:31 -04:00
|
|
|
// Precondition: A netplay client instance must be present. In other words,
|
|
|
|
// IsNetPlayRunning() must be true before calling this.
|
|
|
|
const NetSettings& GetNetSettings();
|
2018-07-04 17:01:50 -04:00
|
|
|
IOS::HLE::FS::FileSystem* GetWiiSyncFS();
|
2018-10-02 09:16:12 -04:00
|
|
|
const std::vector<u64>& GetWiiSyncTitles();
|
|
|
|
void SetWiiSyncData(std::unique_ptr<IOS::HLE::FS::FileSystem> fs, const std::vector<u64>& titles);
|
|
|
|
void ClearWiiSyncData();
|
NetPlay host input authority mode
Currently, each player buffers their own inputs and sends them to the
host. The host then relays those inputs to everyone else. Every player
waits on inputs from all players to be buffered before continuing. What
this means is all clients run in lockstep, and the total latency of
inputs cannot be lower than the sum of the 2 highest client ping times
in the game (in 3+ player sessions with people across the world, the
latency can be very high).
Host input authority mode changes it so players no longer buffer their
own inputs, and only send them to the host. The host stores only the
most recent input received from a player. The host then sends inputs
for all pads at the SI poll interval, similar to the existing code. If
a player sends inputs to slowly, their last received input is simply
sent again. If they send too quickly, inputs are dropped. This means
that the host has full control over what inputs are actually read by
the game, hence the name of the mode. Also, because the rate at which
inputs are received by SI is decoupled from the rate at which players
are sending inputs, clients are no longer dependent on each other. They
only care what the host is doing. This means that they can set their
buffer individually based on their latency to the host, rather than the
highest latency between any 2 players, allowing someone with lower ping
to the host to have less latency than someone else.
This is a catch to this: as a necessity of how the host's input sending
works, the host has 0 latency. There isn't a good way to fix this, as
input delay is now solely dependent on the real latency to the host's
server. Having differing latency between players would be considered
unfair for competitive play, but for casual play we don't really care.
For this reason though, combined with the potential for a few inputs to
be dropped on a bad connection, the old mode will remain and this new
mode is entirely optional.
2018-08-24 04:17:18 -04:00
|
|
|
void SetSIPollBatching(bool state);
|
2018-11-10 22:37:49 -05:00
|
|
|
void SendPowerButtonEvent();
|
2018-10-02 09:16:12 -04:00
|
|
|
bool IsSyncingAllWiiSaves();
|
2018-11-22 06:52:48 -05:00
|
|
|
void SetupWiimotes();
|
2021-07-04 13:33:58 +02:00
|
|
|
std::string GetGBASavePath(int pad_num);
|
|
|
|
PadDetails GetPadDetails(int pad_num);
|
2018-07-06 19:39:42 -04:00
|
|
|
} // namespace NetPlay
|