diff --git a/src/engine.cpp b/src/engine.cpp index f1fabc5..a2322c3 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -125,6 +125,15 @@ free_managed(void *p) free(mem->origPtr); } +void +printleaks(void) +{ + FORLIST(lnk, allocations){ + MemoryBlock *mem = LLLinkGetData(lnk, MemoryBlock, inAllocList); + printf("sz %d hint %X\n %s\n", mem->sz, mem->hint, mem->codeline); + } +} + // TODO: make the debug out configurable void *mustmalloc_h(size_t sz, uint32 hint) { @@ -147,11 +156,25 @@ void *mustrealloc_h(void *p, size_t sz, uint32 hint) return nil; } -//#define TRACK_ALLOCATIONS +MemoryFunctions defaultMemfuncs = { + malloc_h, + realloc_h, + free, + nil, + nil +}; + +MemoryFunctions managedMemfuncs = { + malloc_managed, + realloc_managed, + free_managed, + nil, + nil +}; // This function mainly registers engine plugins bool32 -Engine::init(void) +Engine::init(MemoryFunctions *memfuncs) { if(engine || Engine::state != Dead){ RWERROR((ERR_ENGINEINIT)); @@ -161,19 +184,15 @@ Engine::init(void) totalMemoryAllocated = 0; allocations.init(); - // TODO: make this an argument -#ifdef TRACK_ALLOCATIONS - memfuncs.rwmalloc = malloc_managed; - memfuncs.rwrealloc = realloc_managed; - memfuncs.rwfree = free_managed; -#else - memfuncs.rwmalloc = malloc_h; - memfuncs.rwrealloc = realloc_h; - memfuncs.rwfree = free; -#endif + if(memfuncs) + Engine::memfuncs = *memfuncs; + else + Engine::memfuncs = defaultMemfuncs; - memfuncs.rwmustmalloc = mustmalloc_h; - memfuncs.rwmustrealloc = mustrealloc_h; + if(Engine::memfuncs.rwmustmalloc == nil) + Engine::memfuncs.rwmustmalloc = mustmalloc_h; + if(Engine::memfuncs.rwmustrealloc == nil) + Engine::memfuncs.rwmustrealloc = mustrealloc_h; PluginList::open(); @@ -303,13 +322,6 @@ Engine::term(void) // TODO: maybe reset more stuff here? d3d::nativeRasterOffset = 0; -#ifdef TRACK_ALLOCATIONS - FORLIST(lnk, allocations){ - MemoryBlock *mem = LLLinkGetData(lnk, MemoryBlock, inAllocList); - printf("sz %d hint %X\n %s\n", mem->sz, mem->hint, mem->codeline); - } -#endif - Engine::state = Dead; } diff --git a/src/gl/gl3immed.cpp b/src/gl/gl3immed.cpp index e7678e2..8710ca2 100644 --- a/src/gl/gl3immed.cpp +++ b/src/gl/gl3immed.cpp @@ -83,6 +83,9 @@ closeIm2D(void) { glDeleteBuffers(1, &im2DIbo); glDeleteBuffers(1, &im2DVbo); +#ifdef RW_GL_USE_VAOS + glDeleteVertexArrays(1, &im2DVao); +#endif im2dShader->destroy(); im2dShader = nil; } @@ -238,6 +241,9 @@ closeIm3D(void) { glDeleteBuffers(1, &im3DIbo); glDeleteBuffers(1, &im3DVbo); +#ifdef RW_GL_USE_VAOS + glDeleteVertexArrays(1, &im3DVao); +#endif im3dShader->destroy(); im3dShader = nil; } diff --git a/src/rwengine.h b/src/rwengine.h index d09de11..0f54395 100644 --- a/src/rwengine.h +++ b/src/rwengine.h @@ -159,7 +159,7 @@ struct Engine static MemoryFunctions memfuncs; static State state; - static bool32 init(void); + static bool32 init(MemoryFunctions *memfuncs = nil); static bool32 open(EngineOpenParams*); static bool32 start(void); static void term(void); @@ -207,6 +207,10 @@ inline void *mustrealloc_LOC(void *p, size_t sz, uint32 hint, const char *here) #define rwResize(p, s, h) rw::mustrealloc_LOC(p,s,h,RWHERE) #define rwResizeT(t, p, s, h) (t*)rw::mustrealloc_LOC(p,(s)*sizeof(t),h,RWHERE) +extern MemoryFunctions defaultMemfuncs; +extern MemoryFunctions managedMemfuncs; +void printleaks(void); // when using managed mem funcs + namespace null { void beginUpdate(Camera*); void endUpdate(Camera*);