about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedlibdrm.c
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-09-02 17:34:06 +0800
committerGitHub <noreply@github.com>2025-09-02 11:34:06 +0200
commit994ce41adc2efb811d890dfd28c1d37841630b01 (patch)
tree391bbbd6996e268448681523bda913b85291cdc7 /src/wrapped/wrappedlibdrm.c
parentd8905272818e6355bcebc578c28bd7ac4a0a5975 (diff)
downloadbox64-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.c92
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"