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.
This commit is contained in:
parent
9e8e46f1c0
commit
db6fa0a017
|
@ -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;i<vertlist->count;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;i<vertlist->count;i++)
|
||||
vertlist->list[i].load(is);
|
||||
OSREAD(polylist->count);
|
||||
for(int i=0;i<polylist->count;i++)
|
||||
polylist->list[i].load(is);
|
||||
if(version==1)
|
||||
{
|
||||
OSREAD(vertlist->count);
|
||||
for(int i=0;i<vertlist->count;i++)
|
||||
vertlist->list[i].load(is);
|
||||
OSREAD(polylist->count);
|
||||
for(int i=0;i<polylist->count;i++)
|
||||
polylist->list[i].load(is);
|
||||
}
|
||||
|
||||
gfx3d.polylist = &polylists[listTwiddle^1];
|
||||
gfx3d.vertlist = &vertlists[listTwiddle^1];
|
||||
|
|
|
@ -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<typename T>
|
||||
static T interpolate(const float ratio, const T& x0, const T& x1) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<typename stepType, typename compareType, int swapXOR>
|
|||
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<typename stepType, typename compareType>
|
||||
compareType GetPrevValueFromVirtualIndex(unsigned int virtualIndex)
|
||||
{
|
||||
return ReadBigEndian<compareType>(s_prevValues + virtualIndex);
|
||||
return ReadBigEndian<compareType>(buffers->s_prevValues + virtualIndex);
|
||||
//return *(compareType*)(s_prevValues+virtualIndex);
|
||||
}
|
||||
template<typename stepType, typename compareType>
|
||||
compareType GetCurValueFromVirtualIndex(unsigned int virtualIndex)
|
||||
{
|
||||
return ReadBigEndian<compareType>(s_curValues + virtualIndex);
|
||||
return ReadBigEndian<compareType>(buffers->s_curValues + virtualIndex);
|
||||
// return *(compareType*)(s_curValues+virtualIndex);
|
||||
}
|
||||
template<typename stepType, typename compareType>
|
||||
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;}
|
||||
|
|
Loading…
Reference in New Issue