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
|
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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* libdrmName = "libdrm.so.2";
#define ALTNAME "libdrm.so"
#define LIBNAME libdrm
#define ADDED_FUNCTIONS() \
#include "generated/wrappedlibdrmtypes.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) \
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;
char* buf = NULL;
int dummy = vasprintf(&buf, (const char*)fmt, VARARGS);
(void)dummy;
my->drmMsg(buf);
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"
|