diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-11-28 03:28:10 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-27 20:28:10 +0100 |
| commit | 4566ff6d247a231a67c633321a77e38e973f612b (patch) | |
| tree | f4224fdff7b9186affb827d8ad685b6e2ecccb28 /src | |
| parent | cbceca3b35af06e65351ed799185ed29c4161225 (diff) | |
| download | box64-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.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibgltypes.h | 4 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibgl.c | 45 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibgl_private.h | 2 |
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 |