From cfffdcc4445ef6e00e0ecded8cfb7b5844fc806f Mon Sep 17 00:00:00 2001 From: yellows8 Date: Tue, 14 Nov 2017 01:16:43 -0500 Subject: [PATCH] Setup the second nvmap obj. --- nx/source/gfx/nvgfx.c | 60 +++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/nx/source/gfx/nvgfx.c b/nx/source/gfx/nvgfx.c index 1fffa6ba..9e8517a9 100644 --- a/nx/source/gfx/nvgfx.c +++ b/nx/source/gfx/nvgfx.c @@ -6,7 +6,7 @@ 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; +static u32 g_nvgfx_nvmapobj0, g_nvgfx_nvmapobj1; static gpu_characteristics g_nvgfx_gpu_characteristics; static u64 g_nvgfx_nvhostasgpu_allocspace_offset; @@ -15,8 +15,8 @@ static u32 g_nvgfx_zcullctxsize; static u32 g_nvgfx_zcullinfo[40>>2]; static nvioctl_va_region g_nvgfx_nvhostasgpu_varegions[2]; -static u8 *g_nvgfx_nvmap_mem; -size_t g_nvgfx_nvmap_mem_size; +static u8 *g_nvgfx_nvmap0_mem, *g_nvgfx_nvmap1_mem; +size_t g_nvgfx_nvmap0_mem_size, g_nvgfx_nvmap1_mem_size; Result nvgfxInitialize(void) { Result rc=0; @@ -26,6 +26,9 @@ Result nvgfxInitialize(void) { g_nvgfx_fd_nvhostasgpu = 0; g_nvgfx_fd_nvmap = 0; g_nvgfx_nvmapobj0 = 0; + g_nvgfx_nvmapobj1 = 0; + g_nvgfx_nvmap0_mem = NULL; + g_nvgfx_nvmap1_mem = NULL; memset(&g_nvgfx_gpu_characteristics, 0, sizeof(gpu_characteristics)); memset(g_nvgfx_tpcmasks, 0, sizeof(g_nvgfx_tpcmasks)); @@ -34,12 +37,19 @@ Result nvgfxInitialize(void) { g_nvgfx_nvhostasgpu_allocspace_offset = 0; g_nvgfx_zcullctxsize = 0; - g_nvgfx_nvmap_mem_size = 0x1000; + g_nvgfx_nvmap0_mem_size = 0x1000; + g_nvgfx_nvmap1_mem_size = 0x10000; if (R_SUCCEEDED(rc)) { - g_nvgfx_nvmap_mem = memalign(0x1000, g_nvgfx_nvmap_mem_size); - if (g_nvgfx_nvmap_mem==NULL) rc = MAKERESULT(MODULE_LIBNX, LIBNX_OUTOFMEM); - if (R_SUCCEEDED(rc)) memset(g_nvgfx_nvmap_mem, 0, g_nvgfx_nvmap_mem_size); + g_nvgfx_nvmap0_mem = memalign(0x1000, g_nvgfx_nvmap0_mem_size); + if (g_nvgfx_nvmap0_mem==NULL) rc = MAKERESULT(MODULE_LIBNX, LIBNX_OUTOFMEM); + if (R_SUCCEEDED(rc)) memset(g_nvgfx_nvmap0_mem, 0, g_nvgfx_nvmap0_mem_size); + } + + if (R_SUCCEEDED(rc)) { + g_nvgfx_nvmap1_mem = memalign(0x1000, g_nvgfx_nvmap1_mem_size); + if (g_nvgfx_nvmap1_mem==NULL) rc = MAKERESULT(MODULE_LIBNX, LIBNX_OUTOFMEM); + if (R_SUCCEEDED(rc)) memset(g_nvgfx_nvmap1_mem, 0, g_nvgfx_nvmap1_mem_size); } //Officially NVHOST_IOCTL_CTRL_GET_CONFIG is used a lot (here and later), skip that. @@ -62,22 +72,33 @@ Result nvgfxInitialize(void) { if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_AllocSpace(g_nvgfx_fd_nvhostasgpu, 0x10000, 0x20000, 0, 0x10000, &g_nvgfx_nvhostasgpu_allocspace_offset); if (R_SUCCEEDED(rc)) rc = nvOpen(&g_nvgfx_fd_nvmap, "/dev/nvmap"); - if (R_SUCCEEDED(rc)) rc = nvioctlNvmap_Create(g_nvgfx_fd_nvmap, g_nvgfx_nvmap_mem_size, &g_nvgfx_nvmapobj0); - - if (R_SUCCEEDED(rc)) rc = nvioctlNvmap_Alloc(g_nvgfx_fd_nvmap, g_nvgfx_nvmapobj0, 0, 0, 0x20000, 0, g_nvgfx_nvmap_mem); + if (R_SUCCEEDED(rc)) rc = nvioctlNvmap_Create(g_nvgfx_fd_nvmap, g_nvgfx_nvmap0_mem_size, &g_nvgfx_nvmapobj0); + if (R_SUCCEEDED(rc)) rc = nvioctlNvmap_Alloc(g_nvgfx_fd_nvmap, g_nvgfx_nvmapobj0, 0, 0, 0x20000, 0, g_nvgfx_nvmap0_mem); if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 0, 0, g_nvgfx_nvmapobj0, 0x10000, 0, 0, NULL); if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 0, 0xfe, g_nvgfx_nvmapobj0, 0x10000, 0, 0, NULL); - //if (R_SUCCEEDED(rc)) rc = -1; + + if (R_SUCCEEDED(rc)) rc = nvioctlNvmap_Create(g_nvgfx_fd_nvmap, g_nvgfx_nvmap1_mem_size, &g_nvgfx_nvmapobj1); + if (R_SUCCEEDED(rc)) rc = nvioctlNvmap_Alloc(g_nvgfx_fd_nvmap, g_nvgfx_nvmapobj1, 0, 0, 0x20000, 0, g_nvgfx_nvmap1_mem); + + //Currently broken. + if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 5, 0, g_nvgfx_nvmapobj1, 0x10000, 0, 0x10000, NULL); + if (R_SUCCEEDED(rc)) rc = -1; + if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 4, 0xfe, g_nvgfx_nvmapobj1, 0x10000, 0, 0, NULL); if (R_FAILED(rc)) { nvClose(g_nvgfx_fd_nvmap); nvClose(g_nvgfx_fd_nvhostasgpu); nvClose(g_nvgfx_fd_nvhostctrlgpu); - if (g_nvgfx_nvmap_mem) { - free(g_nvgfx_nvmap_mem); - g_nvgfx_nvmap_mem = NULL; + if (g_nvgfx_nvmap0_mem) { + free(g_nvgfx_nvmap0_mem); + g_nvgfx_nvmap0_mem = NULL; + } + + if (g_nvgfx_nvmap1_mem) { + free(g_nvgfx_nvmap1_mem); + g_nvgfx_nvmap1_mem = NULL; } } @@ -96,9 +117,14 @@ void nvgfxExit(void) { g_nvgfx_fd_nvhostasgpu = 0; g_nvgfx_fd_nvhostctrlgpu = 0; - if (g_nvgfx_nvmap_mem) { - free(g_nvgfx_nvmap_mem); - g_nvgfx_nvmap_mem = NULL; + if (g_nvgfx_nvmap0_mem) { + free(g_nvgfx_nvmap0_mem); + g_nvgfx_nvmap0_mem = NULL; + } + + if (g_nvgfx_nvmap1_mem) { + free(g_nvgfx_nvmap1_mem); + g_nvgfx_nvmap1_mem = NULL; } g_nvgfxInitialized = 0;