diff --git a/src/memory.cpp b/src/memory.cpp new file mode 100644 index 0000000..3ff89db --- /dev/null +++ b/src/memory.cpp @@ -0,0 +1,34 @@ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static VideoMemoryAllocFunction vid_mem_alloc_ptr __attribute__((section(".data"))) = NULL; +static VideoMemoryFreeFunction vid_mem_free_ptr __attribute__((section(".data"))) = NULL; + +void WUPS_InitVidMem(wups_loader_init_vid_mem_args_t args) { + vid_mem_alloc_ptr = args.vid_mem_alloc_ptr; + vid_mem_free_ptr = args.vid_mem_free_ptr; +} + +void * WUPS_VideoMemMemalign(uint32_t size, int32_t align) { + if(vid_mem_alloc_ptr != NULL) { + return vid_mem_alloc_ptr(size, align); + } + return 0; +} + +void * WUPS_VideoMemAlloc(uint32_t size) { + return WUPS_VideoMemMemalign(size, 4); +} + +void WUPS_VideoMemFree(void *addr) { + if(vid_mem_free_ptr != NULL) { + vid_mem_free_ptr(addr); + } +} + +#ifdef __cplusplus +} +#endif diff --git a/wups_include/wups/hooks.h b/wups_include/wups/hooks.h index dc2b597..9ed93b6 100644 --- a/wups_include/wups/hooks.h +++ b/wups_include/wups/hooks.h @@ -46,6 +46,7 @@ typedef enum wups_loader_hook_type_t { WUPS_LOADER_HOOK_INIT_KERNEL, /* Only for internal usage */ WUPS_LOADER_HOOK_GET_CONFIG, /* Called when the config-menu will be loaded */ + WUPS_LOADER_HOOK_INIT_VID_MEM, /* Only for internal usage */ } wups_loader_hook_type_t; typedef struct wups_loader_hook_t { @@ -80,6 +81,13 @@ typedef struct wups_loader_app_started_args_t { WUPS_InitOverlay(args);\ } +#define WUPS_USE_VIDEO_MEMORY() \ + void init_vid_mem(wups_loader_init_vid_mem_args_t);\ + WUPS_HOOK_EX(WUPS_LOADER_HOOK_INIT_VID_MEM,init_vid_mem); \ + void init_vid_mem(wups_loader_init_vid_mem_args_t args){ \ + WUPS_InitVidMem(args);\ + } + #define WUPS_ALLOW_KERNEL() \ void init_kernel(wups_loader_init_kernel_args_t);\ WUPS_HOOK_EX(WUPS_LOADER_HOOK_INIT_KERNEL,init_kernel); \ diff --git a/wups_include/wups/utils.h b/wups_include/wups/utils.h index 840f270..f88bb78 100644 --- a/wups_include/wups/utils.h +++ b/wups_include/wups/utils.h @@ -77,6 +77,14 @@ typedef struct wups_loader_init_kernel_args_t_ { KernelCopyDataFunction kern_copy_data_ptr; } wups_loader_init_kernel_args_t; +typedef void* (*VideoMemoryAllocFunction)(uint32_t size, int32_t align); +typedef void (*VideoMemoryFreeFunction)(void *addr); + +typedef struct wups_loader_init_vid_mem_args_t_ { + VideoMemoryAllocFunction vid_mem_alloc_ptr; + VideoMemoryFreeFunction vid_mem_free_ptr; +} wups_loader_init_vid_mem_args_t; + /* Gets called by the framework */ @@ -100,6 +108,12 @@ void WUPS_InitOverlay(wups_loader_init_overlay_args_t args); **/ void WUPS_InitKernel(wups_loader_init_kernel_args_t args); +/** + Sets the function pointers for video mem functions. + If none or NULL pointers is provided, calling the corresponding function has no effect. +**/ +void WUPS_InitVidMem(wups_loader_init_vid_mem_args_t args); + /* Can be called by the user. */ @@ -132,6 +146,12 @@ void WUPS_KernelWrite(void *addr, uint32_t value); **/ void WUPS_KernelCopyDataFunction(uint32_t addr, uint32_t src, uint32_t len); +void * WUPS_VideoMemAlloc(uint32_t size); + +void * WUPS_VideoMemMemalign(uint32_t size, int32_t align); + +void WUPS_VideoMemFree(void *addr); + #ifdef __cplusplus } #endif