memory heap starting to work

This commit is contained in:
aap 2020-11-25 22:49:50 +01:00
parent 88baa9ce5f
commit 4ddc356341
8 changed files with 74 additions and 16 deletions

View File

@ -1601,7 +1601,7 @@ void SystemInit()
mwInit(); mwInit();
#endif #endif
#ifdef GTA_PS2 #ifdef USE_CUSTOM_ALLOCATOR
InitMemoryMgr(); InitMemoryMgr();
#endif #endif

View File

@ -16,9 +16,14 @@ using namespace rw;
RwUInt8 RwObjectGetType(const RwObject *obj) { return obj->type; } RwUInt8 RwObjectGetType(const RwObject *obj) { return obj->type; }
void *RwMalloc(size_t size) { return malloc(size); } void *RwMalloc(size_t size) { return engine->memfuncs.rwmalloc(size, 0); }
void *RwCalloc(size_t numObj, size_t sizeObj) { return calloc(numObj, sizeObj); } void *RwCalloc(size_t numObj, size_t sizeObj) {
void RwFree(void *mem) { free(mem); } void *mem = RwMalloc(numObj*sizeObj);
if(mem)
memset(mem, 0, numObj*sizeObj);
return mem;
}
void RwFree(void *mem) { engine->memfuncs.rwfree(mem); }
//RwReal RwV3dNormalize(RwV3d * out, const RwV3d * in); //RwReal RwV3dNormalize(RwV3d * out, const RwV3d * in);
@ -536,8 +541,27 @@ RwBool RwRenderStateSet(RwRenderState state, void *value)
} }
} }
static rw::MemoryFunctions gMemfuncs;
static void *(*real_malloc)(size_t size);
static void *(*real_realloc)(void *mem, size_t newSize);
static void *mallocWrap(size_t sz, uint32 hint) { if(sz == 0) return nil; return real_malloc(sz); }
static void *reallocWrap(void *p, size_t sz, uint32 hint) { return real_realloc(p, sz); }
// WARNING: unused parameters // WARNING: unused parameters
RwBool RwEngineInit(RwMemoryFunctions *memFuncs, RwUInt32 initFlags, RwUInt32 resArenaSize) { Engine::init(); return true; } RwBool RwEngineInit(RwMemoryFunctions *memFuncs, RwUInt32 initFlags, RwUInt32 resArenaSize) {
if(memFuncs){
real_malloc = memFuncs->rwmalloc;
real_realloc = memFuncs->rwrealloc;
gMemfuncs.rwmalloc = mallocWrap;
gMemfuncs.rwrealloc = reallocWrap;
gMemfuncs.rwfree = memFuncs->rwfree;
Engine::init(&gMemfuncs);
}else{
Engine::init(nil);
}
return true;
}
// TODO: this is platform dependent // TODO: this is platform dependent
RwBool RwEngineOpen(RwEngineOpenParams *initParams) { RwBool RwEngineOpen(RwEngineOpenParams *initParams) {
static EngineOpenParams openParams; static EngineOpenParams openParams;

View File

@ -141,15 +141,15 @@ RwUInt8 RwObjectGetType(const RwObject *obj);
*********************************************** ***********************************************
*/ */
struct RwMemoryFunctions; struct RwMemoryFunctions
/*
{ {
// NB: from RW 3.6 on the allocating functions take
// a hint parameter!
void *(*rwmalloc)(size_t size); void *(*rwmalloc)(size_t size);
void (*rwfree)(void *mem); void (*rwfree)(void *mem);
void *(*rwrealloc)(void *mem, size_t newSize); void *(*rwrealloc)(void *mem, size_t newSize);
void *(*rwcalloc)(size_t numObj, size_t sizeObj); void *(*rwcalloc)(size_t numObj, size_t sizeObj);
}; };
*/
void *RwMalloc(size_t size); void *RwMalloc(size_t size);
void RwFree(void *mem); void RwFree(void *mem);

View File

@ -9,8 +9,11 @@
#ifdef USE_CUSTOM_ALLOCATOR #ifdef USE_CUSTOM_ALLOCATOR
#define MEMORYHEAP_ASSERT(cond) { if (!(cond)) { printf("ASSERT File:%s Line:%d\n", __FILE__, __LINE__); exit(1); } } //#define MEMORYHEAP_ASSERT(cond) { if (!(cond)) { printf("ASSERT File:%s Line:%d\n", __FILE__, __LINE__); exit(1); } }
#define MEMORYHEAP_ASSERT_MESSAGE(cond, message) { if (!(cond)) { printf("ASSERT File:%s Line:%d:\n\t%s\n", __FILE__, __LINE__, message); exit(1); } } //#define MEMORYHEAP_ASSERT_MESSAGE(cond, message) { if (!(cond)) { printf("ASSERT File:%s Line:%d:\n\t%s\n", __FILE__, __LINE__, message); exit(1); } }
#define MEMORYHEAP_ASSERT(cond) assert(cond)
#define MEMORYHEAP_ASSERT_MESSAGE(cond, message) assert(cond)
// registered pointers that we keep track of // registered pointers that we keep track of
void **gPtrList[4000]; void **gPtrList[4000];
@ -272,6 +275,7 @@ CMemoryHeap::Free(void *ptr)
MEMORYHEAP_ASSERT(m_unkMemId == -1 || m_unkMemId == block->m_memId); MEMORYHEAP_ASSERT(m_unkMemId == -1 || m_unkMemId == block->m_memId);
RegisterFree(block); RegisterFree(block);
block->m_memId = MEMID_FREE;
CombineFreeBlocks(block); CombineFreeBlocks(block);
FreeBlock(block); FreeBlock(block);
if(block->m_ptrListIndex != -1){ if(block->m_ptrListIndex != -1){
@ -313,7 +317,7 @@ uint32
CMemoryHeap::CombineFreeBlocks(HeapBlockDesc *block) CMemoryHeap::CombineFreeBlocks(HeapBlockDesc *block)
{ {
HeapBlockDesc *next = block->GetNextConsecutive(); HeapBlockDesc *next = block->GetNextConsecutive();
if(next->m_memId == MEMID_FREE) if(next->m_memId != MEMID_FREE)
return block->m_size; return block->m_size;
// get rid of free blocks after this one and adjust size // get rid of free blocks after this one and adjust size
for(; next->m_memId == MEMID_FREE; next = next->GetNextConsecutive()) for(; next->m_memId == MEMID_FREE; next = next->GetNextConsecutive())
@ -535,6 +539,10 @@ MemoryMgrCalloc(uint32 num, uint32 size)
void void
MemoryMgrFree(void *ptr) MemoryMgrFree(void *ptr)
{ {
#ifdef FIX_BUGS
// i don't suppose this is handled by RW?
if(ptr == nil) return;
#endif
gMainHeap.Free(ptr); gMainHeap.Free(ptr);
} }

View File

@ -1,6 +1,12 @@
#pragma once #pragma once
// some windows shit
#ifdef MoveMemory
#undef MoveMemory
#endif
extern RwMemoryFunctions memFuncs; extern RwMemoryFunctions memFuncs;
void InitMemoryMgr(void);
template<typename T, uint32 N> template<typename T, uint32 N>
class CStack class CStack
@ -56,7 +62,10 @@ struct HeapBlockDesc
} }
}; };
#ifdef USE_CUSTOM_ALLOCATOR
// TODO: figure something out for 64 bit pointers
static_assert(sizeof(HeapBlockDesc) == 0x10, "HeapBlockDesc must have 0x10 size otherwise most of assumptions don't make sense"); static_assert(sizeof(HeapBlockDesc) == 0x10, "HeapBlockDesc must have 0x10 size otherwise most of assumptions don't make sense");
#endif
struct HeapBlockList struct HeapBlockList
{ {
@ -181,8 +190,7 @@ public:
return; return;
} }
} }
HeapBlockDesc *it; HeapBlockDesc *b = m_freeList.m_first.FindSmallestFreeBlock(block->m_size);
for(it = m_freeList.m_first.m_next; it->m_size < block->m_size; it = it->m_next); block->InsertHeapFreeBlock(b->m_prev);
block->InsertHeapFreeBlock(it->m_prev);
} }
}; };

