summaryrefslogtreecommitdiff
path: root/libpcsxcore/misc.c
diff options
context:
space:
mode:
authorSND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2014-02-16 09:50:38 +0000
committerSND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2014-02-16 09:50:38 +0000
commitfe4b4c0f5672ba45c174b42fe3540029d9a5552a (patch)
tree13be88a7e99bb24112cea1a3535ca09bbd9a25e8 /libpcsxcore/misc.c
parent9bb4ff671b89d5f8d7605ce5e601c368b3cba673 (diff)
downloadpcsxr-fe4b4c0f5672ba45c174b42fe3540029d9a5552a.tar.gz
Optimized SaveStateGz: Core i5 2520M: from ~45ms to less than 5ms call avg. Now rewind feature should be usable even more lower end machines.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@89136 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore/misc.c')
-rwxr-xr-xlibpcsxcore/misc.c72
1 files changed, 43 insertions, 29 deletions
diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c
index 26e456cc..152123a4 100755
--- a/libpcsxcore/misc.c
+++ b/libpcsxcore/misc.c
@@ -25,6 +25,7 @@
#include "cdrom.h"
#include "mdec.h"
#include "ppf.h"
+#include <stddef.h>
char CdromId[10] = "";
char CdromLabel[33] = "";
@@ -581,10 +582,11 @@ int SaveStateMem(const u32 id) {
int fd = shm_open(name, O_CREAT | O_RDWR | O_TRUNC, 0666);
if (fd >= 0) {
- gzFile f = gzdopen(fd, "wb0R"); // Fast and no compression
+ gzFile f = gzdopen(fd, "wb0T"); // Fast and no compression
+ //gzbuffer(f, 64*1024);
+ //assert(gzdirect(f) == TRUE);
if (f != NULL) {
- long size;
- ret = SaveStateGz(f, &size);
+ ret = SaveStateGz(f, NULL);
//printf("Saved %s/%i (ID: %i SZ: %lik)\n", name, fd, id, size/1024);
} else {
SysMessage("GZ OPEN FAIL %i\n", errno );
@@ -617,6 +619,8 @@ int LoadStateMem(const u32 id) {
return ret;
}
+GPUFreeze_t* gpufP = NULL;
+SPUFreeze_t *spufP = NULL;
void CleanupMemSaveStates() {
char name[32];
u32 i;
@@ -627,6 +631,10 @@ void CleanupMemSaveStates() {
//break;
}
}
+ free(gpufP);
+ gpufP = NULL;
+ free(spufP);
+ spufP = NULL;
}
#else
int SaveStateMem(const u32 id) {return 0;}
@@ -635,18 +643,16 @@ void CleanupMemSaveStates() {}
#endif
int SaveStateGz(gzFile f, long* gzsize) {
- GPUFreeze_t *gpufP;
- SPUFreeze_t *spufP;
int Size;
- unsigned char pMemGpuPic[SZ_GPUPIC], pMemSpuT[16];
+ unsigned char pMemGpuPic[SZ_GPUPIC];
- if (f == NULL) return -1;
+ //if (f == NULL) return -1;
gzwrite(f, (void *)PcsxrHeader, sizeof(PcsxrHeader));
gzwrite(f, (void *)&SaveVersion, sizeof(u32));
gzwrite(f, (void *)&Config.HLE, sizeof(boolean));
- GPU_getScreenPic(pMemGpuPic);
+ if (gzsize)GPU_getScreenPic(pMemGpuPic); // Not necessary with ephemeral saves
gzwrite(f, pMemGpuPic, SZ_GPUPIC);
if (Config.HLE)
@@ -658,22 +664,32 @@ int SaveStateGz(gzFile f, long* gzsize) {
gzwrite(f, (void *)&psxRegs, sizeof(psxRegs));
// gpu
- gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
+ if (!gpufP)gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
gpufP->ulFreezeVersion = 1;
GPU_freeze(1, gpufP);
gzwrite(f, gpufP, sizeof(GPUFreeze_t));
- free(gpufP);
+ // SPU Plugin cannot change during run, so we query size info just once per session
+ if (!spufP) {
+ spufP = (SPUFreeze_t *)malloc(offsetof(SPUFreeze_t, SPUPorts)); // only first 3 elements (up to Size)
+ SPU_freeze(2, spufP);
+ Size = spufP->Size;
+ SysPrintf("SPUFreezeSize %i/(%i)\n", Size, offsetof(SPUFreeze_t, SPUPorts));
+ free(spufP);
+ spufP = (SPUFreeze_t *) malloc(Size);
+ spufP->Size = Size;
+
+ if (spufP->Size <= 0) {
+ gzclose_w(f);
+ free(spufP);
+ spufP = NULL;
+ return 1; // error
+ }
+ }
// spu
- spufP = (SPUFreeze_t *)pMemSpuT; // only first 3 elements (up to Size)
- SPU_freeze(2, spufP);
- Size = spufP->Size; gzwrite(f, &Size, 4);
- if (Size <= 0)
- return 1; // error
- spufP = (SPUFreeze_t *) malloc(Size);
+ gzwrite(f, &(spufP->Size), 4);
SPU_freeze(1, spufP);
- gzwrite(f, spufP, Size);
- free(spufP);
+ gzwrite(f, spufP, spufP->Size);
sioFreeze(f, 1);
cdrFreeze(f, 1);
@@ -681,15 +697,14 @@ int SaveStateGz(gzFile f, long* gzsize) {
psxRcntFreeze(f, 1);
mdecFreeze(f, 1);
- *gzsize = gztell(f);
- gzclose(f);
+ if(gzsize)*gzsize = gztell(f);
+ gzclose_w(f);
return 0;
}
int LoadStateGz(gzFile f) {
- GPUFreeze_t *gpufP;
- SPUFreeze_t *spufP;
+ SPUFreeze_t *_spufP;
int Size;
char header[sizeof(PcsxrHeader)];
u32 version;
@@ -719,17 +734,16 @@ int LoadStateGz(gzFile f) {
psxBiosFreeze(0);
// gpu
- gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
+ if (!gpufP)gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
gzread(f, gpufP, sizeof(GPUFreeze_t));
GPU_freeze(0, gpufP);
- free(gpufP);
// spu
gzread(f, &Size, 4);
- spufP = (SPUFreeze_t *)malloc(Size);
- gzread(f, spufP, Size);
- SPU_freeze(0, spufP);
- free(spufP);
+ _spufP = (SPUFreeze_t *)malloc(Size);
+ gzread(f, _spufP, Size);
+ SPU_freeze(0, _spufP);
+ free(_spufP);
sioFreeze(f, 0);
cdrFreeze(f, 0);
@@ -737,7 +751,7 @@ int LoadStateGz(gzFile f) {
psxRcntFreeze(f, 0);
mdecFreeze(f, 0);
- gzclose(f);
+ gzclose_r(f);
return 0;
}