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
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 }