Use allocAligned/freeAligned for all aligned allocs

This commit is contained in:
Flyinghead 2021-10-14 10:46:44 +02:00
parent f9d5b8eb74
commit 85c21df5e7
5 changed files with 54 additions and 87 deletions

View File

@ -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 <malloc.h>
#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;
}

View File

@ -1,9 +1,6 @@
#include "ta_ctx.h"
#include "spg.h"
#include "cfg/option.h"
#if defined(__SWITCH__)
#include <malloc.h>
#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)

View File

@ -4,15 +4,10 @@
#include "pvr_regs.h"
#include "helper_classes.h"
#include "stdclass.h"
#include "oslib/oslib.h"
#include <mutex>
// 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();

View File

@ -19,6 +19,9 @@
#include "oslib.h"
#include "stdclass.h"
#include "cfg/cfg.h"
#if defined(__SWITCH__)
#include <malloc.h>
#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
}

View File

@ -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 <intrin.h>