diff --git a/core/hw/mem/_vmem.cpp b/core/hw/mem/_vmem.cpp index e19e74ed2..9ab17f680 100644 --- a/core/hw/mem/_vmem.cpp +++ b/core/hw/mem/_vmem.cpp @@ -3,9 +3,7 @@ #include "hw/pvr/pvr_mem.h" #include "hw/sh4/dyna/blockmanager.h" #include "hw/sh4/sh4_mem.h" -#if defined(__SWITCH__) -#include -#endif +#include "oslib/oslib.h" #define HANDLER_MAX 0x1F #define HANDLER_COUNT (HANDLER_MAX+1) @@ -360,20 +358,14 @@ u8* virt_ram_base; bool vmem_4gb_space; static VMemType vmemstatus = MemTypeError; -static void* malloc_pages(size_t size) { -#ifdef _WIN32 - return _aligned_malloc(size, PAGE_SIZE); -#elif defined(_ISOC11_SOURCE) - return aligned_alloc(PAGE_SIZE, size); -#elif defined(__SWITCH__) - return memalign(PAGE_SIZE, size); -#else - void *data; - if (posix_memalign(&data, PAGE_SIZE, size) != 0) - return NULL; - else - return data; -#endif +static void *malloc_pages(size_t size) +{ + return allocAligned(PAGE_SIZE, size); +} + +static void free_pages(void *p) +{ + freeAligned(p); } #if FEAT_SHREC != DYNAREC_NONE @@ -449,27 +441,16 @@ bool _vmem_reserve() static void _vmem_term_mappings() { - if (vmemstatus == MemTypeError) { - if (p_sh4rcb != NULL) - { - free(p_sh4rcb); - p_sh4rcb = NULL; - } - if (mem_b.data != NULL) - { - free(mem_b.data); - mem_b.data = NULL; - } - if (vram.data != NULL) - { - free(vram.data); - vram.data = NULL; - } - if (aica_ram.data != NULL) - { - free(aica_ram.data); - aica_ram.data = NULL; - } + if (vmemstatus == MemTypeError) + { + free_pages(p_sh4rcb); + p_sh4rcb = nullptr; + free_pages(mem_b.data); + mem_b.data = nullptr; + free_pages(vram.data); + vram.data = nullptr; + free_pages(aica_ram.data); + aica_ram.data = nullptr; } } @@ -593,9 +574,6 @@ void _vmem_init_mappings() ARAM_SIZE / 1024 / 1024, aica_ram.data); } -#define freedefptr(x) \ - if (x) { free(x); x = NULL; } - void _vmem_release() { if (virt_ram_base) @@ -606,10 +584,7 @@ void _vmem_release() else { _vmem_unprotect_vram(0, VRAM_SIZE); - freedefptr(p_sh4rcb); - freedefptr(vram.data); - freedefptr(aica_ram.data); - freedefptr(mem_b.data); + _vmem_term_mappings(); } vmemstatus = MemTypeError; } diff --git a/core/hw/pvr/ta_ctx.cpp b/core/hw/pvr/ta_ctx.cpp index 768a1dae1..90256e88d 100644 --- a/core/hw/pvr/ta_ctx.cpp +++ b/core/hw/pvr/ta_ctx.cpp @@ -1,9 +1,6 @@ #include "ta_ctx.h" #include "spg.h" #include "cfg/option.h" -#if defined(__SWITCH__) -#include -#endif #include "Renderer_if.h" extern u32 fskip; @@ -16,37 +13,6 @@ tad_context ta_tad; TA_context* vd_ctx; rend_context vd_rc; -// helper for 32 byte aligned memory allocation -void* OS_aligned_malloc(size_t align, size_t size) -{ -#ifdef __MINGW32__ - return __mingw_aligned_malloc(size, align); -#elif defined(_WIN32) - return _aligned_malloc(size, align); -#elif defined(__SWITCH__) - return memalign(align, size); -#else - void *result; - if (posix_memalign(&result, align, size)) - return NULL; - else - return result; -#endif -} - -// helper for 32 byte aligned memory de-allocation -void OS_aligned_free(void *ptr) -{ -#ifdef __MINGW32__ - __mingw_aligned_free(ptr); -#elif defined(_WIN32) - _aligned_free(ptr); -#else - free(ptr); -#endif -} - - void SetCurrentTARC(u32 addr) { if (addr != TACTX_NONE) diff --git a/core/hw/pvr/ta_ctx.h b/core/hw/pvr/ta_ctx.h index c28593232..7de03380f 100644 --- a/core/hw/pvr/ta_ctx.h +++ b/core/hw/pvr/ta_ctx.h @@ -4,15 +4,10 @@ #include "pvr_regs.h" #include "helper_classes.h" #include "stdclass.h" +#include "oslib/oslib.h" #include -// helper for 32 byte aligned memory allocation -void* OS_aligned_malloc(size_t align, size_t size); - -// helper for 32 byte aligned memory de-allocation -void OS_aligned_free(void *ptr); - class BaseTextureCacheData; //Vertex storage types @@ -208,7 +203,7 @@ struct TA_context void Alloc() { - tad.Reset((u8*)OS_aligned_malloc(32, TA_DATA_SIZE)); + tad.Reset((u8*)allocAligned(32, TA_DATA_SIZE)); rend.verts.InitBytes(4 * 1024 * 1024, &rend.Overrun, "verts"); //up to 4 mb of vtx data/frame = ~ 96k vtx/frame rend.idx.Init(120 * 1024, &rend.Overrun, "idx"); //up to 120K indexes ( idx have stripification overhead ) @@ -238,7 +233,7 @@ struct TA_context void Free() { verify(tad.End() - tad.thd_root <= TA_DATA_SIZE); - OS_aligned_free(tad.thd_root); + freeAligned(tad.thd_root); rend.verts.Free(); rend.idx.Free(); rend.global_param_op.Free(); diff --git a/core/oslib/oslib.cpp b/core/oslib/oslib.cpp index 8f43e596a..14e760c1f 100644 --- a/core/oslib/oslib.cpp +++ b/core/oslib/oslib.cpp @@ -19,6 +19,9 @@ #include "oslib.h" #include "stdclass.h" #include "cfg/cfg.h" +#if defined(__SWITCH__) +#include +#endif namespace hostfs { @@ -127,3 +130,28 @@ std::string getBiosFontPath() } } + +void *allocAligned(size_t alignment, size_t size) +{ +#ifdef _WIN32 + return _aligned_malloc(size, alignment); +#elif defined(__SWITCH__) + return memalign(alignment, size); +#else + void *data; + if (posix_memalign(&data, alignment, size) != 0) + return nullptr; + else + return data; +#endif +} + +void freeAligned(void *p) +{ +#ifdef _WIN32 + _aligned_free(p); +#else + free(p); +#endif +} + diff --git a/core/oslib/oslib.h b/core/oslib/oslib.h index 939092981..db3ec21c0 100644 --- a/core/oslib/oslib.h +++ b/core/oslib/oslib.h @@ -9,6 +9,9 @@ void os_CreateWindow(); void os_SetupInput(); void os_InstallFaultHandler(); void os_UninstallFaultHandler(); +void *allocAligned(size_t alignment, size_t size); +void freeAligned(void *p); + #ifdef _MSC_VER #include