aboutsummaryrefslogtreecommitdiff
path: root/patches/fake-08/0001-fix-resume-state.patch
blob: b3d73bc4f4bd12005b927bb1c79ae211f35b6a5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
diff --git a/platform/libretro/libretro.cpp b/platform/libretro/libretro.cpp
index 927ea8d4b8d1658a1d7521fe7e9abcbdede0ba5f..63a43f3f065344cdf45e0b10e5c9c089736695f2 100644
--- a/platform/libretro/libretro.cpp
+++ b/platform/libretro/libretro.cpp
@@ -82,6 +82,46 @@ EXPORT void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_
 EXPORT void retro_set_input_poll(retro_input_poll_t cb) { input_poll_cb = cb; }
 EXPORT void retro_set_input_state(retro_input_state_t cb) { input_state_cb = cb; }
 
+
+static int frames = 0;
+static int defer_frames = 2;
+static void* deferred_data = NULL;
+static size_t deferred_size = 0;
+
+static void free_deferred_data(void) {
+	if (deferred_size) {
+		if (log_cb) log_cb(RETRO_LOG_INFO, "Freed deferred save state.\n");
+		free(deferred_data);
+		deferred_data = NULL;
+		deferred_size = 0;
+	}
+}
+
+static void defer_unserialize(const void *data, size_t size) {
+	free_deferred_data();
+
+	if (data==NULL || size<=0) return;
+
+	if (log_cb) log_cb(RETRO_LOG_INFO, "Deferred save state load.\n");
+
+	deferred_data = malloc(size);
+	memcpy(deferred_data, data, size);
+	deferred_size = size;
+}
+static void update_deferred(void) {
+	frames += 1;
+
+	if (frames<defer_frames) return;
+
+	if (deferred_size==0) return;
+
+	retro_unserialize(deferred_data, deferred_size);
+
+	if (log_cb) log_cb(RETRO_LOG_INFO, "Loaded deferred save state.\n");
+
+	free_deferred_data();
+}
+
 EXPORT void retro_init()
 {
     retro_log_callback log;
@@ -132,6 +172,8 @@ EXPORT void retro_deinit()
     if (log_cb) {
         log_cb(RETRO_LOG_INFO, "Retro deinit called. tearing down\n");
     }
+	free_deferred_data();
+	
     //delete things created in init
     _vm->CloseCart();
     _host->oneTimeCleanup();
@@ -205,6 +247,8 @@ int flip = 0;
 
 EXPORT void retro_run()
 {
+	if (frames<defer_frames) update_deferred();
+	
     //TODO: improve this so slower hardware can play 30fps games at full speed
     if (_vm->getTargetFps() == 60 || frame % 2 == 0)
     {
@@ -396,6 +440,11 @@ EXPORT bool retro_serialize(void *data, size_t size)
 
 EXPORT bool retro_unserialize(const void *data, size_t size)
 {
+	if (frames<defer_frames) {
+		defer_unserialize(data,size);
+		return true;
+	}
+	
     if (log_cb) {
         log_cb(RETRO_LOG_INFO, "lua deserialize\n");
     }