Mercurial > repos > blastem
comparison libblastem.c @ 2475:a634985b1df3
Fix some issues with libretro serialization
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 02 Mar 2024 15:33:14 -0800 |
parents | b9bec5771993 |
children | f4a471730ba4 |
comparison
equal
deleted
inserted
replaced
2474:b9bec5771993 | 2475:a634985b1df3 |
---|---|
192 RETRO_API size_t retro_serialize_size(void) | 192 RETRO_API size_t retro_serialize_size(void) |
193 { | 193 { |
194 if (!serialize_size_cache) { | 194 if (!serialize_size_cache) { |
195 uint8_t *tmp = current_system->serialize(current_system, &serialize_size_cache); | 195 uint8_t *tmp = current_system->serialize(current_system, &serialize_size_cache); |
196 free(tmp); | 196 free(tmp); |
197 //VDP serialization size can vary based on FIFO fullness | |
198 //add a little fudge factor here to ensure the returned size is always >= the actual size | |
199 serialize_size_cache += 64; | |
200 //We need to store the actual size saved too | |
201 serialize_size_cache += sizeof(size_t); | |
197 } | 202 } |
198 return serialize_size_cache; | 203 return serialize_size_cache; |
199 } | 204 } |
200 | 205 |
201 /* Serializes internal state. If failed, or size is lower than | 206 /* Serializes internal state. If failed, or size is lower than |
202 * retro_serialize_size(), it should return false, true otherwise. */ | 207 * retro_serialize_size(), it should return false, true otherwise. */ |
203 RETRO_API bool retro_serialize(void *data, size_t size) | 208 RETRO_API bool retro_serialize(void *data, size_t size) |
204 { | 209 { |
205 size_t actual_size; | 210 size_t *buffer = data; |
206 uint8_t *tmp = current_system->serialize(current_system, &actual_size); | 211 uint8_t *tmp = current_system->serialize(current_system, buffer); |
207 if (actual_size > size) { | 212 if (*buffer > size) { |
213 fprintf(stderr, "retro_serialize failed frontend size %d, actual size %d\n", (int)size, (int)*buffer); | |
208 free(tmp); | 214 free(tmp); |
209 return 0; | 215 return 0; |
210 } | 216 } |
211 memcpy(data, tmp, actual_size); | 217 memcpy(buffer + 1, tmp, *buffer); |
212 free(tmp); | 218 free(tmp); |
213 return 1; | 219 return 1; |
214 } | 220 } |
215 | 221 |
216 RETRO_API bool retro_unserialize(const void *data, size_t size) | 222 RETRO_API bool retro_unserialize(const void *data, size_t size) |
217 { | 223 { |
218 current_system->deserialize(current_system, (uint8_t *)data, size); | 224 const size_t *buffer = data; |
219 return 0; | 225 current_system->deserialize(current_system, (uint8_t *)(buffer + 1), *buffer); |
226 return 1; | |
220 } | 227 } |
221 | 228 |
222 RETRO_API void retro_cheat_reset(void) | 229 RETRO_API void retro_cheat_reset(void) |
223 { | 230 { |
224 } | 231 } |