diff --git a/nx/source/gfx/nvgfx.c b/nx/source/gfx/nvgfx.c index 5c835749..637c8ae8 100644 --- a/nx/source/gfx/nvgfx.c +++ b/nx/source/gfx/nvgfx.c @@ -2,11 +2,17 @@ #include #include +typedef struct { + bool initialized; + u32 handle; + u8 *mem; + size_t mem_size; +} nvmapobj; + static bool g_nvgfxInitialized = 0; static u32 g_nvgfx_fd_nvhostctrlgpu; static u32 g_nvgfx_fd_nvhostasgpu; static u32 g_nvgfx_fd_nvmap; -static u32 g_nvgfx_nvmapobj0, g_nvgfx_nvmapobj1; static gpu_characteristics g_nvgfx_gpu_characteristics; static u64 g_nvgfx_nvhostasgpu_allocspace_offset; @@ -16,8 +22,42 @@ static u32 g_nvgfx_zcullinfo[40>>2]; static nvioctl_va_region g_nvgfx_nvhostasgpu_varegions[2]; static nvioctl_l2_state g_nvgfx_l2state; -static u8 *g_nvgfx_nvmap0_mem, *g_nvgfx_nvmap1_mem; -size_t g_nvgfx_nvmap0_mem_size, g_nvgfx_nvmap1_mem_size; +nvmapobj nvmap_objs[2]; + +Result nvmapobjInitialize(nvmapobj *obj, size_t size) { + Result rc=0; + + if(obj->initialized)return 0; + + memset(obj, 0, sizeof(nvmapobj)); + + obj->mem_size = size; + + obj->mem = memalign(0x1000, size); + if (obj->mem==NULL) rc = MAKERESULT(MODULE_LIBNX, LIBNX_OUTOFMEM); + if (R_SUCCEEDED(rc)) memset(obj->mem, 0, size); + + if (R_SUCCEEDED(rc)) obj->initialized = 1; + + return rc; +} + +void nvmapobjClose(nvmapobj *obj) { + if(!obj->initialized)return; + + if (obj->mem) { + free(obj->mem); + obj->mem = NULL; + } + + memset(obj, 0, sizeof(nvmapobj)); +} + +void nvmapobjCloseAll(void) { + u32 pos=0; + + for(pos=0; pos