about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-11-28 03:28:10 +0800
committerGitHub <noreply@github.com>2023-11-27 20:28:10 +0100
commit4566ff6d247a231a67c633321a77e38e973f612b (patch)
treef4224fdff7b9186affb827d8ad685b6e2ecccb28 /src
parentcbceca3b35af06e65351ed799185ed29c4161225 (diff)
downloadbox64-4566ff6d247a231a67c633321a77e38e973f612b.tar.gz
box64-4566ff6d247a231a67c633321a77e38e973f612b.zip
[WRAPPERS] Added fallback glXSwapIntervalEXT function if not present (#1092)
* [WRAPPERS] Added fallback glXSwapIntervalEXT function if not present

* Fix glXSwapIntervalEXT signature
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrappedlibgltypes.h4
-rw-r--r--src/wrapped/wrappedlibgl.c45
-rw-r--r--src/wrapped/wrappedlibgl_private.h2
4 files changed, 50 insertions, 3 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 3862a940..9cee1878 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -4314,6 +4314,8 @@ wrappedlibgl:
   - glDebugMessageCallbackKHR
 - vFipp:
   - glProgramCallbackMESA
+- vFppi:
+  - glXSwapIntervalEXT
 wrappedlibglu:
 - vFpip:
   - gluNurbsCallback
diff --git a/src/wrapped/generated/wrappedlibgltypes.h b/src/wrapped/generated/wrappedlibgltypes.h
index 1d6863cb..4d750df0 100644
--- a/src/wrapped/generated/wrappedlibgltypes.h
+++ b/src/wrapped/generated/wrappedlibgltypes.h
@@ -15,6 +15,7 @@ typedef int32_t (*iFi_t)(int32_t);
 typedef void* (*pFp_t)(void*);
 typedef void (*vFpp_t)(void*, void*);
 typedef void (*vFipp_t)(int32_t, void*, void*);
+typedef void (*vFppi_t)(void*, void*, int32_t);
 
 #define SUPER() ADDED_FUNCTIONS() \
 	GO(glXSwapIntervalMESA, iFi_t) \
@@ -25,6 +26,7 @@ typedef void (*vFipp_t)(int32_t, void*, void*);
 	GO(glDebugMessageCallbackAMD, vFpp_t) \
 	GO(glDebugMessageCallbackARB, vFpp_t) \
 	GO(glDebugMessageCallbackKHR, vFpp_t) \
-	GO(glProgramCallbackMESA, vFipp_t)
+	GO(glProgramCallbackMESA, vFipp_t) \
+	GO(glXSwapIntervalEXT, vFppi_t)
 
 #endif // __wrappedlibglTYPES_H_
diff --git a/src/wrapped/wrappedlibgl.c b/src/wrapped/wrappedlibgl.c
index 7712287e..513bd777 100644
--- a/src/wrapped/wrappedlibgl.c
+++ b/src/wrapped/wrappedlibgl.c
@@ -33,6 +33,7 @@ EXPORT void* my_glXGetProcAddressARB(x64emu_t* emu, void* name) __attribute__((a
 
 typedef int  (*iFi_t)(int);
 typedef void (*vFpp_t)(void*, void*);
+typedef void (*vFppi_t)(void*, void*, int);
 typedef void*(*pFp_t)(void*);
 typedef void (*debugProc_t)(int32_t, int32_t, uint32_t, int32_t, int32_t, void*, void*);
 
@@ -201,9 +202,15 @@ static int my_glXSwapIntervalMESA_##A(int interval)     \
 }
 SUPER()
 #undef GO
+
+static int my_dummy_glXSwapIntervalMESA(int interval)
+{
+    return 5; // GLX_BAD_CONTEXT
+}
+
 static void* find_glXSwapIntervalMESA_Fct(void* fct)
 {
-    if(!fct) return fct;
+    if(!fct) return my_dummy_glXSwapIntervalMESA;
     #define GO(A) if(my_glXSwapIntervalMESA_fct_##A == (iFi_t)fct) return my_glXSwapIntervalMESA_##A;
     SUPER()
     #undef GO
@@ -213,6 +220,34 @@ static void* find_glXSwapIntervalMESA_Fct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for libGL glXSwapIntervalMESA callback\n");
     return NULL;
 }
+
+// glXSwapIntervalEXT ...
+#define GO(A)                                                                   \
+static vFppi_t my_glXSwapIntervalEXT_fct_##A = NULL;                            \
+static void my_glXSwapIntervalEXT_##A(void* dpy, void* drawable, int interval)  \
+{                                                                               \
+    if (!my_glXSwapIntervalEXT_fct_##A)                                         \
+        return;                                                                 \
+    my_glXSwapIntervalEXT_fct_##A(dpy, drawable, interval);                     \
+}
+SUPER()
+#undef GO
+
+static void my_dummy_glXSwapIntervalEXT(void* dpy, void* drawable, int interval) {}
+
+static void* find_glXSwapIntervalEXT_Fct(void* fct)
+{
+    if(!fct) return my_dummy_glXSwapIntervalEXT;
+    #define GO(A) if(my_glXSwapIntervalEXT_fct_##A == (vFppi_t)fct) return my_glXSwapIntervalEXT_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_glXSwapIntervalEXT_fct_##A == 0) {my_glXSwapIntervalEXT_fct_##A = (vFppi_t)fct; return my_glXSwapIntervalEXT_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for libGL glXSwapIntervalEXT callback\n");
+    return NULL;
+}
+
 // glProgramCallbackMESA ...
 #define GO(A)                                                               \
 static vFpp_t my_glProgramCallbackMESA_fct_##A = NULL;                      \
@@ -280,6 +315,13 @@ static void* find_glGetVkProcAddrNV_Fct(void* fct)
         s->resolved = 1;                                                        \
         s->addr = (uintptr_t)find_glXSwapIntervalMESA_Fct(symb);                \
     }                                                                           \
+    symb = dlsym(lib->w.lib, "glXSwapIntervalEXT");                             \
+    if(symb) {                                                                  \
+        k = kh_get(symbolmap, lib->w.mysymbolmap, "glXSwapIntervalEXT");        \
+        symbol1_t *s = &kh_value(lib->w.mysymbolmap, k);                        \
+        s->resolved = 1;                                                        \
+        s->addr = (uintptr_t)find_glXSwapIntervalEXT_Fct(symb);                 \
+    }                                                                           \
 
 #include "wrappedlib_init.h"
 
@@ -289,6 +331,7 @@ static void* find_glGetVkProcAddrNV_Fct(void* fct)
  GO(vFpp_t, glDebugMessageCallbackAMD)  \
  GO(vFpp_t, glDebugMessageCallbackKHR)  \
  GO(iFi_t, glXSwapIntervalMESA)         \
+ GO(vFppi_t, glXSwapIntervalEXT)        \
  GO(vFpp_t, glProgramCallbackMESA)      \
  GO(pFp_t, glGetVkProcAddrNV)           \
 
diff --git a/src/wrapped/wrappedlibgl_private.h b/src/wrapped/wrappedlibgl_private.h
index 65d6aa32..b25f26d6 100644
--- a/src/wrapped/wrappedlibgl_private.h
+++ b/src/wrapped/wrappedlibgl_private.h
@@ -3046,7 +3046,7 @@ GO(glXWaitForMscOML, iFppIIIppp)
 GO(glXWaitForSbcOML, iFppIppp)
 
 //GLX_EXT_swap_control
-GO(glXSwapIntervalEXT,pFppi)
+GOM(glXSwapIntervalEXT,vFppi)
 //GLX_EXT_swap_control_tear
 //nothing