diff options
| author | 2021-06-18 16:32:46 +0200 | |
|---|---|---|
| committer | 2021-09-18 23:22:20 +0200 | |
| commit | 4297d2fea2228ff4afe2a7c244fb8b3f1a97491a (patch) | |
| tree | 25a1ce3a2d41bf9e066c7a57a441be65e282f16f /src/core | |
| parent | main: TAS Playback state label (diff) | |
| download | yuzu-4297d2fea2228ff4afe2a7c244fb8b3f1a97491a.tar.gz yuzu-4297d2fea2228ff4afe2a7c244fb8b3f1a97491a.tar.xz yuzu-4297d2fea2228ff4afe2a7c244fb8b3f1a97491a.zip | |
core: Hacky TAS syncing & load pausing
To keep the TAS inputs synced to the game speed even through lag spikes and loading zones, deeper access is required.
First, the `TAS::UpdateThread` has to be executed exactly once per frame. This is done by connecting it to the service method the game calls to pass parameters to the GPU: `Service::VI::QueueBuffer`.
Second, the loading time of new subareas and/or kingdoms (SMO) can vary. To counteract that, the `CPU_BOOST_MODE` can be detected: In the `APM`-interface, the call to enabling/disabling the boost mode can be caught and forwarded to the TASing system, which can pause the script execution if neccessary and enabled in the settings.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/service/apm/apm_interface.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 3 |
2 files changed, 5 insertions, 0 deletions
diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp index e58bad083..724483107 100644 --- a/src/core/hle/service/apm/apm_interface.cpp +++ b/src/core/hle/service/apm/apm_interface.cpp | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | #include "common/settings.h" | ||
| 6 | #include "core/hle/ipc_helpers.h" | 7 | #include "core/hle/ipc_helpers.h" |
| 7 | #include "core/hle/service/apm/apm.h" | 8 | #include "core/hle/service/apm/apm.h" |
| 8 | #include "core/hle/service/apm/apm_controller.h" | 9 | #include "core/hle/service/apm/apm_controller.h" |
| @@ -120,6 +121,7 @@ void APM_Sys::SetCpuBoostMode(Kernel::HLERequestContext& ctx) { | |||
| 120 | 121 | ||
| 121 | LOG_DEBUG(Service_APM, "called, mode={:08X}", mode); | 122 | LOG_DEBUG(Service_APM, "called, mode={:08X}", mode); |
| 122 | 123 | ||
| 124 | Settings::values.is_cpu_boosted = (static_cast<u32>(mode) == 1); | ||
| 123 | controller.SetFromCpuBoostMode(mode); | 125 | controller.SetFromCpuBoostMode(mode); |
| 124 | 126 | ||
| 125 | IPC::ResponseBuilder rb{ctx, 2}; | 127 | IPC::ResponseBuilder rb{ctx, 2}; |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 8e8fc40ca..f4eac0bca 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | #include "core/hle/service/vi/vi_s.h" | 32 | #include "core/hle/service/vi/vi_s.h" |
| 33 | #include "core/hle/service/vi/vi_u.h" | 33 | #include "core/hle/service/vi/vi_u.h" |
| 34 | 34 | ||
| 35 | #include "input_common/tas/tas_input.h" | ||
| 36 | |||
| 35 | namespace Service::VI { | 37 | namespace Service::VI { |
| 36 | 38 | ||
| 37 | constexpr ResultCode ERR_OPERATION_FAILED{ErrorModule::VI, 1}; | 39 | constexpr ResultCode ERR_OPERATION_FAILED{ErrorModule::VI, 1}; |
| @@ -595,6 +597,7 @@ private: | |||
| 595 | 597 | ||
| 596 | IGBPQueueBufferResponseParcel response{1280, 720}; | 598 | IGBPQueueBufferResponseParcel response{1280, 720}; |
| 597 | ctx.WriteBuffer(response.Serialize()); | 599 | ctx.WriteBuffer(response.Serialize()); |
| 600 | Settings::values.input_subsystem->GetTas()->UpdateThread(); | ||
| 598 | break; | 601 | break; |
| 599 | } | 602 | } |
| 600 | case TransactionId::Query: { | 603 | case TransactionId::Query: { |