Skip to content

Commit 25fb816

Browse files
Libretro rewrite (#3212)
* redo all the libretro stuff in pure C# also yes i imported snprintf lol * also remove these * remove clib hack, it doesn't work when there's more than 1 param (apparently ... is really just a variable num of args passed on the stack and not some pointer to some struct, and c# doesn't have any way of representing this. fallback log isn't bad to deal with anyways) * also probably want this to return false * /s/UnmanagedString/PinnedString/ * misc tweaks * oops * Libretro "Bridge", with entirely different design. The bridge here simply handles all the callbacks retro cores use, so there is never a c++ -> .NET callback, and probably avoids any libco issues also a lot of cleanup in various areas, and some bug fixes too (Blit555 now outputs the correct colors) * use blipbuffer instead of speex speex seems to perform much worse often (and outright buggy for some libretro cores like sameboy which reports a sample rate of 384000), and blip works well enough even for "newer" systems * cleanup and linux build * cleanup and bugfixes (thanks uninitalized variables) * oops * misc and cleanup * fix load no game, also handle load game failures correctly
1 parent 635fff6 commit 25fb816

40 files changed

+2415
-6659
lines changed

Assets/dll/LibretroBridge.dll

-134 KB
Binary file not shown.

Assets/dll/LibretroBridge.so

-27.3 KB
Binary file not shown.

Assets/dll/libLibretroBridge.dll

243 KB
Binary file not shown.

Assets/dll/libLibretroBridge.so

31.4 KB
Binary file not shown.

LibretroBridge/LibretroBridge.cpp

Lines changed: 692 additions & 0 deletions
Large diffs are not rendered by default.

LibretroBridge/LibretroBridge.h

Lines changed: 350 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,350 @@
1+
#include <cstdint>
2+
#include <climits>
3+
4+
typedef std::int8_t s8;
5+
typedef std::int16_t s16;
6+
typedef std::int32_t s32;
7+
typedef std::int64_t s64;
8+
9+
typedef std::uint8_t u8;
10+
typedef std::uint16_t u16;
11+
typedef std::uint32_t u32;
12+
typedef std::uint64_t u64;
13+
14+
typedef u8 boolean;
15+
16+
#define EXPORT extern "C" __attribute__((visibility("default")))
17+
18+
enum class RETRO_ENVIRONMENT {
19+
EXPERIMENTAL = 0x10000,
20+
SET_ROTATION = 1,
21+
GET_OVERSCAN = 2,
22+
GET_CAN_DUPE = 3,
23+
SET_MESSAGE = 6,
24+
SHUTDOWN = 7,
25+
SET_PERFORMANCE_LEVEL = 8,
26+
GET_SYSTEM_DIRECTORY = 9,
27+
SET_PIXEL_FORMAT = 10,
28+
SET_INPUT_DESCRIPTORS = 11,
29+
SET_KEYBOARD_CALLBACK = 12,
30+
SET_DISK_CONTROL_INTERFACE = 13,
31+
SET_HW_RENDER = 14,
32+
GET_VARIABLE = 15,
33+
SET_VARIABLES = 16,
34+
GET_VARIABLE_UPDATE = 17,
35+
SET_SUPPORT_NO_GAME = 18,
36+
GET_LIBRETRO_PATH = 19,
37+
SET_AUDIO_CALLBACK = 22,
38+
SET_FRAME_TIME_CALLBACK = 21,
39+
GET_RUMBLE_INTERFACE = 23,
40+
GET_INPUT_DEVICE_CAPABILITIES = 24,
41+
GET_SENSOR_INTERFACE = 25 | RETRO_ENVIRONMENT::EXPERIMENTAL,
42+
GET_CAMERA_INTERFACE = 26 | RETRO_ENVIRONMENT::EXPERIMENTAL,
43+
GET_LOG_INTERFACE = 27,
44+
GET_PERF_INTERFACE = 28,
45+
GET_LOCATION_INTERFACE = 29,
46+
GET_CONTENT_DIRECTORY = 30,
47+
GET_CORE_ASSETS_DIRECTORY = 30,
48+
GET_SAVE_DIRECTORY = 31,
49+
SET_SYSTEM_AV_INFO = 32,
50+
SET_PROC_ADDRESS_CALLBACK = 33,
51+
SET_SUBSYSTEM_INFO = 34,
52+
SET_CONTROLLER_INFO = 35,
53+
SET_MEMORY_MAPS = 36 | RETRO_ENVIRONMENT::EXPERIMENTAL,
54+
SET_GEOMETRY = 37,
55+
GET_USERNAME = 38,
56+
GET_LANGUAGE = 39,
57+
GET_CURRENT_SOFTWARE_FRAMEBUFFER = 40 | RETRO_ENVIRONMENT::EXPERIMENTAL,
58+
GET_HW_RENDER_INTERFACE = 41 | RETRO_ENVIRONMENT::EXPERIMENTAL,
59+
SET_SUPPORT_ACHIEVEMENTS = 42 | RETRO_ENVIRONMENT::EXPERIMENTAL,
60+
SET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE = 43 | RETRO_ENVIRONMENT::EXPERIMENTAL,
61+
SET_SERIALIZATION_QUIRKS = 44,
62+
};
63+
64+
enum class RETRO_DEVICE {
65+
NONE = 0,
66+
JOYPAD = 1,
67+
MOUSE = 2,
68+
KEYBOARD = 3,
69+
LIGHTGUN = 4,
70+
ANALOG = 5,
71+
POINTER = 6,
72+
SENSOR_ACCELEROMETER = 7,
73+
74+
LAST,
75+
};
76+
77+
enum class RETRO_DEVICE_ID_ANALOG {
78+
X = 0,
79+
Y = 1,
80+
81+
LAST,
82+
};
83+
84+
enum class RETRO_DEVICE_ID_MOUSE {
85+
X = 0,
86+
Y = 1,
87+
LEFT = 2,
88+
RIGHT = 3,
89+
90+
LAST,
91+
};
92+
93+
enum class RETRO_DEVICE_ID_LIGHTGUN {
94+
X = 0,
95+
Y = 1,
96+
TRIGGER = 2,
97+
CURSOR = 3,
98+
TURBO = 4,
99+
PAUSE = 5,
100+
START = 6,
101+
102+
LAST,
103+
};
104+
105+
enum class RETRO_DEVICE_ID_POINTER {
106+
X = 0,
107+
Y = 1,
108+
PRESSED = 2,
109+
110+
LAST,
111+
};
112+
113+
enum class RETRO_KEY {
114+
UNKNOWN = 0,
115+
FIRST = 0,
116+
BACKSPACE = 8,
117+
TAB = 9,
118+
CLEAR = 12,
119+
RETURN = 13,
120+
PAUSE = 19,
121+
ESCAPE = 27,
122+
SPACE = 32,
123+
EXCLAIM = 33,
124+
QUOTEDBL = 34,
125+
HASH = 35,
126+
DOLLAR = 36,
127+
AMPERSAND = 38,
128+
QUOTE = 39,
129+
LEFTPAREN = 40,
130+
RIGHTPAREN = 41,
131+
ASTERISK = 42,
132+
PLUS = 43,
133+
COMMA = 44,
134+
MINUS = 45,
135+
PERIOD = 46,
136+
SLASH = 47,
137+
_0 = 48,
138+
_1 = 49,
139+
_2 = 50,
140+
_3 = 51,
141+
_4 = 52,
142+
_5 = 53,
143+
_6 = 54,
144+
_7 = 55,
145+
_8 = 56,
146+
_9 = 57,
147+
COLON = 58,
148+
SEMICOLON = 59,
149+
LESS = 60,
150+
EQUALS = 61,
151+
GREATER = 62,
152+
QUESTION = 63,
153+
AT = 64,
154+
LEFTBRACKET = 91,
155+
BACKSLASH = 92,
156+
RIGHTBRACKET = 93,
157+
CARET = 94,
158+
UNDERSCORE = 95,
159+
BACKQUOTE = 96,
160+
a = 97,
161+
b = 98,
162+
c = 99,
163+
d = 100,
164+
e = 101,
165+
f = 102,
166+
g = 103,
167+
h = 104,
168+
i = 105,
169+
j = 106,
170+
k = 107,
171+
l = 108,
172+
m = 109,
173+
n = 110,
174+
o = 111,
175+
p = 112,
176+
q = 113,
177+
r = 114,
178+
s = 115,
179+
t = 116,
180+
u = 117,
181+
v = 118,
182+
w = 119,
183+
x = 120,
184+
y = 121,
185+
z = 122,
186+
DELETE = 127,
187+
188+
KP0 = 256,
189+
KP1 = 257,
190+
KP2 = 258,
191+
KP3 = 259,
192+
KP4 = 260,
193+
KP5 = 261,
194+
KP6 = 262,
195+
KP7 = 263,
196+
KP8 = 264,
197+
KP9 = 265,
198+
KP_PERIOD = 266,
199+
KP_DIVIDE = 267,
200+
KP_MULTIPLY = 268,
201+
KP_MINUS = 269,
202+
KP_PLUS = 270,
203+
KP_ENTER = 271,
204+
KP_EQUALS = 272,
205+
206+
UP = 273,
207+
DOWN = 274,
208+
RIGHT = 275,
209+
LEFT = 276,
210+
INSERT = 277,
211+
HOME = 278,
212+
END = 279,
213+
PAGEUP = 280,
214+
PAGEDOWN = 281,
215+
216+
F1 = 282,
217+
F2 = 283,
218+
F3 = 284,
219+
F4 = 285,
220+
F5 = 286,
221+
F6 = 287,
222+
F7 = 288,
223+
F8 = 289,
224+
F9 = 290,
225+
F10 = 291,
226+
F11 = 292,
227+
F12 = 293,
228+
F13 = 294,
229+
F14 = 295,
230+
F15 = 296,
231+
232+
NUMLOCK = 300,
233+
CAPSLOCK = 301,
234+
SCROLLOCK = 302,
235+
RSHIFT = 303,
236+
LSHIFT = 304,
237+
RCTRL = 305,
238+
LCTRL = 306,
239+
RALT = 307,
240+
LALT = 308,
241+
RMETA = 309,
242+
LMETA = 310,
243+
LSUPER = 311,
244+
RSUPER = 312,
245+
MODE = 313,
246+
COMPOSE = 314,
247+
248+
HELP = 315,
249+
PRINT = 316,
250+
SYSREQ = 317,
251+
BREAK = 318,
252+
MENU = 319,
253+
POWER = 320,
254+
EURO = 321,
255+
UNDO = 322,
256+
257+
LAST,
258+
};
259+
260+
enum class RETRO_MOD {
261+
NONE = 0,
262+
SHIFT = 1,
263+
CTRL = 2,
264+
ALT = 4,
265+
META = 8,
266+
NUMLOCK = 16,
267+
CAPSLOCK = 32,
268+
SCROLLLOCK = 64,
269+
};
270+
271+
enum class RETRO_DEVICE_ID_SENSOR_ACCELEROMETER {
272+
X = 0,
273+
Y = 1,
274+
Z = 2,
275+
276+
LAST,
277+
};
278+
279+
enum class RETRO_DEVICE_ID_JOYPAD {
280+
B = 0,
281+
Y = 1,
282+
SELECT = 2,
283+
START = 3,
284+
UP = 4,
285+
DOWN = 5,
286+
LEFT = 6,
287+
RIGHT = 7,
288+
A = 8,
289+
X = 9,
290+
L = 10,
291+
R = 11,
292+
L2 = 12,
293+
R2 = 13,
294+
L3 = 14,
295+
R3 = 15,
296+
297+
LAST,
298+
};
299+
300+
enum class RETRO_PIXEL_FORMAT {
301+
ZRGB1555 = 0,
302+
XRGB8888 = 1,
303+
RGB565 = 2,
304+
UNKNOWN = INT_MAX,
305+
};
306+
307+
enum class RETRO_LANGUAGE {
308+
ENGLISH = 0,
309+
JAPANESE = 1,
310+
FRENCH = 2,
311+
SPANISH = 3,
312+
GERMAN = 4,
313+
ITALIAN = 5,
314+
DUTCH = 6,
315+
PORTUGUESE = 7,
316+
RUSSIAN = 8,
317+
KOREAN = 9,
318+
CHINESE_TRADITIONAL = 10,
319+
CHINESE_SIMPLIFIED = 11,
320+
ESPERANTO = 12,
321+
POLISH = 13,
322+
VIETNAMESE = 14,
323+
LAST,
324+
325+
DUMMY = INT_MAX,
326+
};
327+
328+
enum class RETRO_LOG {
329+
DEBUG = 0,
330+
INFO,
331+
WARN,
332+
ERROR,
333+
DUMMY = INT_MAX,
334+
};
335+
336+
struct retro_variable {
337+
const char* key;
338+
const char* value;
339+
};
340+
341+
struct retro_message {
342+
const char* msg;
343+
u32 frames;
344+
};
345+
346+
typedef void (*retro_log_printf_t)(RETRO_LOG level, const char* fmt, ...);
347+
348+
struct retro_log_callback {
349+
retro_log_printf_t log;
350+
};

LibretroBridge/Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
CXX = g++
2+
3+
CFLAGS = -Wall -Wextra -Wpedantic -std=c++11 -O3 -fPIC -fvisibility=hidden -fomit-frame-pointer -fno-exceptions
4+
LFLAGS = -shared
5+
6+
SRCS = LibretroBridge.cpp
7+
8+
ifeq ($(OS),Windows_NT)
9+
TARGET = ../Assets/dll/libLibretroBridge.dll
10+
else
11+
TARGET = ../Assets/dll/libLibretroBridge.so
12+
endif
13+
14+
all: libLibretroBridge
15+
16+
libLibretroBridge: $(SRCS)
17+
$(CXX) $(CFLAGS) $(SRCS) -o $(TARGET) $(LFLAGS)

0 commit comments

Comments
 (0)