From db6fa0a0171787264fae35527935ce24a397d232 Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 4 May 2009 07:07:48 +0000 Subject: [PATCH] remove a bunch of static buffers, reducing ram usage for those from 256 to 32. also add an ancient backwards compatibility hack to savestates; but, this will break savestates made within the past couple of days. --- src/gfx3d.cpp | 33 ++++++++++++++++-------- src/rasterize.cpp | 24 ++++++++++-------- src/texcache.cpp | 11 +++++--- src/texcache.h | 4 +-- src/windows/main.cpp | 2 ++ src/windows/ram_search.cpp | 51 +++++++++++++++++++++++--------------- 6 files changed, 79 insertions(+), 46 deletions(-) diff --git a/src/gfx3d.cpp b/src/gfx3d.cpp index c0f42dce6..c286909f4 100644 --- a/src/gfx3d.cpp +++ b/src/gfx3d.cpp @@ -207,10 +207,10 @@ static CACHE_ALIGN float cacheHalfVector[4][4]; //-------------poly and vertex lists and such things -POLYLIST polylists[2]; -POLYLIST* polylist = &polylists[0]; -VERTLIST vertlists[2]; -VERTLIST* vertlist = &vertlists[0]; +POLYLIST* polylists = NULL; +POLYLIST* polylist = NULL; +VERTLIST* vertlists = NULL; +VERTLIST* vertlist = NULL; int listTwiddle = 1; int triStripToggle; @@ -278,6 +278,8 @@ static void makeTables() { void gfx3d_init() { + if(polylists == NULL) { polylists = new POLYLIST[2]; polylist = &polylists[0]; } + if(vertlists == NULL) { vertlists = new VERTLIST[2]; vertlist = &vertlists[0]; } makeTables(); gfx3d_reset(); } @@ -2328,6 +2330,9 @@ SFORMAT SF_GFX3D[]={ //-------------savestate void gfx3d_savestate(std::ostream* os) { + //version + write32le(1,os); + //dump the render lists OSWRITE(vertlist->count); for(int i=0;icount;i++) @@ -2339,6 +2344,11 @@ void gfx3d_savestate(std::ostream* os) bool gfx3d_loadstate(std::istream* is, int size) { + int version; + if(read32le(&version,is) != 1) return false; + if(size==8) version = 0; + + gfx3d_glPolygonAttrib_cache(); gfx3d_glTexImage_cache(); gfx3d_Control_cache(); @@ -2352,12 +2362,15 @@ bool gfx3d_loadstate(std::istream* is, int size) polylist = &polylists[listTwiddle]; vertlist = &vertlists[listTwiddle]; - OSREAD(vertlist->count); - for(int i=0;icount;i++) - vertlist->list[i].load(is); - OSREAD(polylist->count); - for(int i=0;icount;i++) - polylist->list[i].load(is); + if(version==1) + { + OSREAD(vertlist->count); + for(int i=0;icount;i++) + vertlist->list[i].load(is); + OSREAD(polylist->count); + for(int i=0;icount;i++) + polylist->list[i].load(is); + } gfx3d.polylist = &polylists[listTwiddle^1]; gfx3d.vertlist = &vertlists[listTwiddle^1]; diff --git a/src/rasterize.cpp b/src/rasterize.cpp index f5fd52982..c300bb75e 100644 --- a/src/rasterize.cpp +++ b/src/rasterize.cpp @@ -69,6 +69,17 @@ static u8 decal_table[32][32][32]; static u8 index_lookup_table[65]; static u8 index_start_table[8]; +static struct TClippedPoly +{ + int type; + POLY* poly; + VERT clipVerts[MAX_CLIPPED_VERTS]; +} *clippedPolys = NULL; +static int clippedPolyCounter; + +TClippedPoly tempClippedPoly; +TClippedPoly outClippedPoly; + ////optimized float floor useful in limited cases ////from http://www.stereopsis.com/FPU.html#convert ////(unfortunately, it relies on certain FPU register settings) @@ -895,6 +906,9 @@ static char SoftRastInit(void) if(!tables_generated) { tables_generated = true; + + clippedPolys = new TClippedPoly[POLYLIST_SIZE*2]; + for(int i=0;i<32;i++) { for(int j=0;j<32;j++) @@ -968,16 +982,6 @@ static void SoftRastConvertFramebuffer() } } -static struct TClippedPoly -{ - int type; - POLY* poly; - VERT clipVerts[MAX_CLIPPED_VERTS]; -} clippedPolys[POLYLIST_SIZE*2]; -static int clippedPolyCounter; - -TClippedPoly tempClippedPoly; -TClippedPoly outClippedPoly; template static T interpolate(const float ratio, const T& x0, const T& x1) { diff --git a/src/texcache.cpp b/src/texcache.cpp index 0adfac384..0accda6a5 100644 --- a/src/texcache.cpp +++ b/src/texcache.cpp @@ -132,10 +132,10 @@ static MemSpan MemSpan_TexPalette(u32 ofs, u32 len) return ret; } -TextureCache texcache[MAX_TEXTURE+1]; -u32 texcache_start; -u32 texcache_stop; -u8 TexCache_texMAP[1024*2048*4]; +TextureCache *texcache; +u32 texcache_start; +u32 texcache_stop; +u8 *TexCache_texMAP = NULL; #if defined (DEBUG_DUMP_TEXTURE) && defined (WIN32) @@ -575,6 +575,9 @@ REJECT: void TexCache_Reset() { + if(TexCache_texMAP == NULL) TexCache_texMAP = new u8[1024*2048*4]; + if(texcache == NULL) texcache = new TextureCache[MAX_TEXTURE+1]; + memset(texcache,0,sizeof(texcache)); texcache_start=0; diff --git a/src/texcache.h b/src/texcache.h index c350a2fe4..3d6671871 100644 --- a/src/texcache.h +++ b/src/texcache.h @@ -36,7 +36,7 @@ struct ALIGN(8) TextureCache }; -extern TextureCache texcache[MAX_TEXTURE+1]; +extern TextureCache *texcache; extern void (*TexCache_BindTexture)(u32 texnum); extern void (*TexCache_BindTextureData)(u32 texnum, u8* data); @@ -48,7 +48,7 @@ void TexCache_SetTexture(u32 format, u32 texpal); void TexCache_Invalidate(); -extern u8 TexCache_texMAP[1024*2048*4]; +extern u8 *TexCache_texMAP; TextureCache* TexCache_Curr(); #endif diff --git a/src/windows/main.cpp b/src/windows/main.cpp index 709b4e927..8df56af37 100644 --- a/src/windows/main.cpp +++ b/src/windows/main.cpp @@ -114,6 +114,7 @@ void DRV_AviVideoUpdate(const u16* buffer); DWORD hKeyInputTimer; extern LRESULT CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +void InitRamSearch(); CRITICAL_SECTION win_sync; @@ -3092,6 +3093,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM case ID_RAM_SEARCH: if(!RamSearchHWnd) { + InitRamSearch(); RamSearchHWnd = CreateDialog(hAppInst, MAKEINTRESOURCE(IDD_RAMSEARCH), hwnd, (DLGPROC) RamSearchProc); } else diff --git a/src/windows/ram_search.cpp b/src/windows/ram_search.cpp index ad40237c6..0ed8f6f2f 100644 --- a/src/windows/ram_search.cpp +++ b/src/windows/ram_search.cpp @@ -63,10 +63,12 @@ struct MemoryRegion unsigned int itemIndex; // index into listbox items, valid when s_itemIndicesInvalid is false }; -static unsigned char s_prevValues [MAX_RAM_SIZE+4] = {0}; // values at last search or reset -static unsigned char s_curValues [MAX_RAM_SIZE+4] = {0}; // values at last frame update -static unsigned short s_numChanges [MAX_RAM_SIZE+4] = {0}; // number of changes of the item starting at this virtual index address -static MemoryRegion* s_itemIndexToRegionPointer [MAX_RAM_SIZE+4] = {0}; // used for random access into the memory list (trading memory size to get speed here, too bad it's so much memory), only valid when s_itemIndicesInvalid is false +static struct Buffers { + unsigned char s_prevValues [MAX_RAM_SIZE+4]; // values at last search or reset + unsigned char s_curValues [MAX_RAM_SIZE+4]; // values at last frame update + unsigned short s_numChanges [MAX_RAM_SIZE+4]; // number of changes of the item starting at this virtual index address + MemoryRegion* s_itemIndexToRegionPointer [MAX_RAM_SIZE+4]; // used for random access into the memory list (trading memory size to get speed here, too bad it's so much memory), only valid when s_itemIndicesInvalid is false +} *buffers = NULL; static BOOL s_itemIndicesInvalid = true; // if true, the link from listbox items to memory regions (s_itemIndexToRegionPointer) and the link from memory regions to list box items (MemoryRegion::itemIndex) both need to be recalculated static BOOL s_prevValuesNeedUpdate = true; // if true, the "prev" values should be updated using the "cur" values on the next frame update signaled static unsigned int s_maxItemIndex = 0; // max currently valid item index, the listbox sometimes tries to update things past the end of the list so we need to know this to ignore those attempts @@ -92,6 +94,15 @@ static int s_undoType = 0; // 0 means can't undo, 1 means can undo, 2 means can void RamSearchSaveUndoStateIfNotTooBig(HWND hDlg); static const int tooManyRegionsForUndo = 10000; +void InitRamSearch() +{ + if(buffers == NULL) + { + buffers = new Buffers; + memset(buffers,0,sizeof(Buffers)); + } +} + void ResetMemoryRegions() { // Clear_Sound_Buffer(); @@ -200,7 +211,7 @@ void CalculateItemIndices(int itemSize) unsigned int start = startSkipSize; unsigned int end = region.size; for(unsigned int i = start; i < end; i += itemSize) - s_itemIndexToRegionPointer[itemIndex++] = ®ion; + buffers->s_itemIndexToRegionPointer[itemIndex++] = ®ion; } s_maxItemIndex = itemIndex; s_itemIndicesInvalid = FALSE; @@ -210,7 +221,7 @@ template void UpdateRegionT(const MemoryRegion& region, const MemoryRegion* nextRegionPtr) { if(s_prevValuesNeedUpdate) - memcpy(s_prevValues + region.virtualIndex, s_curValues + region.virtualIndex, region.size + sizeof(compareType) - sizeof(stepType)); + memcpy(buffers->s_prevValues + region.virtualIndex, buffers->s_curValues + region.virtualIndex, region.size + sizeof(compareType) - sizeof(stepType)); unsigned int startSkipSize = ((unsigned int)(sizeof(stepType) - region.hardwareAddress)) % sizeof(stepType); @@ -222,11 +233,11 @@ void UpdateRegionT(const MemoryRegion& region, const MemoryRegion* nextRegionPtr { for(unsigned int i = indexStart; i < indexEnd; i++) { - if(s_curValues[i] != sourceAddr[i^swapXOR]) // if value changed + if(buffers->s_curValues[i] != sourceAddr[i^swapXOR]) // if value changed { - s_curValues[i] = sourceAddr[i^swapXOR]; // update value + buffers->s_curValues[i] = sourceAddr[i^swapXOR]; // update value //if(s_numChanges[i] != 0xFFFF) - s_numChanges[i]++; // increase change count + buffers->s_numChanges[i]++; // increase change count } } } @@ -253,10 +264,10 @@ void UpdateRegionT(const MemoryRegion& region, const MemoryRegion* nextRegionPtr for(unsigned int i = indexStart, j = 0; i < lastIndexToRead; i++, j++) { - if(s_curValues[i] != sourceAddr[i^swapXOR]) // if value of this byte changed + if(buffers->s_curValues[i] != sourceAddr[i^swapXOR]) // if value of this byte changed { if(i < lastIndexToCopy) - s_curValues[i] = sourceAddr[i^swapXOR]; // update value + buffers->s_curValues[i] = sourceAddr[i^swapXOR]; // update value for(int k = 0; k < sizeof(compareType); k++) // loop through the previous entries that contain this byte { if(i >= indexEnd+k) @@ -265,7 +276,7 @@ void UpdateRegionT(const MemoryRegion& region, const MemoryRegion* nextRegionPtr if(nextValidChange[m]+sizeof(compareType) <= i+sizeof(compareType)) // if we didn't already increase the change count for this entry { //if(s_numChanges[i-k] != 0xFFFF) - s_numChanges[i-k]++; // increase the change count for this entry + buffers->s_numChanges[i-k]++; // increase the change count for this entry nextValidChange[m] = i+sizeof(compareType); // and remember not to increase it again } } @@ -333,7 +344,7 @@ void ItemIndexToVirtualRegion(unsigned int itemIndex, MemoryRegion& virtualRegio return; } - const MemoryRegion* regionPtr = s_itemIndexToRegionPointer[itemIndex]; + const MemoryRegion* regionPtr = buffers->s_itemIndexToRegionPointer[itemIndex]; const MemoryRegion& region = *regionPtr; int bytesWithinRegion = (itemIndex - region.itemIndex) * sizeof(stepType); @@ -375,19 +386,19 @@ template<> unsigned char ReadBigEndian(const unsigned char* data) { return *data template compareType GetPrevValueFromVirtualIndex(unsigned int virtualIndex) { - return ReadBigEndian(s_prevValues + virtualIndex); + return ReadBigEndian(buffers->s_prevValues + virtualIndex); //return *(compareType*)(s_prevValues+virtualIndex); } template compareType GetCurValueFromVirtualIndex(unsigned int virtualIndex) { - return ReadBigEndian(s_curValues + virtualIndex); + return ReadBigEndian(buffers->s_curValues + virtualIndex); // return *(compareType*)(s_curValues+virtualIndex); } template unsigned short GetNumChangesFromVirtualIndex(unsigned int virtualIndex) { - unsigned short num = s_numChanges[virtualIndex]; + unsigned short num = buffers->s_numChanges[virtualIndex]; //for(unsigned int i = 1; i < sizeof(stepType); i++) // if(num < s_numChanges[virtualIndex+i]) // num = s_numChanges[virtualIndex+i]; @@ -970,14 +981,14 @@ void CompactAddrs() void soft_reset_address_info () { ResetMemoryRegions(); - memset(s_numChanges, 0, sizeof(s_numChanges)); + memset(buffers->s_numChanges, 0, sizeof(buffers->s_numChanges)); CompactAddrs(); } void reset_address_info () { SetRamSearchUndoType(RamSearchHWnd, 0); s_activeMemoryRegionsBackup.clear(); // not necessary, but we'll take the time hit here instead of at the next thing that sets up an undo - memcpy(s_prevValues, s_curValues, sizeof(s_prevValues)); + memcpy(buffers->s_prevValues, buffers->s_curValues, sizeof(buffers->s_prevValues)); s_prevValuesNeedUpdate = false; ResetMemoryRegions(); if(!RamSearchHWnd) @@ -992,7 +1003,7 @@ void reset_address_info () s_prevValuesNeedUpdate = true; signal_new_frame(); } - memset(s_numChanges, 0, sizeof(s_numChanges)); + memset(buffers->s_numChanges, 0, sizeof(buffers->s_numChanges)); CompactAddrs(); } @@ -1663,7 +1674,7 @@ LRESULT CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara {rv = true; break;} } case IDC_C_RESET_CHANGES: - memset(s_numChanges, 0, sizeof(s_numChanges)); + memset(buffers->s_numChanges, 0, sizeof(buffers->s_numChanges)); ListView_Update(GetDlgItem(hDlg,IDC_RAMLIST), -1); //SetRamSearchUndoType(hDlg, 0); {rv = true; break;}