diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-09-02 17:34:06 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-02 11:34:06 +0200 |
| commit | 994ce41adc2efb811d890dfd28c1d37841630b01 (patch) | |
| tree | 391bbbd6996e268448681523bda913b85291cdc7 /src/wrapped/wrappedlibdrm.c | |
| parent | d8905272818e6355bcebc578c28bd7ac4a0a5975 (diff) | |
| download | box64-994ce41adc2efb811d890dfd28c1d37841630b01.tar.gz box64-994ce41adc2efb811d890dfd28c1d37841630b01.zip | |
[WRAPPER] Wrapped a bunch of symbols (#2997)
Diffstat (limited to 'src/wrapped/wrappedlibdrm.c')
| -rw-r--r-- | src/wrapped/wrappedlibdrm.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/wrapped/wrappedlibdrm.c b/src/wrapped/wrappedlibdrm.c index 73005e57..005c3ee9 100644 --- a/src/wrapped/wrappedlibdrm.c +++ b/src/wrapped/wrappedlibdrm.c @@ -28,6 +28,81 @@ const char* libdrmName = "libdrm.so.2"; #include "wrappercallback.h" + +#define SUPER() \ + GO(0) \ + GO(1) \ + GO(2) \ + GO(3) \ + GO(4) \ + GO(5) \ + GO(6) \ + GO(7) \ + GO(8) \ + GO(9) \ + GO(10) \ + GO(11) \ + GO(12) \ + GO(13) \ + GO(14) \ + GO(15) + +// vblank_handler +#define GO(A) \ + static uintptr_t my_vblank_handler_fct_##A = 0; \ + static void my_vblank_handler_##A(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void* user_data) \ + { \ + RunFunctionFmt(my_vblank_handler_fct_##A, "iuuup", fd, sequence, tv_sec, tv_usec, user_data); \ + } +SUPER() +#undef GO +static void* find_vblank_handlerFct(void* fct) +{ + if (!fct) return fct; + if (GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct); +#define GO(A) \ + if (my_vblank_handler_fct_##A == (uintptr_t)fct) return my_vblank_handler_##A; + SUPER() +#undef GO +#define GO(A) \ + if (my_vblank_handler_fct_##A == 0) { \ + my_vblank_handler_fct_##A = (uintptr_t)fct; \ + return my_vblank_handler_##A; \ + } + SUPER() +#undef GO + printf_log(LOG_NONE, "Warning, no more slot for gobject vblank_handler callback\n"); + return NULL; +} + +// page_flip_handler +#define GO(A) \ + static uintptr_t my_page_flip_handler_fct_##A = 0; \ + static void my_page_flip_handler_##A(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void* user_data) \ + { \ + RunFunctionFmt(my_page_flip_handler_fct_##A, "iuuup", fd, sequence, tv_sec, tv_usec, user_data); \ + } +SUPER() +#undef GO +static void* find_page_flip_handlerFct(void* fct) +{ + if (!fct) return fct; + if (GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct); +#define GO(A) \ + if (my_page_flip_handler_fct_##A == (uintptr_t)fct) return my_page_flip_handler_##A; + SUPER() +#undef GO +#define GO(A) \ + if (my_page_flip_handler_fct_##A == 0) { \ + my_page_flip_handler_fct_##A = (uintptr_t)fct; \ + return my_page_flip_handler_##A; \ + } + SUPER() +#undef GO + printf_log(LOG_NONE, "Warning, no more slot for gobject page_flip_handler callback\n"); + return NULL; +} + EXPORT void my_drmMsg(x64emu_t* emu, void* fmt, void* b) { myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1); PREPARE_VALIST; @@ -38,4 +113,21 @@ EXPORT void my_drmMsg(x64emu_t* emu, void* fmt, void* b) { free(buf); } +typedef struct drmEventContext_s { + int version; + void (*vblank_handler)(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void* user_data); + void (*page_flip_handler)(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void* user_data); +} drmEventContext_t, *drmEventContextPtr_t; + + +EXPORT void my_drmHandleEvent(x64emu_t* emu, int fd, drmEventContextPtr_t evctx) +{ + drmEventContext_t ctx = { 0 }; + ctx.version = evctx->version; + ctx.vblank_handler = find_vblank_handlerFct(evctx->vblank_handler); + ctx.page_flip_handler = find_page_flip_handlerFct(evctx->page_flip_handler); + my->drmHandleEvent(fd, &ctx); +} + + #include "wrappedlib_init.h" |