summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar MonsterDruide12021-06-18 16:32:46 +0200
committerGravatar MonsterDruide12021-09-18 23:22:20 +0200
commit4297d2fea2228ff4afe2a7c244fb8b3f1a97491a (patch)
tree25a1ce3a2d41bf9e066c7a57a441be65e282f16f /src/core
parentmain: TAS Playback state label (diff)
downloadyuzu-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.cpp2
-rw-r--r--src/core/hle/service/vi/vi.cpp3
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
35namespace Service::VI { 37namespace Service::VI {
36 38
37constexpr ResultCode ERR_OPERATION_FAILED{ErrorModule::VI, 1}; 39constexpr 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: {