1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <dlfcn.h>
#include "wrappedlibs.h"
#include "debug.h"
#include "wrapper.h"
#include "bridge.h"
#include "librarian/library_private.h"
#include "x64emu.h"
#include "emu/x64emu_private.h"
#include "callback.h"
#include "librarian.h"
#include "box64context.h"
#include "emu/x64emu_private.h"
#include "myalign.h"
const char* libgluName = "libGLU.so.1";
#define LIBNAME libglu
#include "generated/wrappedlibglutypes.h"
#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) \
// glu_callback
#define GO(A) \
static uintptr_t my_glu_callback_fct_##A = 0; \
static void my_glu_callback_##A(void* a, void* b) \
{ \
RunFunctionFmt(my_glu_callback_fct_##A, "pp", a, b); \
}
SUPER()
#undef GO
static void* findglu_callbackFct(void* fct)
{
if(!fct) return fct;
if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
#define GO(A) if(my_glu_callback_fct_##A == (uintptr_t)fct) return my_glu_callback_##A;
SUPER()
#undef GO
#define GO(A) if(my_glu_callback_fct_##A == 0) {my_glu_callback_fct_##A = (uintptr_t)fct; return my_glu_callback_##A; }
SUPER()
#undef GO
printf_log(LOG_NONE, "Warning, no more slot for Jpeg glu_callback callback\n");
return NULL;
}
// glu_callback4
#define GO(A) \
static uintptr_t my_glu_callback4_fct_##A = 0; \
static void my_glu_callback4_##A(void* a, void* b, void* c, void* d) \
{ \
RunFunctionFmt(my_glu_callback4_fct_##A, "pppp", a, b, c, d); \
}
SUPER()
#undef GO
static void* findglu_callback4Fct(void* fct)
{
if(!fct) return fct;
if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
#define GO(A) if(my_glu_callback4_fct_##A == (uintptr_t)fct) return my_glu_callback4_##A;
SUPER()
#undef GO
#define GO(A) if(my_glu_callback4_fct_##A == 0) {my_glu_callback4_fct_##A = (uintptr_t)fct; return my_glu_callback4_##A; }
SUPER()
#undef GO
printf_log(LOG_NONE, "Warning, no more slot for Jpeg glu_callback4 callback\n");
return NULL;
}
// glu_callback5
#define GO(A) \
static uintptr_t my_glu_callback5_fct_##A = 0; \
static void my_glu_callback5_##A(void* a, void* b, void* c, void* d, void* e) \
{ \
RunFunctionFmt(my_glu_callback5_fct_##A, "ppppp", a, b, c, d, e); \
}
SUPER()
#undef GO
static void* findglu_callback5Fct(void* fct)
{
if(!fct) return fct;
if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct);
#define GO(A) if(my_glu_callback5_fct_##A == (uintptr_t)fct) return my_glu_callback5_##A;
SUPER()
#undef GO
#define GO(A) if(my_glu_callback5_fct_##A == 0) {my_glu_callback5_fct_##A = (uintptr_t)fct; return my_glu_callback5_##A; }
SUPER()
#undef GO
printf_log(LOG_NONE, "Warning, no more slot for Jpeg glu_callback5 callback\n");
return NULL;
}
#undef SUPER
// There are many callback signatures: vFv, vFi, vFp, vFip and vFpp... so a generic wrapping to vFpp works
// except for GLU_TESS_COMBINE and GLU_TESS_COMBINE_DATA
#define GLU_TESS_COMBINE 100105
#define GLU_TESS_COMBINE_DATA 100111
void EXPORT my_gluQuadricCallback(x64emu_t* emu, void* a, uint32_t b, void* cb)
{
(void)emu;
my->gluQuadricCallback(a, b, findglu_callbackFct(cb));
}
void EXPORT my_gluTessCallback(x64emu_t* emu, void* a, uint32_t b, void* cb)
{
(void)emu;
if(b==GLU_TESS_COMBINE)
my->gluTessCallback(a, b, findglu_callback4Fct(cb));
else if(b==GLU_TESS_COMBINE_DATA)
my->gluTessCallback(a, b, findglu_callback5Fct(cb));
else
my->gluTessCallback(a, b, findglu_callbackFct(cb));
}
void EXPORT my_gluNurbsCallback(x64emu_t* emu, void* a, uint32_t b, void* cb)
{
(void)emu;
my->gluNurbsCallback(a, b, findglu_callbackFct(cb));
}
#define NEEDED_LIBS "libGL.so.1"
#include "wrappedlib_init.h"
|