diff options
| author | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-02-16 09:50:38 +0000 |
|---|---|---|
| committer | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-02-16 09:50:38 +0000 |
| commit | fe4b4c0f5672ba45c174b42fe3540029d9a5552a (patch) | |
| tree | 13be88a7e99bb24112cea1a3535ca09bbd9a25e8 /libpcsxcore/misc.c | |
| parent | 9bb4ff671b89d5f8d7605ce5e601c368b3cba673 (diff) | |
| download | pcsxr-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-x | libpcsxcore/misc.c | 72 |
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; } |