View File

@ -40,6 +40,7 @@
#include "Sprite2d.h" #include "Sprite2d.h"
#include "AnimViewer.h" #include "AnimViewer.h"
#include "Font.h" #include "Font.h"
#include "MemoryHeap.h"
#define MAX_SUBSYSTEMS (16) #define MAX_SUBSYSTEMS (16)
@ -277,7 +278,11 @@ psMouseSetPos(RwV2d *pos)
RwMemoryFunctions* RwMemoryFunctions*
psGetMemoryFunctions(void) psGetMemoryFunctions(void)
{ {
#ifdef USE_CUSTOM_ALLOCATOR
return &memFuncs;
#else
return nil; return nil;
#endif
} }
/* /*
@ -1461,6 +1466,10 @@ main(int argc, char *argv[])
RwV2d pos; RwV2d pos;
RwInt32 i; RwInt32 i;
#ifdef USE_CUSTOM_ALLOCATOR
InitMemoryMgr();
#endif
#ifndef _WIN32 #ifndef _WIN32
struct sigaction act; struct sigaction act;
act.sa_sigaction = terminateHandler; act.sa_sigaction = terminateHandler;

View File

@ -97,6 +97,7 @@ static psGlobalType PsGlobal;
#include "Sprite2d.h" #include "Sprite2d.h"
#include "AnimViewer.h" #include "AnimViewer.h"
#include "Font.h" #include "Font.h"
#include "MemoryHeap.h"
VALIDATE_SIZE(psGlobalType, 0x28); VALIDATE_SIZE(psGlobalType, 0x28);
@ -304,7 +305,11 @@ psMouseSetPos(RwV2d *pos)
RwMemoryFunctions* RwMemoryFunctions*
psGetMemoryFunctions(void) psGetMemoryFunctions(void)
{ {
#ifdef USE_CUSTOM_ALLOCATOR
return &memFuncs;
#else
return nil; return nil;
#endif
} }
/* /*
@ -2006,7 +2011,11 @@ WinMain(HINSTANCE instance,
RwChar **argv; RwChar **argv;
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
#if 0 #ifdef USE_CUSTOM_ALLOCATOR
InitMemoryMgr();
#endif
#if 1
// TODO: make this an option somewhere // TODO: make this an option somewhere
AllocConsole(); AllocConsole();
freopen("CONIN$", "r", stdin); freopen("CONIN$", "r", stdin);

2
vendor/librw vendored

@ -1 +1 @@
Subproject commit d9def88c46a742c6bc74bf79021c0f8838480df4 Subproject commit e8990d5b3d50be72594f93dcc42d749f29761516