Skip to main content

libretro_core/
raw.rs

1#![allow(non_camel_case_types)]
2
3use std::ffi::{c_char, c_void};
4
5pub const RETRO_API_VERSION: u32 = 1;
6pub const RETRO_ENVIRONMENT_EXPERIMENTAL: u32 = 0x10000;
7// ABI flag bit reserved by libretro.h for frontend-private commands.
8#[allow(dead_code)]
9pub const RETRO_ENVIRONMENT_PRIVATE: u32 = 0x20000;
10
11pub const RETRO_DEVICE_TYPE_SHIFT: u32 = 8;
12pub const RETRO_DEVICE_MASK: u32 = (1 << RETRO_DEVICE_TYPE_SHIFT) - 1;
13pub const RETRO_DEVICE_NONE: u32 = 0;
14pub const RETRO_DEVICE_JOYPAD: u32 = 1;
15pub const RETRO_DEVICE_MOUSE: u32 = 2;
16pub const RETRO_DEVICE_KEYBOARD: u32 = 3;
17pub const RETRO_DEVICE_LIGHTGUN: u32 = 4;
18pub const RETRO_DEVICE_ANALOG: u32 = 5;
19pub const RETRO_DEVICE_POINTER: u32 = 6;
20
21pub const RETRO_DEVICE_ID_JOYPAD_B: u32 = 0;
22pub const RETRO_DEVICE_ID_JOYPAD_Y: u32 = 1;
23pub const RETRO_DEVICE_ID_JOYPAD_SELECT: u32 = 2;
24pub const RETRO_DEVICE_ID_JOYPAD_START: u32 = 3;
25pub const RETRO_DEVICE_ID_JOYPAD_UP: u32 = 4;
26pub const RETRO_DEVICE_ID_JOYPAD_DOWN: u32 = 5;
27pub const RETRO_DEVICE_ID_JOYPAD_LEFT: u32 = 6;
28pub const RETRO_DEVICE_ID_JOYPAD_RIGHT: u32 = 7;
29pub const RETRO_DEVICE_ID_JOYPAD_A: u32 = 8;
30pub const RETRO_DEVICE_ID_JOYPAD_X: u32 = 9;
31pub const RETRO_DEVICE_ID_JOYPAD_L: u32 = 10;
32pub const RETRO_DEVICE_ID_JOYPAD_R: u32 = 11;
33pub const RETRO_DEVICE_ID_JOYPAD_L2: u32 = 12;
34pub const RETRO_DEVICE_ID_JOYPAD_R2: u32 = 13;
35pub const RETRO_DEVICE_ID_JOYPAD_L3: u32 = 14;
36pub const RETRO_DEVICE_ID_JOYPAD_R3: u32 = 15;
37pub const RETRO_DEVICE_ID_JOYPAD_MASK: u32 = 256;
38
39pub const RETRO_DEVICE_INDEX_ANALOG_LEFT: u32 = 0;
40pub const RETRO_DEVICE_INDEX_ANALOG_RIGHT: u32 = 1;
41pub const RETRO_DEVICE_INDEX_ANALOG_BUTTON: u32 = 2;
42pub const RETRO_DEVICE_ID_ANALOG_X: u32 = 0;
43pub const RETRO_DEVICE_ID_ANALOG_Y: u32 = 1;
44
45pub const RETRO_DEVICE_ID_MOUSE_X: u32 = 0;
46pub const RETRO_DEVICE_ID_MOUSE_Y: u32 = 1;
47pub const RETRO_DEVICE_ID_MOUSE_LEFT: u32 = 2;
48pub const RETRO_DEVICE_ID_MOUSE_RIGHT: u32 = 3;
49pub const RETRO_DEVICE_ID_MOUSE_WHEELUP: u32 = 4;
50pub const RETRO_DEVICE_ID_MOUSE_WHEELDOWN: u32 = 5;
51pub const RETRO_DEVICE_ID_MOUSE_MIDDLE: u32 = 6;
52pub const RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: u32 = 7;
53pub const RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: u32 = 8;
54pub const RETRO_DEVICE_ID_MOUSE_BUTTON_4: u32 = 9;
55pub const RETRO_DEVICE_ID_MOUSE_BUTTON_5: u32 = 10;
56
57pub const RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: u32 = 13;
58pub const RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: u32 = 14;
59pub const RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: u32 = 15;
60pub const RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: u32 = 2;
61pub const RETRO_DEVICE_ID_LIGHTGUN_CURSOR: u32 = 3;
62pub const RETRO_DEVICE_ID_LIGHTGUN_RELOAD: u32 = 16;
63pub const RETRO_DEVICE_ID_LIGHTGUN_AUX_A: u32 = 3;
64pub const RETRO_DEVICE_ID_LIGHTGUN_AUX_B: u32 = 4;
65pub const RETRO_DEVICE_ID_LIGHTGUN_START: u32 = 6;
66pub const RETRO_DEVICE_ID_LIGHTGUN_SELECT: u32 = 7;
67pub const RETRO_DEVICE_ID_LIGHTGUN_AUX_C: u32 = 8;
68pub const RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: u32 = 9;
69pub const RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: u32 = 10;
70pub const RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: u32 = 11;
71pub const RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: u32 = 12;
72pub const RETRO_DEVICE_ID_LIGHTGUN_X: u32 = 0;
73pub const RETRO_DEVICE_ID_LIGHTGUN_Y: u32 = 1;
74pub const RETRO_DEVICE_ID_LIGHTGUN_TURBO: u32 = 4;
75pub const RETRO_DEVICE_ID_LIGHTGUN_PAUSE: u32 = 5;
76
77pub const RETRO_DEVICE_ID_POINTER_X: u32 = 0;
78pub const RETRO_DEVICE_ID_POINTER_Y: u32 = 1;
79pub const RETRO_DEVICE_ID_POINTER_PRESSED: u32 = 2;
80pub const RETRO_DEVICE_ID_POINTER_COUNT: u32 = 3;
81pub const RETRO_DEVICE_ID_POINTER_IS_OFFSCREEN: u32 = 15;
82
83pub const RETRO_REGION_NTSC: u32 = 0;
84pub const RETRO_REGION_PAL: u32 = 1;
85
86pub const RETRO_MEMORY_MASK: u32 = 0xff;
87pub const RETRO_MEMORY_SAVE_RAM: u32 = 0;
88pub const RETRO_MEMORY_RTC: u32 = 1;
89pub const RETRO_MEMORY_SYSTEM_RAM: u32 = 2;
90pub const RETRO_MEMORY_VIDEO_RAM: u32 = 3;
91pub const RETRO_MEMORY_ROM: u32 = 4;
92
93pub const RETRO_ENVIRONMENT_SET_ROTATION: u32 = 1;
94pub const RETRO_ENVIRONMENT_GET_OVERSCAN: u32 = 2;
95pub const RETRO_ENVIRONMENT_GET_CAN_DUPE: u32 = 3;
96pub const RETRO_ENVIRONMENT_SET_MESSAGE: u32 = 6;
97pub const RETRO_ENVIRONMENT_SHUTDOWN: u32 = 7;
98pub const RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL: u32 = 8;
99pub const RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY: u32 = 9;
100pub const RETRO_ENVIRONMENT_SET_PIXEL_FORMAT: u32 = 10;
101pub const RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS: u32 = 11;
102pub const RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK: u32 = 12;
103pub const RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE: u32 = 13;
104pub const RETRO_ENVIRONMENT_SET_HW_RENDER: u32 = 14;
105pub const RETRO_ENVIRONMENT_GET_VARIABLE: u32 = 15;
106pub const RETRO_ENVIRONMENT_SET_VARIABLES: u32 = 16;
107pub const RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE: u32 = 17;
108pub const RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME: u32 = 18;
109pub const RETRO_ENVIRONMENT_GET_LIBRETRO_PATH: u32 = 19;
110pub const RETRO_ENVIRONMENT_SET_FRAME_TIME_CALLBACK: u32 = 21;
111pub const RETRO_ENVIRONMENT_SET_AUDIO_CALLBACK: u32 = 22;
112pub const RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE: u32 = 23;
113pub const RETRO_ENVIRONMENT_GET_INPUT_DEVICE_CAPABILITIES: u32 = 24;
114pub const RETRO_ENVIRONMENT_GET_SENSOR_INTERFACE: u32 = 25 | RETRO_ENVIRONMENT_EXPERIMENTAL;
115pub const RETRO_ENVIRONMENT_GET_CAMERA_INTERFACE: u32 = 26 | RETRO_ENVIRONMENT_EXPERIMENTAL;
116pub const RETRO_ENVIRONMENT_GET_LOG_INTERFACE: u32 = 27;
117pub const RETRO_ENVIRONMENT_GET_PERF_INTERFACE: u32 = 28;
118pub const RETRO_ENVIRONMENT_GET_LOCATION_INTERFACE: u32 = 29;
119pub const RETRO_ENVIRONMENT_GET_CORE_ASSETS_DIRECTORY: u32 = 30;
120pub const RETRO_ENVIRONMENT_GET_CONTENT_DIRECTORY: u32 = 30;
121pub const RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY: u32 = 31;
122pub const RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO: u32 = 32;
123pub const RETRO_ENVIRONMENT_SET_PROC_ADDRESS_CALLBACK: u32 = 33;
124pub const RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO: u32 = 34;
125pub const RETRO_ENVIRONMENT_SET_CONTROLLER_INFO: u32 = 35;
126pub const RETRO_ENVIRONMENT_SET_MEMORY_MAPS: u32 = 36 | RETRO_ENVIRONMENT_EXPERIMENTAL;
127pub const RETRO_ENVIRONMENT_SET_GEOMETRY: u32 = 37;
128pub const RETRO_ENVIRONMENT_GET_USERNAME: u32 = 38;
129pub const RETRO_ENVIRONMENT_GET_LANGUAGE: u32 = 39;
130pub const RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER: u32 =
131    40 | RETRO_ENVIRONMENT_EXPERIMENTAL;
132pub const RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE: u32 = 41 | RETRO_ENVIRONMENT_EXPERIMENTAL;
133pub const RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS: u32 = 42 | RETRO_ENVIRONMENT_EXPERIMENTAL;
134pub const RETRO_ENVIRONMENT_SET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE: u32 =
135    43 | RETRO_ENVIRONMENT_EXPERIMENTAL;
136pub const RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE: u32 = 47 | RETRO_ENVIRONMENT_EXPERIMENTAL;
137pub const RETRO_ENVIRONMENT_SET_SERIALIZATION_QUIRKS: u32 = 44;
138pub const RETRO_ENVIRONMENT_SET_HW_SHARED_CONTEXT: u32 = 44 | RETRO_ENVIRONMENT_EXPERIMENTAL;
139pub const RETRO_ENVIRONMENT_GET_VFS_INTERFACE: u32 = 45 | RETRO_ENVIRONMENT_EXPERIMENTAL;
140pub const RETRO_ENVIRONMENT_GET_LED_INTERFACE: u32 = 46 | RETRO_ENVIRONMENT_EXPERIMENTAL;
141pub const RETRO_ENVIRONMENT_GET_MIDI_INTERFACE: u32 = 48 | RETRO_ENVIRONMENT_EXPERIMENTAL;
142pub const RETRO_ENVIRONMENT_GET_FASTFORWARDING: u32 = 49 | RETRO_ENVIRONMENT_EXPERIMENTAL;
143pub const RETRO_ENVIRONMENT_GET_TARGET_REFRESH_RATE: u32 = 50 | RETRO_ENVIRONMENT_EXPERIMENTAL;
144pub const RETRO_ENVIRONMENT_GET_INPUT_BITMASKS: u32 = 51 | RETRO_ENVIRONMENT_EXPERIMENTAL;
145pub const RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION: u32 = 52;
146pub const RETRO_ENVIRONMENT_SET_CORE_OPTIONS: u32 = 53;
147pub const RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL: u32 = 54;
148pub const RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY: u32 = 55;
149pub const RETRO_ENVIRONMENT_GET_PREFERRED_HW_RENDER: u32 = 56;
150pub const RETRO_ENVIRONMENT_GET_DISK_CONTROL_INTERFACE_VERSION: u32 = 57;
151pub const RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE: u32 = 58;
152pub const RETRO_ENVIRONMENT_GET_MESSAGE_INTERFACE_VERSION: u32 = 59;
153pub const RETRO_ENVIRONMENT_SET_MESSAGE_EXT: u32 = 60;
154pub const RETRO_ENVIRONMENT_GET_INPUT_MAX_USERS: u32 = 61;
155pub const RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK: u32 = 62;
156pub const RETRO_ENVIRONMENT_SET_MINIMUM_AUDIO_LATENCY: u32 = 63;
157pub const RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE: u32 = 64;
158pub const RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE: u32 = 65;
159pub const RETRO_ENVIRONMENT_GET_GAME_INFO_EXT: u32 = 66;
160pub const RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2: u32 = 67;
161pub const RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL: u32 = 68;
162pub const RETRO_ENVIRONMENT_SET_CORE_OPTIONS_UPDATE_DISPLAY_CALLBACK: u32 = 69;
163pub const RETRO_ENVIRONMENT_SET_VARIABLE: u32 = 70;
164pub const RETRO_ENVIRONMENT_GET_THROTTLE_STATE: u32 = 71 | RETRO_ENVIRONMENT_EXPERIMENTAL;
165pub const RETRO_ENVIRONMENT_GET_SAVESTATE_CONTEXT: u32 = 72 | RETRO_ENVIRONMENT_EXPERIMENTAL;
166pub const RETRO_ENVIRONMENT_GET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_SUPPORT: u32 =
167    73 | RETRO_ENVIRONMENT_EXPERIMENTAL;
168pub const RETRO_ENVIRONMENT_GET_JIT_CAPABLE: u32 = 74;
169pub const RETRO_ENVIRONMENT_GET_MICROPHONE_INTERFACE: u32 = 75 | RETRO_ENVIRONMENT_EXPERIMENTAL;
170pub const RETRO_ENVIRONMENT_GET_DEVICE_POWER: u32 = 77 | RETRO_ENVIRONMENT_EXPERIMENTAL;
171pub const RETRO_ENVIRONMENT_SET_NETPACKET_INTERFACE: u32 = 78;
172pub const RETRO_ENVIRONMENT_GET_PLAYLIST_DIRECTORY: u32 = 79;
173pub const RETRO_ENVIRONMENT_GET_FILE_BROWSER_START_DIRECTORY: u32 = 80;
174pub const RETRO_ENVIRONMENT_GET_TARGET_SAMPLE_RATE: u32 = 81 | RETRO_ENVIRONMENT_EXPERIMENTAL;
175pub const RETRO_ENVIRONMENT_GET_NETPLAY_CLIENT_INDEX: u32 = 82 | RETRO_ENVIRONMENT_EXPERIMENTAL;
176
177pub const RETRO_AV_ENABLE_VIDEO: u32 = 1 << 0;
178pub const RETRO_AV_ENABLE_AUDIO: u32 = 1 << 1;
179pub const RETRO_AV_ENABLE_FAST_SAVESTATES: u32 = 1 << 2;
180pub const RETRO_AV_ENABLE_HARD_DISABLE_AUDIO: u32 = 1 << 3;
181pub const RETRO_THROTTLE_NONE: u32 = 0;
182pub const RETRO_THROTTLE_FRAME_STEPPING: u32 = 1;
183pub const RETRO_THROTTLE_FAST_FORWARD: u32 = 2;
184pub const RETRO_THROTTLE_SLOW_MOTION: u32 = 3;
185pub const RETRO_THROTTLE_REWINDING: u32 = 4;
186pub const RETRO_THROTTLE_VSYNC: u32 = 5;
187pub const RETRO_THROTTLE_UNBLOCKED: u32 = 6;
188pub const RETRO_POWERSTATE_NO_ESTIMATE: i32 = -1;
189pub const RETRO_NETPACKET_UNRELIABLE: i32 = 0;
190pub const RETRO_NETPACKET_RELIABLE: i32 = 1 << 0;
191pub const RETRO_NETPACKET_UNSEQUENCED: i32 = 1 << 1;
192pub const RETRO_NETPACKET_FLUSH_HINT: i32 = 1 << 2;
193pub const RETRO_NETPACKET_BROADCAST: u16 = 0xffff;
194pub const RETRO_MICROPHONE_INTERFACE_VERSION: u32 = 1;
195pub const RETRO_NUM_CORE_OPTION_VALUES_MAX: usize = 128;
196pub const RETRO_SERIALIZATION_QUIRK_INCOMPLETE: u64 = 1 << 0;
197pub const RETRO_SERIALIZATION_QUIRK_MUST_INITIALIZE: u64 = 1 << 1;
198pub const RETRO_SERIALIZATION_QUIRK_CORE_VARIABLE_SIZE: u64 = 1 << 2;
199pub const RETRO_SERIALIZATION_QUIRK_FRONT_VARIABLE_SIZE: u64 = 1 << 3;
200pub const RETRO_SERIALIZATION_QUIRK_SINGLE_SESSION: u64 = 1 << 4;
201pub const RETRO_SERIALIZATION_QUIRK_ENDIAN_DEPENDENT: u64 = 1 << 5;
202pub const RETRO_SERIALIZATION_QUIRK_PLATFORM_DEPENDENT: u64 = 1 << 6;
203pub const RETRO_MEMDESC_CONST: u64 = 1 << 0;
204pub const RETRO_MEMDESC_BIGENDIAN: u64 = 1 << 1;
205pub const RETRO_MEMDESC_SYSTEM_RAM: u64 = 1 << 2;
206pub const RETRO_MEMDESC_SAVE_RAM: u64 = 1 << 3;
207pub const RETRO_MEMDESC_VIDEO_RAM: u64 = 1 << 4;
208pub const RETRO_MEMDESC_ALIGN_2: u64 = 1 << 16;
209pub const RETRO_MEMDESC_ALIGN_4: u64 = 2 << 16;
210pub const RETRO_MEMDESC_ALIGN_8: u64 = 3 << 16;
211pub const RETRO_MEMDESC_MINSIZE_2: u64 = 1 << 24;
212pub const RETRO_MEMDESC_MINSIZE_4: u64 = 2 << 24;
213pub const RETRO_MEMDESC_MINSIZE_8: u64 = 3 << 24;
214pub const RETRO_MEMORY_ACCESS_WRITE: u32 = 1 << 0;
215pub const RETRO_MEMORY_ACCESS_READ: u32 = 1 << 1;
216pub const RETRO_MEMORY_TYPE_CACHED: u32 = 1 << 0;
217pub const RETRO_VFS_FILE_ACCESS_READ: u32 = 1 << 0;
218pub const RETRO_VFS_FILE_ACCESS_WRITE: u32 = 1 << 1;
219#[allow(dead_code)]
220pub const RETRO_VFS_FILE_ACCESS_READ_WRITE: u32 =
221    RETRO_VFS_FILE_ACCESS_READ | RETRO_VFS_FILE_ACCESS_WRITE;
222pub const RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING: u32 = 1 << 2;
223#[allow(dead_code)]
224pub const RETRO_VFS_FILE_ACCESS_HINT_NONE: u32 = 0;
225pub const RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS: u32 = 1 << 0;
226pub const RETRO_VFS_SEEK_POSITION_START: i32 = 0;
227pub const RETRO_VFS_SEEK_POSITION_CURRENT: i32 = 1;
228pub const RETRO_VFS_SEEK_POSITION_END: i32 = 2;
229pub const RETRO_VFS_STAT_IS_VALID: u32 = 1 << 0;
230pub const RETRO_VFS_STAT_IS_DIRECTORY: u32 = 1 << 1;
231pub const RETRO_VFS_STAT_IS_CHARACTER_SPECIAL: u32 = 1 << 2;
232pub const RETRO_SENSOR_ACCELEROMETER_X: u32 = 0;
233pub const RETRO_SENSOR_ACCELEROMETER_Y: u32 = 1;
234pub const RETRO_SENSOR_ACCELEROMETER_Z: u32 = 2;
235pub const RETRO_SENSOR_GYROSCOPE_X: u32 = 3;
236pub const RETRO_SENSOR_GYROSCOPE_Y: u32 = 4;
237pub const RETRO_SENSOR_GYROSCOPE_Z: u32 = 5;
238pub const RETRO_SENSOR_ILLUMINANCE: u32 = 6;
239pub const RETRO_SIMD_SSE: u64 = 1 << 0;
240pub const RETRO_SIMD_SSE2: u64 = 1 << 1;
241pub const RETRO_SIMD_VMX: u64 = 1 << 2;
242pub const RETRO_SIMD_VMX128: u64 = 1 << 3;
243pub const RETRO_SIMD_AVX: u64 = 1 << 4;
244pub const RETRO_SIMD_NEON: u64 = 1 << 5;
245pub const RETRO_SIMD_SSE3: u64 = 1 << 6;
246pub const RETRO_SIMD_SSSE3: u64 = 1 << 7;
247pub const RETRO_SIMD_MMX: u64 = 1 << 8;
248pub const RETRO_SIMD_MMXEXT: u64 = 1 << 9;
249pub const RETRO_SIMD_SSE4: u64 = 1 << 10;
250pub const RETRO_SIMD_SSE42: u64 = 1 << 11;
251pub const RETRO_SIMD_AVX2: u64 = 1 << 12;
252pub const RETRO_SIMD_VFPU: u64 = 1 << 13;
253pub const RETRO_SIMD_PS: u64 = 1 << 14;
254pub const RETRO_SIMD_AES: u64 = 1 << 15;
255pub const RETRO_SIMD_VFPV3: u64 = 1 << 16;
256pub const RETRO_SIMD_VFPV4: u64 = 1 << 17;
257pub const RETRO_SIMD_POPCNT: u64 = 1 << 18;
258pub const RETRO_SIMD_MOVBE: u64 = 1 << 19;
259pub const RETRO_SIMD_CMOV: u64 = 1 << 20;
260pub const RETRO_SIMD_ASIMD: u64 = 1 << 21;
261
262pub const RETRO_HW_FRAME_BUFFER_VALID: *const c_void = usize::MAX as *const c_void;
263
264pub type retro_proc_address_t = Option<unsafe extern "C" fn()>;
265pub type retro_get_proc_address_t =
266    Option<unsafe extern "C" fn(sym: *const c_char) -> retro_proc_address_t>;
267pub type retro_environment_t = Option<unsafe extern "C" fn(cmd: u32, data: *mut c_void) -> bool>;
268pub type retro_video_refresh_t =
269    Option<unsafe extern "C" fn(data: *const c_void, width: u32, height: u32, pitch: usize)>;
270pub type retro_audio_sample_t = Option<unsafe extern "C" fn(left: i16, right: i16)>;
271pub type retro_audio_sample_batch_t =
272    Option<unsafe extern "C" fn(data: *const i16, frames: usize) -> usize>;
273pub type retro_audio_callback_t = Option<unsafe extern "C" fn()>;
274pub type retro_audio_set_state_callback_t = Option<unsafe extern "C" fn(enabled: bool)>;
275pub type retro_audio_buffer_status_callback_t =
276    Option<unsafe extern "C" fn(active: bool, occupancy: u32, underrun_likely: bool)>;
277pub type retro_usec_t = i64;
278pub type retro_frame_time_callback_t = Option<unsafe extern "C" fn(usec: retro_usec_t)>;
279pub type retro_input_poll_t = Option<unsafe extern "C" fn()>;
280pub type retro_input_state_t =
281    Option<unsafe extern "C" fn(port: u32, device: u32, index: u32, id: u32) -> i16>;
282pub type retro_key = u32;
283pub type retro_mod = u16;
284pub type retro_keyboard_event_t = Option<
285    unsafe extern "C" fn(down: bool, keycode: retro_key, character: u32, key_modifiers: retro_mod),
286>;
287pub type retro_log_printf_t =
288    Option<unsafe extern "C" fn(level: retro_log_level, fmt: *const c_char, ...)>;
289pub type retro_set_led_state_t = Option<unsafe extern "C" fn(led: i32, state: i32)>;
290pub type retro_set_rumble_state_t =
291    Option<unsafe extern "C" fn(port: u32, effect: retro_rumble_effect, strength: u16) -> bool>;
292pub type retro_set_sensor_state_t =
293    Option<unsafe extern "C" fn(port: u32, action: retro_sensor_action, rate: u32) -> bool>;
294pub type retro_sensor_get_input_t = Option<unsafe extern "C" fn(port: u32, id: u32) -> f32>;
295pub type retro_location_set_interval_t =
296    Option<unsafe extern "C" fn(interval_ms: u32, interval_distance: u32)>;
297pub type retro_location_start_t = Option<unsafe extern "C" fn() -> bool>;
298pub type retro_location_stop_t = Option<unsafe extern "C" fn()>;
299pub type retro_location_get_position_t = Option<
300    unsafe extern "C" fn(
301        lat: *mut f64,
302        lon: *mut f64,
303        horiz_accuracy: *mut f64,
304        vert_accuracy: *mut f64,
305    ) -> bool,
306>;
307pub type retro_location_lifetime_status_t = Option<unsafe extern "C" fn()>;
308pub type retro_camera_start_t = Option<unsafe extern "C" fn() -> bool>;
309pub type retro_camera_stop_t = Option<unsafe extern "C" fn()>;
310pub type retro_camera_lifetime_status_t = Option<unsafe extern "C" fn()>;
311pub type retro_camera_frame_raw_framebuffer_t =
312    Option<unsafe extern "C" fn(buffer: *const u32, width: u32, height: u32, pitch: usize)>;
313pub type retro_camera_frame_opengl_texture_t =
314    Option<unsafe extern "C" fn(texture_id: u32, texture_target: u32, affine: *const f32)>;
315pub type retro_set_eject_state_t = Option<unsafe extern "C" fn(ejected: bool) -> bool>;
316pub type retro_get_eject_state_t = Option<unsafe extern "C" fn() -> bool>;
317pub type retro_get_image_index_t = Option<unsafe extern "C" fn() -> u32>;
318pub type retro_set_image_index_t = Option<unsafe extern "C" fn(index: u32) -> bool>;
319pub type retro_get_num_images_t = Option<unsafe extern "C" fn() -> u32>;
320pub type retro_replace_image_index_t =
321    Option<unsafe extern "C" fn(index: u32, info: *const retro_game_info) -> bool>;
322pub type retro_add_image_index_t = Option<unsafe extern "C" fn() -> bool>;
323pub type retro_set_initial_image_t =
324    Option<unsafe extern "C" fn(index: u32, path: *const c_char) -> bool>;
325pub type retro_get_image_path_t =
326    Option<unsafe extern "C" fn(index: u32, s: *mut c_char, len: usize) -> bool>;
327pub type retro_get_image_label_t =
328    Option<unsafe extern "C" fn(index: u32, s: *mut c_char, len: usize) -> bool>;
329pub type retro_netpacket_send_t =
330    Option<unsafe extern "C" fn(flags: i32, buf: *const c_void, len: usize, client_id: u16)>;
331pub type retro_netpacket_poll_receive_t = Option<unsafe extern "C" fn()>;
332pub type retro_netpacket_start_t = Option<
333    unsafe extern "C" fn(
334        client_id: u16,
335        send_fn: retro_netpacket_send_t,
336        poll_receive_fn: retro_netpacket_poll_receive_t,
337    ),
338>;
339pub type retro_netpacket_receive_t =
340    Option<unsafe extern "C" fn(buf: *const c_void, len: usize, client_id: u16)>;
341pub type retro_netpacket_stop_t = Option<unsafe extern "C" fn()>;
342pub type retro_netpacket_poll_t = Option<unsafe extern "C" fn()>;
343pub type retro_netpacket_connected_t = Option<unsafe extern "C" fn(client_id: u16) -> bool>;
344pub type retro_netpacket_disconnected_t = Option<unsafe extern "C" fn(client_id: u16)>;
345pub type retro_open_mic_t =
346    Option<unsafe extern "C" fn(params: *const retro_microphone_params) -> *mut retro_microphone>;
347pub type retro_close_mic_t = Option<unsafe extern "C" fn(microphone: *mut retro_microphone)>;
348pub type retro_get_mic_params_t = Option<
349    unsafe extern "C" fn(
350        microphone: *const retro_microphone,
351        params: *mut retro_microphone_params,
352    ) -> bool,
353>;
354pub type retro_set_mic_state_t =
355    Option<unsafe extern "C" fn(microphone: *mut retro_microphone, state: bool) -> bool>;
356pub type retro_get_mic_state_t =
357    Option<unsafe extern "C" fn(microphone: *const retro_microphone) -> bool>;
358pub type retro_read_mic_t = Option<
359    unsafe extern "C" fn(
360        microphone: *mut retro_microphone,
361        samples: *mut i16,
362        num_samples: usize,
363    ) -> i32,
364>;
365pub type retro_midi_input_enabled_t = Option<unsafe extern "C" fn() -> bool>;
366pub type retro_midi_output_enabled_t = Option<unsafe extern "C" fn() -> bool>;
367pub type retro_midi_read_t = Option<unsafe extern "C" fn(byte: *mut u8) -> bool>;
368pub type retro_midi_write_t = Option<unsafe extern "C" fn(byte: u8, delta_time: u32) -> bool>;
369pub type retro_midi_flush_t = Option<unsafe extern "C" fn() -> bool>;
370pub type retro_core_options_update_display_callback_t = Option<unsafe extern "C" fn() -> bool>;
371pub type retro_vfs_get_path_t =
372    Option<unsafe extern "C" fn(stream: *mut retro_vfs_file_handle) -> *const c_char>;
373pub type retro_vfs_open_t = Option<
374    unsafe extern "C" fn(path: *const c_char, mode: u32, hints: u32) -> *mut retro_vfs_file_handle,
375>;
376pub type retro_vfs_close_t =
377    Option<unsafe extern "C" fn(stream: *mut retro_vfs_file_handle) -> i32>;
378pub type retro_vfs_size_t = Option<unsafe extern "C" fn(stream: *mut retro_vfs_file_handle) -> i64>;
379pub type retro_vfs_truncate_t =
380    Option<unsafe extern "C" fn(stream: *mut retro_vfs_file_handle, length: i64) -> i64>;
381pub type retro_vfs_tell_t = Option<unsafe extern "C" fn(stream: *mut retro_vfs_file_handle) -> i64>;
382pub type retro_vfs_seek_t = Option<
383    unsafe extern "C" fn(
384        stream: *mut retro_vfs_file_handle,
385        offset: i64,
386        seek_position: i32,
387    ) -> i64,
388>;
389pub type retro_vfs_read_t = Option<
390    unsafe extern "C" fn(stream: *mut retro_vfs_file_handle, s: *mut c_void, len: u64) -> i64,
391>;
392pub type retro_vfs_write_t = Option<
393    unsafe extern "C" fn(stream: *mut retro_vfs_file_handle, s: *const c_void, len: u64) -> i64,
394>;
395pub type retro_vfs_flush_t =
396    Option<unsafe extern "C" fn(stream: *mut retro_vfs_file_handle) -> i32>;
397pub type retro_vfs_remove_t = Option<unsafe extern "C" fn(path: *const c_char) -> i32>;
398pub type retro_vfs_rename_t =
399    Option<unsafe extern "C" fn(old_path: *const c_char, new_path: *const c_char) -> i32>;
400pub type retro_vfs_stat_t =
401    Option<unsafe extern "C" fn(path: *const c_char, size: *mut i32) -> i32>;
402pub type retro_vfs_mkdir_t = Option<unsafe extern "C" fn(dir: *const c_char) -> i32>;
403pub type retro_vfs_opendir_t = Option<
404    unsafe extern "C" fn(dir: *const c_char, include_hidden: bool) -> *mut retro_vfs_dir_handle,
405>;
406pub type retro_vfs_readdir_t =
407    Option<unsafe extern "C" fn(dirstream: *mut retro_vfs_dir_handle) -> bool>;
408pub type retro_vfs_dirent_get_name_t =
409    Option<unsafe extern "C" fn(dirstream: *mut retro_vfs_dir_handle) -> *const c_char>;
410pub type retro_vfs_dirent_is_dir_t =
411    Option<unsafe extern "C" fn(dirstream: *mut retro_vfs_dir_handle) -> bool>;
412pub type retro_vfs_closedir_t =
413    Option<unsafe extern "C" fn(dirstream: *mut retro_vfs_dir_handle) -> i32>;
414pub type retro_perf_tick_t = u64;
415pub type retro_time_t = i64;
416pub type retro_perf_get_time_usec_t = Option<unsafe extern "C" fn() -> retro_time_t>;
417pub type retro_perf_get_counter_t = Option<unsafe extern "C" fn() -> retro_perf_tick_t>;
418pub type retro_get_cpu_features_t = Option<unsafe extern "C" fn() -> u64>;
419pub type retro_perf_log_t = Option<unsafe extern "C" fn()>;
420pub type retro_perf_register_t = Option<unsafe extern "C" fn(counter: *mut retro_perf_counter)>;
421pub type retro_perf_start_t = Option<unsafe extern "C" fn(counter: *mut retro_perf_counter)>;
422pub type retro_perf_stop_t = Option<unsafe extern "C" fn(counter: *mut retro_perf_counter)>;
423pub type retro_hw_context_reset_t = Option<unsafe extern "C" fn()>;
424pub type retro_hw_get_current_framebuffer_t = Option<unsafe extern "C" fn() -> usize>;
425pub type retro_hw_get_proc_address_t =
426    Option<unsafe extern "C" fn(sym: *const c_char) -> retro_proc_address_t>;
427
428#[repr(i32)]
429#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
430pub enum retro_hw_context_type {
431    #[default]
432    None = 0,
433    OpenGl = 1,
434    OpenGlEs2 = 2,
435    OpenGlCore = 3,
436    OpenGlEs3 = 4,
437    OpenGlEsVersion = 5,
438    Vulkan = 6,
439    D3d11 = 7,
440    D3d10 = 8,
441    D3d12 = 9,
442    D3d9 = 10,
443}
444
445#[repr(i32)]
446#[derive(Clone, Copy, Debug, PartialEq, Eq)]
447pub enum retro_hw_render_interface_type {
448    Vulkan = 0,
449    D3d9 = 1,
450    D3d10 = 2,
451    D3d11 = 3,
452    D3d12 = 4,
453    GskitPs2 = 5,
454}
455
456#[repr(i32)]
457#[derive(Clone, Copy, Debug, PartialEq, Eq)]
458pub enum retro_hw_render_context_negotiation_interface_type {
459    Vulkan = 0,
460}
461
462#[repr(i32)]
463#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
464pub enum retro_pixel_format {
465    #[default]
466    _0Rgb1555 = 0,
467    Xrgb8888 = 1,
468    Rgb565 = 2,
469}
470
471#[repr(u32)]
472#[derive(Clone, Copy, Debug, PartialEq, Eq)]
473pub enum retro_camera_buffer {
474    OpenGlTexture = 0,
475    RawFramebuffer = 1,
476}
477
478#[repr(i32)]
479#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
480pub enum retro_rumble_effect {
481    #[default]
482    Strong = 0,
483    Weak = 1,
484}
485
486#[repr(i32)]
487#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
488pub enum retro_sensor_action {
489    #[default]
490    AccelerometerEnable = 0,
491    AccelerometerDisable = 1,
492    GyroscopeEnable = 2,
493    GyroscopeDisable = 3,
494    IlluminanceEnable = 4,
495    IlluminanceDisable = 5,
496}
497
498#[repr(i32)]
499#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
500pub enum retro_log_level {
501    #[default]
502    Debug = 0,
503    Info = 1,
504    Warn = 2,
505    Error = 3,
506}
507
508#[repr(i32)]
509#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
510pub enum retro_message_target {
511    #[default]
512    All = 0,
513    Osd = 1,
514    Log = 2,
515}
516
517#[repr(i32)]
518#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
519pub enum retro_message_type {
520    #[default]
521    Notification = 0,
522    NotificationAlt = 1,
523    Status = 2,
524    Progress = 3,
525}
526
527#[repr(i32)]
528#[allow(dead_code)]
529#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
530pub enum retro_power_state {
531    #[default]
532    Unknown = 0,
533    Discharging = 1,
534    Charging = 2,
535    Charged = 3,
536    PluggedIn = 4,
537}
538
539#[repr(i32)]
540#[allow(dead_code)]
541#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
542pub enum retro_savestate_context {
543    #[default]
544    Normal = 0,
545    RunaheadSameInstance = 1,
546    RunaheadSameBinary = 2,
547    RollbackNetplay = 3,
548    Unknown = i32::MAX,
549}
550
551#[repr(i32)]
552#[allow(dead_code)]
553#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
554pub enum retro_language {
555    #[default]
556    English = 0,
557    Japanese = 1,
558    French = 2,
559    Spanish = 3,
560    German = 4,
561    Italian = 5,
562    Dutch = 6,
563    PortugueseBrazil = 7,
564    PortuguesePortugal = 8,
565    Russian = 9,
566    Korean = 10,
567    ChineseTraditional = 11,
568    ChineseSimplified = 12,
569    Esperanto = 13,
570    Polish = 14,
571    Vietnamese = 15,
572    Arabic = 16,
573    Greek = 17,
574    Turkish = 18,
575    Slovak = 19,
576    Persian = 20,
577    Hebrew = 21,
578    Asturian = 22,
579    Finnish = 23,
580    Indonesian = 24,
581    Swedish = 25,
582    Ukrainian = 26,
583    Czech = 27,
584    CatalanValencia = 28,
585    Catalan = 29,
586    BritishEnglish = 30,
587    Hungarian = 31,
588    Belarusian = 32,
589    Galician = 33,
590    Norwegian = 34,
591    Irish = 35,
592}
593
594const _: () = {
595    assert!(std::mem::size_of::<retro_language>() == 4);
596    assert!(std::mem::align_of::<retro_language>() == 4);
597    assert!(std::mem::size_of::<retro_message_target>() == 4);
598    assert!(std::mem::align_of::<retro_message_target>() == 4);
599    assert!(std::mem::size_of::<retro_message_type>() == 4);
600    assert!(std::mem::align_of::<retro_message_type>() == 4);
601    assert!(std::mem::size_of::<retro_power_state>() == 4);
602    assert!(std::mem::align_of::<retro_power_state>() == 4);
603    assert!(std::mem::size_of::<retro_savestate_context>() == 4);
604    assert!(std::mem::align_of::<retro_savestate_context>() == 4);
605    assert!(std::mem::size_of::<retro_rumble_effect>() == 4);
606    assert!(std::mem::align_of::<retro_rumble_effect>() == 4);
607};
608
609#[repr(C)]
610#[derive(Clone, Copy, Debug)]
611pub struct retro_system_info {
612    pub library_name: *const c_char,
613    pub library_version: *const c_char,
614    pub valid_extensions: *const c_char,
615    pub need_fullpath: bool,
616    pub block_extract: bool,
617}
618
619impl Default for retro_system_info {
620    fn default() -> Self {
621        Self {
622            library_name: std::ptr::null(),
623            library_version: std::ptr::null(),
624            valid_extensions: std::ptr::null(),
625            need_fullpath: false,
626            block_extract: false,
627        }
628    }
629}
630
631#[repr(C)]
632#[derive(Clone, Copy, Debug, Default)]
633pub struct retro_game_geometry {
634    pub base_width: u32,
635    pub base_height: u32,
636    pub max_width: u32,
637    pub max_height: u32,
638    pub aspect_ratio: f32,
639}
640
641#[repr(C)]
642#[derive(Clone, Copy, Debug, Default)]
643pub struct retro_system_timing {
644    pub fps: f64,
645    pub sample_rate: f64,
646}
647
648#[repr(C)]
649#[derive(Clone, Copy, Debug)]
650pub struct retro_message {
651    pub msg: *const c_char,
652    pub frames: u32,
653}
654
655impl Default for retro_message {
656    fn default() -> Self {
657        Self {
658            msg: std::ptr::null(),
659            frames: 0,
660        }
661    }
662}
663
664#[repr(C)]
665#[derive(Clone, Copy, Debug)]
666pub struct retro_message_ext {
667    pub msg: *const c_char,
668    pub duration: u32,
669    pub priority: u32,
670    pub level: retro_log_level,
671    pub target: retro_message_target,
672    pub type_: retro_message_type,
673    pub progress: i8,
674}
675
676impl Default for retro_message_ext {
677    fn default() -> Self {
678        Self {
679            msg: std::ptr::null(),
680            duration: 0,
681            priority: 0,
682            level: retro_log_level::Info,
683            target: retro_message_target::Osd,
684            type_: retro_message_type::Notification,
685            progress: -1,
686        }
687    }
688}
689
690#[repr(C)]
691#[derive(Clone, Copy, Debug)]
692pub struct retro_input_descriptor {
693    pub port: u32,
694    pub device: u32,
695    pub index: u32,
696    pub id: u32,
697    pub description: *const c_char,
698}
699
700impl Default for retro_input_descriptor {
701    fn default() -> Self {
702        Self {
703            port: 0,
704            device: 0,
705            index: 0,
706            id: 0,
707            description: std::ptr::null(),
708        }
709    }
710}
711
712#[repr(C)]
713#[derive(Clone, Copy, Debug)]
714pub struct retro_device_power {
715    pub state: retro_power_state,
716    pub seconds: i32,
717    pub percent: i8,
718}
719
720impl Default for retro_device_power {
721    fn default() -> Self {
722        Self {
723            state: retro_power_state::Unknown,
724            seconds: RETRO_POWERSTATE_NO_ESTIMATE,
725            percent: -1,
726        }
727    }
728}
729
730#[repr(C)]
731#[derive(Clone, Copy, Debug)]
732pub struct retro_memory_descriptor {
733    pub flags: u64,
734    pub ptr: *mut c_void,
735    pub offset: usize,
736    pub start: usize,
737    pub select: usize,
738    pub disconnect: usize,
739    pub len: usize,
740    pub addrspace: *const c_char,
741}
742
743impl Default for retro_memory_descriptor {
744    fn default() -> Self {
745        Self {
746            flags: 0,
747            ptr: std::ptr::null_mut(),
748            offset: 0,
749            start: 0,
750            select: 0,
751            disconnect: 0,
752            len: 0,
753            addrspace: std::ptr::null(),
754        }
755    }
756}
757
758#[repr(C)]
759#[derive(Clone, Copy, Debug)]
760pub struct retro_memory_map {
761    pub descriptors: *const retro_memory_descriptor,
762    pub num_descriptors: u32,
763}
764
765impl Default for retro_memory_map {
766    fn default() -> Self {
767        Self {
768            descriptors: std::ptr::null(),
769            num_descriptors: 0,
770        }
771    }
772}
773
774#[repr(C)]
775#[derive(Clone, Copy, Debug)]
776pub struct retro_controller_description {
777    pub desc: *const c_char,
778    pub id: u32,
779}
780
781impl Default for retro_controller_description {
782    fn default() -> Self {
783        Self {
784            desc: std::ptr::null(),
785            id: 0,
786        }
787    }
788}
789
790#[repr(C)]
791#[derive(Clone, Copy, Debug)]
792pub struct retro_controller_info {
793    pub types: *const retro_controller_description,
794    pub num_types: u32,
795}
796
797impl Default for retro_controller_info {
798    fn default() -> Self {
799        Self {
800            types: std::ptr::null(),
801            num_types: 0,
802        }
803    }
804}
805
806#[repr(C)]
807#[derive(Clone, Copy, Debug)]
808pub struct retro_framebuffer {
809    pub data: *mut c_void,
810    pub width: u32,
811    pub height: u32,
812    pub pitch: usize,
813    pub format: retro_pixel_format,
814    pub access_flags: u32,
815    pub memory_flags: u32,
816}
817
818impl Default for retro_framebuffer {
819    fn default() -> Self {
820        Self {
821            data: std::ptr::null_mut(),
822            width: 0,
823            height: 0,
824            pitch: 0,
825            format: retro_pixel_format::default(),
826            access_flags: 0,
827            memory_flags: 0,
828        }
829    }
830}
831
832#[repr(C)]
833#[derive(Clone, Copy, Debug, Default)]
834pub struct retro_led_interface {
835    pub set_led_state: retro_set_led_state_t,
836}
837
838#[repr(C)]
839#[derive(Clone, Copy, Debug, Default)]
840pub struct retro_rumble_interface {
841    pub set_rumble_state: retro_set_rumble_state_t,
842}
843
844#[repr(C)]
845#[derive(Clone, Copy, Debug)]
846pub struct retro_perf_counter {
847    pub ident: *const c_char,
848    pub start: retro_perf_tick_t,
849    pub total: retro_perf_tick_t,
850    pub call_cnt: retro_perf_tick_t,
851    pub registered: bool,
852}
853
854impl Default for retro_perf_counter {
855    fn default() -> Self {
856        Self {
857            ident: std::ptr::null(),
858            start: 0,
859            total: 0,
860            call_cnt: 0,
861            registered: false,
862        }
863    }
864}
865
866#[repr(C)]
867#[derive(Clone, Copy, Debug, Default)]
868pub struct retro_perf_callback {
869    pub get_time_usec: retro_perf_get_time_usec_t,
870    pub get_cpu_features: retro_get_cpu_features_t,
871    pub get_perf_counter: retro_perf_get_counter_t,
872    pub perf_register: retro_perf_register_t,
873    pub perf_start: retro_perf_start_t,
874    pub perf_stop: retro_perf_stop_t,
875    pub perf_log: retro_perf_log_t,
876}
877
878#[repr(C)]
879#[derive(Clone, Copy, Debug, Default)]
880pub struct retro_keyboard_callback {
881    pub callback: retro_keyboard_event_t,
882}
883
884#[repr(C)]
885#[derive(Clone, Copy, Debug, Default)]
886pub struct retro_sensor_interface {
887    pub set_sensor_state: retro_set_sensor_state_t,
888    pub get_sensor_input: retro_sensor_get_input_t,
889}
890
891#[repr(C)]
892#[derive(Clone, Copy, Debug, Default)]
893pub struct retro_camera_callback {
894    pub caps: u64,
895    pub width: u32,
896    pub height: u32,
897    pub start: retro_camera_start_t,
898    pub stop: retro_camera_stop_t,
899    pub frame_raw_framebuffer: retro_camera_frame_raw_framebuffer_t,
900    pub frame_opengl_texture: retro_camera_frame_opengl_texture_t,
901    pub initialized: retro_camera_lifetime_status_t,
902    pub deinitialized: retro_camera_lifetime_status_t,
903}
904
905#[repr(C)]
906#[derive(Clone, Copy, Debug, Default)]
907pub struct retro_location_callback {
908    pub start: retro_location_start_t,
909    pub stop: retro_location_stop_t,
910    pub get_position: retro_location_get_position_t,
911    pub set_interval: retro_location_set_interval_t,
912    pub initialized: retro_location_lifetime_status_t,
913    pub deinitialized: retro_location_lifetime_status_t,
914}
915
916#[repr(C)]
917#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
918pub struct retro_subsystem_memory_info {
919    pub extension: *const c_char,
920    pub memory_type: u32,
921}
922
923#[repr(C)]
924#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
925pub struct retro_subsystem_rom_info {
926    pub desc: *const c_char,
927    pub valid_extensions: *const c_char,
928    pub need_fullpath: bool,
929    pub block_extract: bool,
930    pub required: bool,
931    pub memory: *const retro_subsystem_memory_info,
932    pub num_memory: u32,
933}
934
935#[repr(C)]
936#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
937pub struct retro_subsystem_info {
938    pub desc: *const c_char,
939    pub ident: *const c_char,
940    pub roms: *const retro_subsystem_rom_info,
941    pub num_roms: u32,
942    pub id: u32,
943}
944
945#[repr(C)]
946#[derive(Clone, Copy, Debug, Default)]
947pub struct retro_disk_control_callback {
948    pub set_eject_state: retro_set_eject_state_t,
949    pub get_eject_state: retro_get_eject_state_t,
950    pub get_image_index: retro_get_image_index_t,
951    pub set_image_index: retro_set_image_index_t,
952    pub get_num_images: retro_get_num_images_t,
953    pub replace_image_index: retro_replace_image_index_t,
954    pub add_image_index: retro_add_image_index_t,
955}
956
957#[repr(C)]
958#[derive(Clone, Copy, Debug, Default)]
959pub struct retro_disk_control_ext_callback {
960    pub set_eject_state: retro_set_eject_state_t,
961    pub get_eject_state: retro_get_eject_state_t,
962    pub get_image_index: retro_get_image_index_t,
963    pub set_image_index: retro_set_image_index_t,
964    pub get_num_images: retro_get_num_images_t,
965    pub replace_image_index: retro_replace_image_index_t,
966    pub add_image_index: retro_add_image_index_t,
967    pub set_initial_image: retro_set_initial_image_t,
968    pub get_image_path: retro_get_image_path_t,
969    pub get_image_label: retro_get_image_label_t,
970}
971
972#[repr(C)]
973#[derive(Clone, Copy, Debug, Default)]
974pub struct retro_netpacket_callback {
975    pub start: retro_netpacket_start_t,
976    pub receive: retro_netpacket_receive_t,
977    pub stop: retro_netpacket_stop_t,
978    pub poll: retro_netpacket_poll_t,
979    pub connected: retro_netpacket_connected_t,
980    pub disconnected: retro_netpacket_disconnected_t,
981    pub protocol_version: *const c_char,
982}
983
984#[repr(C)]
985#[derive(Debug)]
986pub struct retro_microphone {
987    _private: [u8; 0],
988}
989
990#[repr(C)]
991#[derive(Debug)]
992pub struct retro_vfs_file_handle {
993    _private: [u8; 0],
994}
995
996#[repr(C)]
997#[derive(Debug)]
998pub struct retro_vfs_dir_handle {
999    _private: [u8; 0],
1000}
1001
1002#[repr(C)]
1003#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
1004pub struct retro_microphone_params {
1005    pub rate: u32,
1006}
1007
1008#[repr(C)]
1009#[derive(Clone, Copy, Debug, Default)]
1010pub struct retro_microphone_interface {
1011    pub interface_version: u32,
1012    pub open_mic: retro_open_mic_t,
1013    pub close_mic: retro_close_mic_t,
1014    pub get_params: retro_get_mic_params_t,
1015    pub set_mic_state: retro_set_mic_state_t,
1016    pub get_mic_state: retro_get_mic_state_t,
1017    pub read_mic: retro_read_mic_t,
1018}
1019
1020#[repr(C)]
1021#[derive(Clone, Copy, Debug, Default)]
1022pub struct retro_vfs_interface {
1023    pub get_path: retro_vfs_get_path_t,
1024    pub open: retro_vfs_open_t,
1025    pub close: retro_vfs_close_t,
1026    pub size: retro_vfs_size_t,
1027    pub tell: retro_vfs_tell_t,
1028    pub seek: retro_vfs_seek_t,
1029    pub read: retro_vfs_read_t,
1030    pub write: retro_vfs_write_t,
1031    pub flush: retro_vfs_flush_t,
1032    pub remove: retro_vfs_remove_t,
1033    pub rename: retro_vfs_rename_t,
1034    pub truncate: retro_vfs_truncate_t,
1035    pub stat: retro_vfs_stat_t,
1036    pub mkdir: retro_vfs_mkdir_t,
1037    pub opendir: retro_vfs_opendir_t,
1038    pub readdir: retro_vfs_readdir_t,
1039    pub dirent_get_name: retro_vfs_dirent_get_name_t,
1040    pub dirent_is_dir: retro_vfs_dirent_is_dir_t,
1041    pub closedir: retro_vfs_closedir_t,
1042}
1043
1044#[repr(C)]
1045#[derive(Clone, Copy, Debug, Default)]
1046pub struct retro_vfs_interface_info {
1047    pub required_interface_version: u32,
1048    pub iface: *mut retro_vfs_interface,
1049}
1050
1051#[repr(C)]
1052#[derive(Clone, Copy, Debug, Default)]
1053pub struct retro_midi_interface {
1054    pub input_enabled: retro_midi_input_enabled_t,
1055    pub output_enabled: retro_midi_output_enabled_t,
1056    pub read: retro_midi_read_t,
1057    pub write: retro_midi_write_t,
1058    pub flush: retro_midi_flush_t,
1059}
1060
1061#[repr(C)]
1062#[derive(Clone, Copy, Debug, Default)]
1063pub struct retro_audio_callback {
1064    pub callback: retro_audio_callback_t,
1065    pub set_state: retro_audio_set_state_callback_t,
1066}
1067
1068#[repr(C)]
1069#[derive(Clone, Copy, Debug, Default)]
1070pub struct retro_audio_buffer_status_callback {
1071    pub callback: retro_audio_buffer_status_callback_t,
1072}
1073
1074#[repr(C)]
1075#[derive(Clone, Copy, Debug, Default)]
1076pub struct retro_frame_time_callback {
1077    pub callback: retro_frame_time_callback_t,
1078    pub reference: retro_usec_t,
1079}
1080
1081#[repr(C)]
1082#[derive(Clone, Copy, Debug, Default)]
1083pub struct retro_get_proc_address_interface {
1084    pub get_proc_address: retro_get_proc_address_t,
1085}
1086
1087#[repr(C)]
1088#[derive(Clone, Copy, Debug, Default, PartialEq)]
1089pub struct retro_fastforwarding_override {
1090    pub ratio: f32,
1091    pub fastforward: bool,
1092    pub notification: bool,
1093    pub inhibit_toggle: bool,
1094}
1095
1096#[repr(C)]
1097#[derive(Clone, Copy, Debug, Default, PartialEq)]
1098pub struct retro_throttle_state {
1099    pub mode: u32,
1100    pub rate: f32,
1101}
1102
1103#[repr(C)]
1104#[derive(Clone, Copy, Debug, Default)]
1105pub struct retro_system_av_info {
1106    pub geometry: retro_game_geometry,
1107    pub timing: retro_system_timing,
1108}
1109
1110#[repr(C)]
1111#[derive(Clone, Copy, Debug)]
1112pub struct retro_variable {
1113    pub key: *const c_char,
1114    pub value: *const c_char,
1115}
1116
1117impl Default for retro_variable {
1118    fn default() -> Self {
1119        Self {
1120            key: std::ptr::null(),
1121            value: std::ptr::null(),
1122        }
1123    }
1124}
1125
1126#[repr(C)]
1127#[derive(Clone, Copy, Debug, Default)]
1128pub struct retro_core_option_display {
1129    pub key: *const c_char,
1130    pub visible: bool,
1131}
1132
1133#[repr(C)]
1134#[derive(Clone, Copy, Debug, Default)]
1135pub struct retro_core_option_value {
1136    pub value: *const c_char,
1137    pub label: *const c_char,
1138}
1139
1140#[repr(C)]
1141#[derive(Clone, Copy, Debug)]
1142pub struct retro_core_option_definition {
1143    pub key: *const c_char,
1144    pub desc: *const c_char,
1145    pub info: *const c_char,
1146    pub values: [retro_core_option_value; RETRO_NUM_CORE_OPTION_VALUES_MAX],
1147    pub default_value: *const c_char,
1148}
1149
1150impl Default for retro_core_option_definition {
1151    fn default() -> Self {
1152        Self {
1153            key: std::ptr::null(),
1154            desc: std::ptr::null(),
1155            info: std::ptr::null(),
1156            values: [retro_core_option_value::default(); RETRO_NUM_CORE_OPTION_VALUES_MAX],
1157            default_value: std::ptr::null(),
1158        }
1159    }
1160}
1161
1162#[repr(C)]
1163#[derive(Clone, Copy, Debug, Default)]
1164pub struct retro_core_options_intl {
1165    pub us: *mut retro_core_option_definition,
1166    pub local: *mut retro_core_option_definition,
1167}
1168
1169#[repr(C)]
1170#[derive(Clone, Copy, Debug, Default)]
1171pub struct retro_core_option_v2_category {
1172    pub key: *const c_char,
1173    pub desc: *const c_char,
1174    pub info: *const c_char,
1175}
1176
1177#[repr(C)]
1178#[derive(Clone, Copy, Debug)]
1179pub struct retro_core_option_v2_definition {
1180    pub key: *const c_char,
1181    pub desc: *const c_char,
1182    pub desc_categorized: *const c_char,
1183    pub info: *const c_char,
1184    pub info_categorized: *const c_char,
1185    pub category_key: *const c_char,
1186    pub values: [retro_core_option_value; RETRO_NUM_CORE_OPTION_VALUES_MAX],
1187    pub default_value: *const c_char,
1188}
1189
1190impl Default for retro_core_option_v2_definition {
1191    fn default() -> Self {
1192        Self {
1193            key: std::ptr::null(),
1194            desc: std::ptr::null(),
1195            desc_categorized: std::ptr::null(),
1196            info: std::ptr::null(),
1197            info_categorized: std::ptr::null(),
1198            category_key: std::ptr::null(),
1199            values: [retro_core_option_value::default(); RETRO_NUM_CORE_OPTION_VALUES_MAX],
1200            default_value: std::ptr::null(),
1201        }
1202    }
1203}
1204
1205#[repr(C)]
1206#[derive(Clone, Copy, Debug, Default)]
1207pub struct retro_core_options_v2 {
1208    pub categories: *mut retro_core_option_v2_category,
1209    pub definitions: *mut retro_core_option_v2_definition,
1210}
1211
1212#[repr(C)]
1213#[derive(Clone, Copy, Debug, Default)]
1214pub struct retro_core_options_v2_intl {
1215    pub us: *mut retro_core_options_v2,
1216    pub local: *mut retro_core_options_v2,
1217}
1218
1219#[repr(C)]
1220#[derive(Clone, Copy, Debug, Default)]
1221pub struct retro_core_options_update_display_callback {
1222    pub callback: retro_core_options_update_display_callback_t,
1223}
1224
1225#[repr(C)]
1226#[derive(Clone, Copy, Debug, Default)]
1227pub struct retro_log_callback {
1228    pub log: retro_log_printf_t,
1229}
1230
1231#[repr(C)]
1232#[derive(Clone, Copy, Debug)]
1233pub struct retro_system_content_info_override {
1234    pub extensions: *const c_char,
1235    pub need_fullpath: bool,
1236    pub persistent_data: bool,
1237}
1238
1239impl Default for retro_system_content_info_override {
1240    fn default() -> Self {
1241        Self {
1242            extensions: std::ptr::null(),
1243            need_fullpath: false,
1244            persistent_data: false,
1245        }
1246    }
1247}
1248
1249#[repr(C)]
1250#[derive(Clone, Copy, Debug)]
1251pub struct retro_game_info {
1252    pub path: *const c_char,
1253    pub data: *const c_void,
1254    pub size: usize,
1255    pub meta: *const c_char,
1256}
1257
1258impl Default for retro_game_info {
1259    fn default() -> Self {
1260        Self {
1261            path: std::ptr::null(),
1262            data: std::ptr::null(),
1263            size: 0,
1264            meta: std::ptr::null(),
1265        }
1266    }
1267}
1268
1269#[repr(C)]
1270#[derive(Clone, Copy, Debug)]
1271pub struct retro_game_info_ext {
1272    pub full_path: *const c_char,
1273    pub archive_path: *const c_char,
1274    pub archive_file: *const c_char,
1275    pub dir: *const c_char,
1276    pub name: *const c_char,
1277    pub ext: *const c_char,
1278    pub meta: *const c_char,
1279    pub data: *const c_void,
1280    pub size: usize,
1281    pub file_in_archive: bool,
1282    pub persistent_data: bool,
1283}
1284
1285impl Default for retro_game_info_ext {
1286    fn default() -> Self {
1287        Self {
1288            full_path: std::ptr::null(),
1289            archive_path: std::ptr::null(),
1290            archive_file: std::ptr::null(),
1291            dir: std::ptr::null(),
1292            name: std::ptr::null(),
1293            ext: std::ptr::null(),
1294            meta: std::ptr::null(),
1295            data: std::ptr::null(),
1296            size: 0,
1297            file_in_archive: false,
1298            persistent_data: false,
1299        }
1300    }
1301}
1302
1303#[repr(C)]
1304#[derive(Clone, Copy, Debug, Default)]
1305pub struct retro_hw_render_callback {
1306    pub context_type: retro_hw_context_type,
1307    pub context_reset: retro_hw_context_reset_t,
1308    pub get_current_framebuffer: retro_hw_get_current_framebuffer_t,
1309    pub get_proc_address: retro_hw_get_proc_address_t,
1310    pub depth: bool,
1311    pub stencil: bool,
1312    pub bottom_left_origin: bool,
1313    pub version_major: u32,
1314    pub version_minor: u32,
1315    pub cache_context: bool,
1316    pub context_destroy: retro_hw_context_reset_t,
1317    pub debug_context: bool,
1318}
1319
1320#[repr(C)]
1321#[derive(Clone, Copy, Debug, Default)]
1322pub struct retro_hw_render_interface {
1323    pub interface_type: i32,
1324    pub interface_version: u32,
1325}
1326
1327#[repr(C)]
1328#[derive(Clone, Copy, Debug, Default)]
1329pub struct retro_hw_render_context_negotiation_interface {
1330    pub interface_type: i32,
1331    pub interface_version: u32,
1332}
1333
1334// Mirrors `include/libretro.h` for 32-bit frontends. These assertions compile
1335// into ARMv7 builds so callback structs cannot silently drift from the C ABI.
1336#[cfg(all(target_pointer_width = "32", target_arch = "x86"))]
1337const fn max_usize(a: usize, b: usize) -> usize {
1338    if a > b { a } else { b }
1339}
1340
1341#[cfg(all(target_pointer_width = "32", target_arch = "x86"))]
1342const _: () = {
1343    assert!(std::mem::size_of::<retro_system_info>() == 16);
1344    assert!(std::mem::align_of::<retro_system_info>() == 4);
1345    assert!(std::mem::offset_of!(retro_system_info, need_fullpath) == 12);
1346
1347    assert!(std::mem::size_of::<retro_system_av_info>() == 40);
1348
1349    assert!(std::mem::size_of::<retro_message>() == 8);
1350    assert!(std::mem::align_of::<retro_message>() == 4);
1351    assert!(std::mem::offset_of!(retro_message, msg) == 0);
1352    assert!(std::mem::offset_of!(retro_message, frames) == 4);
1353
1354    assert!(std::mem::size_of::<retro_message_ext>() == 28);
1355    assert!(std::mem::align_of::<retro_message_ext>() == 4);
1356    assert!(std::mem::offset_of!(retro_message_ext, msg) == 0);
1357    assert!(std::mem::offset_of!(retro_message_ext, duration) == 4);
1358    assert!(std::mem::offset_of!(retro_message_ext, priority) == 8);
1359    assert!(std::mem::offset_of!(retro_message_ext, level) == 12);
1360    assert!(std::mem::offset_of!(retro_message_ext, target) == 16);
1361    assert!(std::mem::offset_of!(retro_message_ext, type_) == 20);
1362    assert!(std::mem::offset_of!(retro_message_ext, progress) == 24);
1363
1364    assert!(std::mem::size_of::<retro_input_descriptor>() == 20);
1365    assert!(std::mem::align_of::<retro_input_descriptor>() == 4);
1366    assert!(std::mem::offset_of!(retro_input_descriptor, port) == 0);
1367    assert!(std::mem::offset_of!(retro_input_descriptor, device) == 4);
1368    assert!(std::mem::offset_of!(retro_input_descriptor, index) == 8);
1369    assert!(std::mem::offset_of!(retro_input_descriptor, id) == 12);
1370    assert!(std::mem::offset_of!(retro_input_descriptor, description) == 16);
1371
1372    assert!(std::mem::size_of::<retro_device_power>() == 12);
1373    assert!(std::mem::align_of::<retro_device_power>() == 4);
1374    assert!(std::mem::offset_of!(retro_device_power, state) == 0);
1375    assert!(std::mem::offset_of!(retro_device_power, seconds) == 4);
1376    assert!(std::mem::offset_of!(retro_device_power, percent) == 8);
1377
1378    let memory_descriptor_ptr_offset =
1379        (std::mem::size_of::<u64>() + std::mem::align_of::<*mut c_void>() - 1)
1380            & !(std::mem::align_of::<*mut c_void>() - 1);
1381    let memory_descriptor_offset_offset =
1382        memory_descriptor_ptr_offset + std::mem::size_of::<*mut c_void>();
1383    let memory_descriptor_start_offset =
1384        memory_descriptor_offset_offset + std::mem::size_of::<usize>();
1385    let memory_descriptor_select_offset =
1386        memory_descriptor_start_offset + std::mem::size_of::<usize>();
1387    let memory_descriptor_disconnect_offset =
1388        memory_descriptor_select_offset + std::mem::size_of::<usize>();
1389    let memory_descriptor_len_offset =
1390        memory_descriptor_disconnect_offset + std::mem::size_of::<usize>();
1391    let memory_descriptor_addrspace_offset =
1392        memory_descriptor_len_offset + std::mem::size_of::<usize>();
1393    let memory_descriptor_size = (memory_descriptor_addrspace_offset
1394        + std::mem::size_of::<*const c_char>()
1395        + std::mem::align_of::<retro_memory_descriptor>()
1396        - 1)
1397        & !(std::mem::align_of::<retro_memory_descriptor>() - 1);
1398    assert!(std::mem::size_of::<retro_memory_descriptor>() == memory_descriptor_size);
1399    assert!(
1400        std::mem::align_of::<retro_memory_descriptor>()
1401            == max_usize(
1402                max_usize(
1403                    max_usize(
1404                        std::mem::align_of::<u64>(),
1405                        std::mem::align_of::<*mut c_void>(),
1406                    ),
1407                    std::mem::align_of::<usize>(),
1408                ),
1409                std::mem::align_of::<*const c_char>(),
1410            )
1411    );
1412    assert!(std::mem::offset_of!(retro_memory_descriptor, flags) == 0);
1413    assert!(std::mem::offset_of!(retro_memory_descriptor, ptr) == memory_descriptor_ptr_offset);
1414    assert!(
1415        std::mem::offset_of!(retro_memory_descriptor, offset) == memory_descriptor_offset_offset
1416    );
1417    assert!(std::mem::offset_of!(retro_memory_descriptor, start) == memory_descriptor_start_offset);
1418    assert!(
1419        std::mem::offset_of!(retro_memory_descriptor, select) == memory_descriptor_select_offset
1420    );
1421    assert!(
1422        std::mem::offset_of!(retro_memory_descriptor, disconnect)
1423            == memory_descriptor_disconnect_offset
1424    );
1425    assert!(std::mem::offset_of!(retro_memory_descriptor, len) == memory_descriptor_len_offset);
1426    assert!(
1427        std::mem::offset_of!(retro_memory_descriptor, addrspace)
1428            == memory_descriptor_addrspace_offset
1429    );
1430
1431    let memory_map_num_descriptors_offset =
1432        (std::mem::size_of::<*const retro_memory_descriptor>() + std::mem::align_of::<u32>() - 1)
1433            & !(std::mem::align_of::<u32>() - 1);
1434    let memory_map_size = (memory_map_num_descriptors_offset
1435        + std::mem::size_of::<u32>()
1436        + std::mem::align_of::<retro_memory_map>()
1437        - 1)
1438        & !(std::mem::align_of::<retro_memory_map>() - 1);
1439    assert!(std::mem::size_of::<retro_memory_map>() == memory_map_size);
1440    assert!(
1441        std::mem::align_of::<retro_memory_map>()
1442            == max_usize(
1443                std::mem::align_of::<*const retro_memory_descriptor>(),
1444                std::mem::align_of::<u32>(),
1445            )
1446    );
1447    assert!(std::mem::offset_of!(retro_memory_map, descriptors) == 0);
1448    assert!(
1449        std::mem::offset_of!(retro_memory_map, num_descriptors)
1450            == memory_map_num_descriptors_offset
1451    );
1452
1453    assert!(std::mem::size_of::<retro_controller_description>() == 8);
1454    assert!(std::mem::align_of::<retro_controller_description>() == 4);
1455    assert!(std::mem::offset_of!(retro_controller_description, desc) == 0);
1456    assert!(std::mem::offset_of!(retro_controller_description, id) == 4);
1457
1458    assert!(std::mem::size_of::<retro_controller_info>() == 8);
1459    assert!(std::mem::align_of::<retro_controller_info>() == 4);
1460    assert!(std::mem::offset_of!(retro_controller_info, types) == 0);
1461    assert!(std::mem::offset_of!(retro_controller_info, num_types) == 4);
1462
1463    assert!(std::mem::size_of::<retro_framebuffer>() == 28);
1464    assert!(std::mem::align_of::<retro_framebuffer>() == 4);
1465    assert!(std::mem::offset_of!(retro_framebuffer, data) == 0);
1466    assert!(std::mem::offset_of!(retro_framebuffer, width) == 4);
1467    assert!(std::mem::offset_of!(retro_framebuffer, height) == 8);
1468    assert!(std::mem::offset_of!(retro_framebuffer, pitch) == 12);
1469    assert!(std::mem::offset_of!(retro_framebuffer, format) == 16);
1470    assert!(std::mem::offset_of!(retro_framebuffer, access_flags) == 20);
1471    assert!(std::mem::offset_of!(retro_framebuffer, memory_flags) == 24);
1472
1473    assert!(std::mem::size_of::<retro_led_interface>() == 4);
1474    assert!(std::mem::align_of::<retro_led_interface>() == 4);
1475    assert!(std::mem::offset_of!(retro_led_interface, set_led_state) == 0);
1476
1477    assert!(std::mem::size_of::<retro_rumble_interface>() == 4);
1478    assert!(std::mem::align_of::<retro_rumble_interface>() == 4);
1479    assert!(std::mem::offset_of!(retro_rumble_interface, set_rumble_state) == 0);
1480
1481    assert!(std::mem::size_of::<retro_sensor_interface>() == 8);
1482    assert!(std::mem::align_of::<retro_sensor_interface>() == 4);
1483    assert!(std::mem::offset_of!(retro_sensor_interface, set_sensor_state) == 0);
1484    assert!(std::mem::offset_of!(retro_sensor_interface, get_sensor_input) == 4);
1485
1486    assert!(std::mem::size_of::<retro_camera_callback>() == 40);
1487    assert!(std::mem::align_of::<retro_camera_callback>() == 4);
1488    assert!(std::mem::offset_of!(retro_camera_callback, caps) == 0);
1489    assert!(std::mem::offset_of!(retro_camera_callback, width) == 8);
1490    assert!(std::mem::offset_of!(retro_camera_callback, height) == 12);
1491    assert!(std::mem::offset_of!(retro_camera_callback, start) == 16);
1492    assert!(std::mem::offset_of!(retro_camera_callback, stop) == 20);
1493    assert!(std::mem::offset_of!(retro_camera_callback, frame_raw_framebuffer) == 24);
1494    assert!(std::mem::offset_of!(retro_camera_callback, frame_opengl_texture) == 28);
1495    assert!(std::mem::offset_of!(retro_camera_callback, initialized) == 32);
1496    assert!(std::mem::offset_of!(retro_camera_callback, deinitialized) == 36);
1497
1498    assert!(std::mem::size_of::<retro_location_callback>() == 24);
1499    assert!(std::mem::align_of::<retro_location_callback>() == 4);
1500    assert!(std::mem::offset_of!(retro_location_callback, start) == 0);
1501    assert!(std::mem::offset_of!(retro_location_callback, stop) == 4);
1502    assert!(std::mem::offset_of!(retro_location_callback, get_position) == 8);
1503    assert!(std::mem::offset_of!(retro_location_callback, set_interval) == 12);
1504    assert!(std::mem::offset_of!(retro_location_callback, initialized) == 16);
1505    assert!(std::mem::offset_of!(retro_location_callback, deinitialized) == 20);
1506
1507    assert!(std::mem::size_of::<retro_subsystem_memory_info>() == 8);
1508    assert!(std::mem::align_of::<retro_subsystem_memory_info>() == 4);
1509    assert!(std::mem::offset_of!(retro_subsystem_memory_info, extension) == 0);
1510    assert!(std::mem::offset_of!(retro_subsystem_memory_info, memory_type) == 4);
1511
1512    assert!(std::mem::size_of::<retro_subsystem_rom_info>() == 20);
1513    assert!(std::mem::align_of::<retro_subsystem_rom_info>() == 4);
1514    assert!(std::mem::offset_of!(retro_subsystem_rom_info, desc) == 0);
1515    assert!(std::mem::offset_of!(retro_subsystem_rom_info, valid_extensions) == 4);
1516    assert!(std::mem::offset_of!(retro_subsystem_rom_info, need_fullpath) == 8);
1517    assert!(std::mem::offset_of!(retro_subsystem_rom_info, block_extract) == 9);
1518    assert!(std::mem::offset_of!(retro_subsystem_rom_info, required) == 10);
1519    assert!(std::mem::offset_of!(retro_subsystem_rom_info, memory) == 12);
1520    assert!(std::mem::offset_of!(retro_subsystem_rom_info, num_memory) == 16);
1521
1522    assert!(std::mem::size_of::<retro_subsystem_info>() == 20);
1523    assert!(std::mem::align_of::<retro_subsystem_info>() == 4);
1524    assert!(std::mem::offset_of!(retro_subsystem_info, desc) == 0);
1525    assert!(std::mem::offset_of!(retro_subsystem_info, ident) == 4);
1526    assert!(std::mem::offset_of!(retro_subsystem_info, roms) == 8);
1527    assert!(std::mem::offset_of!(retro_subsystem_info, num_roms) == 12);
1528    assert!(std::mem::offset_of!(retro_subsystem_info, id) == 16);
1529
1530    assert!(std::mem::size_of::<retro_disk_control_callback>() == 28);
1531    assert!(std::mem::align_of::<retro_disk_control_callback>() == 4);
1532    assert!(std::mem::offset_of!(retro_disk_control_callback, set_eject_state) == 0);
1533    assert!(std::mem::offset_of!(retro_disk_control_callback, get_eject_state) == 4);
1534    assert!(std::mem::offset_of!(retro_disk_control_callback, get_image_index) == 8);
1535    assert!(std::mem::offset_of!(retro_disk_control_callback, set_image_index) == 12);
1536    assert!(std::mem::offset_of!(retro_disk_control_callback, get_num_images) == 16);
1537    assert!(std::mem::offset_of!(retro_disk_control_callback, replace_image_index) == 20);
1538    assert!(std::mem::offset_of!(retro_disk_control_callback, add_image_index) == 24);
1539
1540    assert!(std::mem::size_of::<retro_disk_control_ext_callback>() == 40);
1541    assert!(std::mem::align_of::<retro_disk_control_ext_callback>() == 4);
1542    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_eject_state) == 0);
1543    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_eject_state) == 4);
1544    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_index) == 8);
1545    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_image_index) == 12);
1546    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_num_images) == 16);
1547    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, replace_image_index) == 20);
1548    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, add_image_index) == 24);
1549    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_initial_image) == 28);
1550    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_path) == 32);
1551    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_label) == 36);
1552
1553    assert!(std::mem::size_of::<retro_netpacket_callback>() == 28);
1554    assert!(std::mem::align_of::<retro_netpacket_callback>() == 4);
1555    assert!(std::mem::offset_of!(retro_netpacket_callback, start) == 0);
1556    assert!(std::mem::offset_of!(retro_netpacket_callback, receive) == 4);
1557    assert!(std::mem::offset_of!(retro_netpacket_callback, stop) == 8);
1558    assert!(std::mem::offset_of!(retro_netpacket_callback, poll) == 12);
1559    assert!(std::mem::offset_of!(retro_netpacket_callback, connected) == 16);
1560    assert!(std::mem::offset_of!(retro_netpacket_callback, disconnected) == 20);
1561    assert!(std::mem::offset_of!(retro_netpacket_callback, protocol_version) == 24);
1562
1563    assert!(std::mem::size_of::<retro_microphone_params>() == 4);
1564    assert!(std::mem::align_of::<retro_microphone_params>() == 4);
1565    assert!(std::mem::offset_of!(retro_microphone_params, rate) == 0);
1566
1567    assert!(std::mem::size_of::<retro_microphone_interface>() == 28);
1568    assert!(std::mem::align_of::<retro_microphone_interface>() == 4);
1569    assert!(std::mem::offset_of!(retro_microphone_interface, interface_version) == 0);
1570    assert!(std::mem::offset_of!(retro_microphone_interface, open_mic) == 4);
1571    assert!(std::mem::offset_of!(retro_microphone_interface, close_mic) == 8);
1572    assert!(std::mem::offset_of!(retro_microphone_interface, get_params) == 12);
1573    assert!(std::mem::offset_of!(retro_microphone_interface, set_mic_state) == 16);
1574    assert!(std::mem::offset_of!(retro_microphone_interface, get_mic_state) == 20);
1575    assert!(std::mem::offset_of!(retro_microphone_interface, read_mic) == 24);
1576
1577    assert!(std::mem::size_of::<retro_vfs_interface>() == 76);
1578    assert!(std::mem::align_of::<retro_vfs_interface>() == 4);
1579    assert!(std::mem::offset_of!(retro_vfs_interface, get_path) == 0);
1580    assert!(std::mem::offset_of!(retro_vfs_interface, open) == 4);
1581    assert!(std::mem::offset_of!(retro_vfs_interface, close) == 8);
1582    assert!(std::mem::offset_of!(retro_vfs_interface, size) == 12);
1583    assert!(std::mem::offset_of!(retro_vfs_interface, tell) == 16);
1584    assert!(std::mem::offset_of!(retro_vfs_interface, seek) == 20);
1585    assert!(std::mem::offset_of!(retro_vfs_interface, read) == 24);
1586    assert!(std::mem::offset_of!(retro_vfs_interface, write) == 28);
1587    assert!(std::mem::offset_of!(retro_vfs_interface, flush) == 32);
1588    assert!(std::mem::offset_of!(retro_vfs_interface, remove) == 36);
1589    assert!(std::mem::offset_of!(retro_vfs_interface, rename) == 40);
1590    assert!(std::mem::offset_of!(retro_vfs_interface, truncate) == 44);
1591    assert!(std::mem::offset_of!(retro_vfs_interface, stat) == 48);
1592    assert!(std::mem::offset_of!(retro_vfs_interface, mkdir) == 52);
1593    assert!(std::mem::offset_of!(retro_vfs_interface, opendir) == 56);
1594    assert!(std::mem::offset_of!(retro_vfs_interface, readdir) == 60);
1595    assert!(std::mem::offset_of!(retro_vfs_interface, dirent_get_name) == 64);
1596    assert!(std::mem::offset_of!(retro_vfs_interface, dirent_is_dir) == 68);
1597    assert!(std::mem::offset_of!(retro_vfs_interface, closedir) == 72);
1598
1599    assert!(std::mem::size_of::<retro_vfs_interface_info>() == 8);
1600    assert!(std::mem::align_of::<retro_vfs_interface_info>() == 4);
1601    assert!(std::mem::offset_of!(retro_vfs_interface_info, required_interface_version) == 0);
1602    assert!(std::mem::offset_of!(retro_vfs_interface_info, iface) == 4);
1603
1604    assert!(std::mem::size_of::<retro_midi_interface>() == 20);
1605    assert!(std::mem::align_of::<retro_midi_interface>() == 4);
1606    assert!(std::mem::offset_of!(retro_midi_interface, input_enabled) == 0);
1607    assert!(std::mem::offset_of!(retro_midi_interface, output_enabled) == 4);
1608    assert!(std::mem::offset_of!(retro_midi_interface, read) == 8);
1609    assert!(std::mem::offset_of!(retro_midi_interface, write) == 12);
1610    assert!(std::mem::offset_of!(retro_midi_interface, flush) == 16);
1611
1612    let perf_counter_start_offset =
1613        (std::mem::size_of::<*const c_char>() + std::mem::align_of::<retro_perf_tick_t>() - 1)
1614            & !(std::mem::align_of::<retro_perf_tick_t>() - 1);
1615    let perf_counter_total_offset =
1616        perf_counter_start_offset + std::mem::size_of::<retro_perf_tick_t>();
1617    let perf_counter_call_count_offset =
1618        perf_counter_total_offset + std::mem::size_of::<retro_perf_tick_t>();
1619    let perf_counter_registered_offset =
1620        perf_counter_call_count_offset + std::mem::size_of::<retro_perf_tick_t>();
1621    let perf_counter_size = (perf_counter_registered_offset
1622        + std::mem::size_of::<bool>()
1623        + std::mem::align_of::<retro_perf_counter>()
1624        - 1)
1625        & !(std::mem::align_of::<retro_perf_counter>() - 1);
1626    assert!(std::mem::size_of::<retro_perf_counter>() == perf_counter_size);
1627    assert!(
1628        std::mem::align_of::<retro_perf_counter>()
1629            == max_usize(
1630                max_usize(
1631                    std::mem::align_of::<*const c_char>(),
1632                    std::mem::align_of::<retro_perf_tick_t>(),
1633                ),
1634                std::mem::align_of::<bool>(),
1635            )
1636    );
1637    assert!(std::mem::offset_of!(retro_perf_counter, ident) == 0);
1638    assert!(std::mem::offset_of!(retro_perf_counter, start) == perf_counter_start_offset);
1639    assert!(std::mem::offset_of!(retro_perf_counter, total) == perf_counter_total_offset);
1640    assert!(std::mem::offset_of!(retro_perf_counter, call_cnt) == perf_counter_call_count_offset);
1641    assert!(std::mem::offset_of!(retro_perf_counter, registered) == perf_counter_registered_offset);
1642
1643    assert!(std::mem::size_of::<retro_perf_callback>() == 28);
1644    assert!(std::mem::align_of::<retro_perf_callback>() == 4);
1645    assert!(std::mem::offset_of!(retro_perf_callback, get_time_usec) == 0);
1646    assert!(std::mem::offset_of!(retro_perf_callback, get_cpu_features) == 4);
1647    assert!(std::mem::offset_of!(retro_perf_callback, get_perf_counter) == 8);
1648    assert!(std::mem::offset_of!(retro_perf_callback, perf_register) == 12);
1649    assert!(std::mem::offset_of!(retro_perf_callback, perf_start) == 16);
1650    assert!(std::mem::offset_of!(retro_perf_callback, perf_stop) == 20);
1651    assert!(std::mem::offset_of!(retro_perf_callback, perf_log) == 24);
1652
1653    assert!(std::mem::size_of::<retro_keyboard_callback>() == 4);
1654    assert!(std::mem::align_of::<retro_keyboard_callback>() == 4);
1655    assert!(std::mem::offset_of!(retro_keyboard_callback, callback) == 0);
1656
1657    assert!(std::mem::size_of::<retro_audio_callback>() == 8);
1658    assert!(std::mem::align_of::<retro_audio_callback>() == 4);
1659    assert!(std::mem::offset_of!(retro_audio_callback, callback) == 0);
1660    assert!(std::mem::offset_of!(retro_audio_callback, set_state) == 4);
1661
1662    assert!(std::mem::size_of::<retro_audio_buffer_status_callback>() == 4);
1663    assert!(std::mem::align_of::<retro_audio_buffer_status_callback>() == 4);
1664    assert!(std::mem::offset_of!(retro_audio_buffer_status_callback, callback) == 0);
1665
1666    let frame_time_reference_offset = (std::mem::size_of::<retro_frame_time_callback_t>()
1667        + std::mem::align_of::<retro_usec_t>()
1668        - 1)
1669        & !(std::mem::align_of::<retro_usec_t>() - 1);
1670    assert!(
1671        std::mem::size_of::<retro_frame_time_callback>()
1672            == frame_time_reference_offset + std::mem::size_of::<retro_usec_t>()
1673    );
1674    assert!(
1675        std::mem::align_of::<retro_frame_time_callback>()
1676            == max_usize(
1677                std::mem::align_of::<retro_frame_time_callback_t>(),
1678                std::mem::align_of::<retro_usec_t>(),
1679            )
1680    );
1681    assert!(std::mem::offset_of!(retro_frame_time_callback, callback) == 0);
1682    assert!(
1683        std::mem::offset_of!(retro_frame_time_callback, reference) == frame_time_reference_offset
1684    );
1685
1686    assert!(std::mem::size_of::<retro_get_proc_address_interface>() == 4);
1687    assert!(std::mem::align_of::<retro_get_proc_address_interface>() == 4);
1688    assert!(std::mem::offset_of!(retro_get_proc_address_interface, get_proc_address) == 0);
1689
1690    assert!(std::mem::size_of::<retro_fastforwarding_override>() == 8);
1691    assert!(std::mem::align_of::<retro_fastforwarding_override>() == 4);
1692    assert!(std::mem::offset_of!(retro_fastforwarding_override, ratio) == 0);
1693    assert!(std::mem::offset_of!(retro_fastforwarding_override, fastforward) == 4);
1694    assert!(std::mem::offset_of!(retro_fastforwarding_override, notification) == 5);
1695    assert!(std::mem::offset_of!(retro_fastforwarding_override, inhibit_toggle) == 6);
1696
1697    assert!(std::mem::size_of::<retro_throttle_state>() == 8);
1698    assert!(std::mem::align_of::<retro_throttle_state>() == 4);
1699    assert!(std::mem::offset_of!(retro_throttle_state, mode) == 0);
1700    assert!(std::mem::offset_of!(retro_throttle_state, rate) == 4);
1701
1702    assert!(std::mem::size_of::<retro_variable>() == 8);
1703    assert!(std::mem::align_of::<retro_variable>() == 4);
1704    assert!(std::mem::offset_of!(retro_variable, key) == 0);
1705    assert!(std::mem::offset_of!(retro_variable, value) == 4);
1706
1707    assert!(std::mem::size_of::<retro_core_option_display>() == 8);
1708    assert!(std::mem::align_of::<retro_core_option_display>() == 4);
1709    assert!(std::mem::offset_of!(retro_core_option_display, key) == 0);
1710    assert!(std::mem::offset_of!(retro_core_option_display, visible) == 4);
1711
1712    assert!(std::mem::size_of::<retro_core_option_value>() == 8);
1713    assert!(std::mem::align_of::<retro_core_option_value>() == 4);
1714    assert!(std::mem::offset_of!(retro_core_option_value, value) == 0);
1715    assert!(std::mem::offset_of!(retro_core_option_value, label) == 4);
1716
1717    assert!(std::mem::size_of::<retro_core_option_definition>() == 1040);
1718    assert!(std::mem::align_of::<retro_core_option_definition>() == 4);
1719    assert!(std::mem::offset_of!(retro_core_option_definition, key) == 0);
1720    assert!(std::mem::offset_of!(retro_core_option_definition, desc) == 4);
1721    assert!(std::mem::offset_of!(retro_core_option_definition, info) == 8);
1722    assert!(std::mem::offset_of!(retro_core_option_definition, values) == 12);
1723    assert!(std::mem::offset_of!(retro_core_option_definition, default_value) == 1036);
1724
1725    assert!(std::mem::size_of::<retro_core_options_intl>() == 8);
1726    assert!(std::mem::align_of::<retro_core_options_intl>() == 4);
1727    assert!(std::mem::offset_of!(retro_core_options_intl, us) == 0);
1728    assert!(std::mem::offset_of!(retro_core_options_intl, local) == 4);
1729
1730    assert!(std::mem::size_of::<retro_core_option_v2_category>() == 12);
1731    assert!(std::mem::align_of::<retro_core_option_v2_category>() == 4);
1732    assert!(std::mem::offset_of!(retro_core_option_v2_category, key) == 0);
1733    assert!(std::mem::offset_of!(retro_core_option_v2_category, desc) == 4);
1734    assert!(std::mem::offset_of!(retro_core_option_v2_category, info) == 8);
1735
1736    assert!(std::mem::size_of::<retro_core_option_v2_definition>() == 1052);
1737    assert!(std::mem::align_of::<retro_core_option_v2_definition>() == 4);
1738    assert!(std::mem::offset_of!(retro_core_option_v2_definition, key) == 0);
1739    assert!(std::mem::offset_of!(retro_core_option_v2_definition, desc) == 4);
1740    assert!(std::mem::offset_of!(retro_core_option_v2_definition, desc_categorized) == 8);
1741    assert!(std::mem::offset_of!(retro_core_option_v2_definition, info) == 12);
1742    assert!(std::mem::offset_of!(retro_core_option_v2_definition, info_categorized) == 16);
1743    assert!(std::mem::offset_of!(retro_core_option_v2_definition, category_key) == 20);
1744    assert!(std::mem::offset_of!(retro_core_option_v2_definition, values) == 24);
1745    assert!(std::mem::offset_of!(retro_core_option_v2_definition, default_value) == 1048);
1746
1747    assert!(std::mem::size_of::<retro_core_options_v2>() == 8);
1748    assert!(std::mem::align_of::<retro_core_options_v2>() == 4);
1749    assert!(std::mem::offset_of!(retro_core_options_v2, categories) == 0);
1750    assert!(std::mem::offset_of!(retro_core_options_v2, definitions) == 4);
1751
1752    assert!(std::mem::size_of::<retro_core_options_v2_intl>() == 8);
1753    assert!(std::mem::align_of::<retro_core_options_v2_intl>() == 4);
1754    assert!(std::mem::offset_of!(retro_core_options_v2_intl, us) == 0);
1755    assert!(std::mem::offset_of!(retro_core_options_v2_intl, local) == 4);
1756
1757    assert!(std::mem::size_of::<retro_core_options_update_display_callback>() == 4);
1758    assert!(std::mem::align_of::<retro_core_options_update_display_callback>() == 4);
1759    assert!(std::mem::offset_of!(retro_core_options_update_display_callback, callback) == 0);
1760
1761    assert!(std::mem::size_of::<retro_system_content_info_override>() == 8);
1762    assert!(std::mem::align_of::<retro_system_content_info_override>() == 4);
1763    assert!(std::mem::offset_of!(retro_system_content_info_override, extensions) == 0);
1764    assert!(std::mem::offset_of!(retro_system_content_info_override, need_fullpath) == 4);
1765    assert!(std::mem::offset_of!(retro_system_content_info_override, persistent_data) == 5);
1766
1767    assert!(std::mem::size_of::<retro_game_info>() == 16);
1768    assert!(std::mem::align_of::<retro_game_info>() == 4);
1769
1770    assert!(std::mem::size_of::<retro_game_info_ext>() == 40);
1771    assert!(std::mem::align_of::<retro_game_info_ext>() == 4);
1772    assert!(std::mem::offset_of!(retro_game_info_ext, full_path) == 0);
1773    assert!(std::mem::offset_of!(retro_game_info_ext, archive_path) == 4);
1774    assert!(std::mem::offset_of!(retro_game_info_ext, archive_file) == 8);
1775    assert!(std::mem::offset_of!(retro_game_info_ext, dir) == 12);
1776    assert!(std::mem::offset_of!(retro_game_info_ext, name) == 16);
1777    assert!(std::mem::offset_of!(retro_game_info_ext, ext) == 20);
1778    assert!(std::mem::offset_of!(retro_game_info_ext, meta) == 24);
1779    assert!(std::mem::offset_of!(retro_game_info_ext, data) == 28);
1780    assert!(std::mem::offset_of!(retro_game_info_ext, size) == 32);
1781    assert!(std::mem::offset_of!(retro_game_info_ext, file_in_archive) == 36);
1782    assert!(std::mem::offset_of!(retro_game_info_ext, persistent_data) == 37);
1783
1784    assert!(std::mem::size_of::<retro_hw_render_callback>() == 40);
1785    assert!(std::mem::align_of::<retro_hw_render_callback>() == 4);
1786    assert!(std::mem::offset_of!(retro_hw_render_callback, context_type) == 0);
1787    assert!(std::mem::offset_of!(retro_hw_render_callback, context_reset) == 4);
1788    assert!(std::mem::offset_of!(retro_hw_render_callback, get_current_framebuffer) == 8);
1789    assert!(std::mem::offset_of!(retro_hw_render_callback, get_proc_address) == 12);
1790    assert!(std::mem::offset_of!(retro_hw_render_callback, depth) == 16);
1791    assert!(std::mem::offset_of!(retro_hw_render_callback, stencil) == 17);
1792    assert!(std::mem::offset_of!(retro_hw_render_callback, bottom_left_origin) == 18);
1793    assert!(std::mem::offset_of!(retro_hw_render_callback, version_major) == 20);
1794    assert!(std::mem::offset_of!(retro_hw_render_callback, version_minor) == 24);
1795    assert!(std::mem::offset_of!(retro_hw_render_callback, cache_context) == 28);
1796    assert!(std::mem::offset_of!(retro_hw_render_callback, context_destroy) == 32);
1797    assert!(std::mem::offset_of!(retro_hw_render_callback, debug_context) == 36);
1798
1799    assert!(std::mem::size_of::<retro_hw_render_interface>() == 8);
1800    assert!(std::mem::align_of::<retro_hw_render_interface>() == 4);
1801    assert!(std::mem::offset_of!(retro_hw_render_interface, interface_type) == 0);
1802    assert!(std::mem::offset_of!(retro_hw_render_interface, interface_version) == 4);
1803
1804    assert!(std::mem::size_of::<retro_hw_render_context_negotiation_interface>() == 8);
1805    assert!(std::mem::align_of::<retro_hw_render_context_negotiation_interface>() == 4);
1806    assert!(
1807        std::mem::offset_of!(
1808            retro_hw_render_context_negotiation_interface,
1809            interface_type
1810        ) == 0
1811    );
1812    assert!(
1813        std::mem::offset_of!(
1814            retro_hw_render_context_negotiation_interface,
1815            interface_version
1816        ) == 4
1817    );
1818};
1819
1820// Mirrors `include/libretro.h` for ARMv7 EABI hard-float frontends. Pointer
1821// width and most primitive alignments match i686, but `u64`/`i64`/`f64` align
1822// to 8 instead of 4, which bumps the size/alignment of any struct that embeds
1823// a 64-bit primitive.
1824#[cfg(all(target_pointer_width = "32", target_arch = "arm"))]
1825const fn max_usize(a: usize, b: usize) -> usize {
1826    if a > b { a } else { b }
1827}
1828
1829#[cfg(all(target_pointer_width = "32", target_arch = "arm"))]
1830const _: () = {
1831    assert!(std::mem::size_of::<retro_system_info>() == 16);
1832    assert!(std::mem::align_of::<retro_system_info>() == 4);
1833    assert!(std::mem::offset_of!(retro_system_info, need_fullpath) == 12);
1834
1835    assert!(std::mem::size_of::<retro_system_av_info>() == 40);
1836
1837    assert!(std::mem::size_of::<retro_message>() == 8);
1838    assert!(std::mem::align_of::<retro_message>() == 4);
1839    assert!(std::mem::offset_of!(retro_message, msg) == 0);
1840    assert!(std::mem::offset_of!(retro_message, frames) == 4);
1841
1842    assert!(std::mem::size_of::<retro_message_ext>() == 28);
1843    assert!(std::mem::align_of::<retro_message_ext>() == 4);
1844    assert!(std::mem::offset_of!(retro_message_ext, msg) == 0);
1845    assert!(std::mem::offset_of!(retro_message_ext, duration) == 4);
1846    assert!(std::mem::offset_of!(retro_message_ext, priority) == 8);
1847    assert!(std::mem::offset_of!(retro_message_ext, level) == 12);
1848    assert!(std::mem::offset_of!(retro_message_ext, target) == 16);
1849    assert!(std::mem::offset_of!(retro_message_ext, type_) == 20);
1850    assert!(std::mem::offset_of!(retro_message_ext, progress) == 24);
1851
1852    assert!(std::mem::size_of::<retro_input_descriptor>() == 20);
1853    assert!(std::mem::align_of::<retro_input_descriptor>() == 4);
1854    assert!(std::mem::offset_of!(retro_input_descriptor, port) == 0);
1855    assert!(std::mem::offset_of!(retro_input_descriptor, device) == 4);
1856    assert!(std::mem::offset_of!(retro_input_descriptor, index) == 8);
1857    assert!(std::mem::offset_of!(retro_input_descriptor, id) == 12);
1858    assert!(std::mem::offset_of!(retro_input_descriptor, description) == 16);
1859
1860    assert!(std::mem::size_of::<retro_device_power>() == 12);
1861    assert!(std::mem::align_of::<retro_device_power>() == 4);
1862    assert!(std::mem::offset_of!(retro_device_power, state) == 0);
1863    assert!(std::mem::offset_of!(retro_device_power, seconds) == 4);
1864    assert!(std::mem::offset_of!(retro_device_power, percent) == 8);
1865
1866    let memory_descriptor_ptr_offset =
1867        (std::mem::size_of::<u64>() + std::mem::align_of::<*mut c_void>() - 1)
1868            & !(std::mem::align_of::<*mut c_void>() - 1);
1869    let memory_descriptor_offset_offset =
1870        memory_descriptor_ptr_offset + std::mem::size_of::<*mut c_void>();
1871    let memory_descriptor_start_offset =
1872        memory_descriptor_offset_offset + std::mem::size_of::<usize>();
1873    let memory_descriptor_select_offset =
1874        memory_descriptor_start_offset + std::mem::size_of::<usize>();
1875    let memory_descriptor_disconnect_offset =
1876        memory_descriptor_select_offset + std::mem::size_of::<usize>();
1877    let memory_descriptor_len_offset =
1878        memory_descriptor_disconnect_offset + std::mem::size_of::<usize>();
1879    let memory_descriptor_addrspace_offset =
1880        memory_descriptor_len_offset + std::mem::size_of::<usize>();
1881    let memory_descriptor_size = (memory_descriptor_addrspace_offset
1882        + std::mem::size_of::<*const c_char>()
1883        + std::mem::align_of::<retro_memory_descriptor>()
1884        - 1)
1885        & !(std::mem::align_of::<retro_memory_descriptor>() - 1);
1886    assert!(std::mem::size_of::<retro_memory_descriptor>() == memory_descriptor_size);
1887    assert!(
1888        std::mem::align_of::<retro_memory_descriptor>()
1889            == max_usize(
1890                max_usize(
1891                    max_usize(
1892                        std::mem::align_of::<u64>(),
1893                        std::mem::align_of::<*mut c_void>(),
1894                    ),
1895                    std::mem::align_of::<usize>(),
1896                ),
1897                std::mem::align_of::<*const c_char>(),
1898            )
1899    );
1900    assert!(std::mem::offset_of!(retro_memory_descriptor, flags) == 0);
1901    assert!(std::mem::offset_of!(retro_memory_descriptor, ptr) == memory_descriptor_ptr_offset);
1902    assert!(
1903        std::mem::offset_of!(retro_memory_descriptor, offset) == memory_descriptor_offset_offset
1904    );
1905    assert!(std::mem::offset_of!(retro_memory_descriptor, start) == memory_descriptor_start_offset);
1906    assert!(
1907        std::mem::offset_of!(retro_memory_descriptor, select) == memory_descriptor_select_offset
1908    );
1909    assert!(
1910        std::mem::offset_of!(retro_memory_descriptor, disconnect)
1911            == memory_descriptor_disconnect_offset
1912    );
1913    assert!(std::mem::offset_of!(retro_memory_descriptor, len) == memory_descriptor_len_offset);
1914    assert!(
1915        std::mem::offset_of!(retro_memory_descriptor, addrspace)
1916            == memory_descriptor_addrspace_offset
1917    );
1918
1919    let memory_map_num_descriptors_offset =
1920        (std::mem::size_of::<*const retro_memory_descriptor>() + std::mem::align_of::<u32>() - 1)
1921            & !(std::mem::align_of::<u32>() - 1);
1922    let memory_map_size = (memory_map_num_descriptors_offset
1923        + std::mem::size_of::<u32>()
1924        + std::mem::align_of::<retro_memory_map>()
1925        - 1)
1926        & !(std::mem::align_of::<retro_memory_map>() - 1);
1927    assert!(std::mem::size_of::<retro_memory_map>() == memory_map_size);
1928    assert!(
1929        std::mem::align_of::<retro_memory_map>()
1930            == max_usize(
1931                std::mem::align_of::<*const retro_memory_descriptor>(),
1932                std::mem::align_of::<u32>(),
1933            )
1934    );
1935    assert!(std::mem::offset_of!(retro_memory_map, descriptors) == 0);
1936    assert!(
1937        std::mem::offset_of!(retro_memory_map, num_descriptors)
1938            == memory_map_num_descriptors_offset
1939    );
1940
1941    assert!(std::mem::size_of::<retro_controller_description>() == 8);
1942    assert!(std::mem::align_of::<retro_controller_description>() == 4);
1943    assert!(std::mem::offset_of!(retro_controller_description, desc) == 0);
1944    assert!(std::mem::offset_of!(retro_controller_description, id) == 4);
1945
1946    assert!(std::mem::size_of::<retro_controller_info>() == 8);
1947    assert!(std::mem::align_of::<retro_controller_info>() == 4);
1948    assert!(std::mem::offset_of!(retro_controller_info, types) == 0);
1949    assert!(std::mem::offset_of!(retro_controller_info, num_types) == 4);
1950
1951    assert!(std::mem::size_of::<retro_framebuffer>() == 28);
1952    assert!(std::mem::align_of::<retro_framebuffer>() == 4);
1953    assert!(std::mem::offset_of!(retro_framebuffer, data) == 0);
1954    assert!(std::mem::offset_of!(retro_framebuffer, width) == 4);
1955    assert!(std::mem::offset_of!(retro_framebuffer, height) == 8);
1956    assert!(std::mem::offset_of!(retro_framebuffer, pitch) == 12);
1957    assert!(std::mem::offset_of!(retro_framebuffer, format) == 16);
1958    assert!(std::mem::offset_of!(retro_framebuffer, access_flags) == 20);
1959    assert!(std::mem::offset_of!(retro_framebuffer, memory_flags) == 24);
1960
1961    assert!(std::mem::size_of::<retro_led_interface>() == 4);
1962    assert!(std::mem::align_of::<retro_led_interface>() == 4);
1963    assert!(std::mem::offset_of!(retro_led_interface, set_led_state) == 0);
1964
1965    assert!(std::mem::size_of::<retro_rumble_interface>() == 4);
1966    assert!(std::mem::align_of::<retro_rumble_interface>() == 4);
1967    assert!(std::mem::offset_of!(retro_rumble_interface, set_rumble_state) == 0);
1968
1969    assert!(std::mem::size_of::<retro_sensor_interface>() == 8);
1970    assert!(std::mem::align_of::<retro_sensor_interface>() == 4);
1971    assert!(std::mem::offset_of!(retro_sensor_interface, set_sensor_state) == 0);
1972    assert!(std::mem::offset_of!(retro_sensor_interface, get_sensor_input) == 4);
1973
1974    // `retro_camera_callback` embeds a `u64` field, so on ARMv7 EABI the
1975    // struct alignment bumps from 4 to 8. The overall size stays 40 because
1976    // the trailing function pointers already fill out to a multiple of 8.
1977    assert!(std::mem::size_of::<retro_camera_callback>() == 40);
1978    assert!(std::mem::align_of::<retro_camera_callback>() == 8);
1979    assert!(std::mem::offset_of!(retro_camera_callback, caps) == 0);
1980    assert!(std::mem::offset_of!(retro_camera_callback, width) == 8);
1981    assert!(std::mem::offset_of!(retro_camera_callback, height) == 12);
1982    assert!(std::mem::offset_of!(retro_camera_callback, start) == 16);
1983    assert!(std::mem::offset_of!(retro_camera_callback, stop) == 20);
1984    assert!(std::mem::offset_of!(retro_camera_callback, frame_raw_framebuffer) == 24);
1985    assert!(std::mem::offset_of!(retro_camera_callback, frame_opengl_texture) == 28);
1986    assert!(std::mem::offset_of!(retro_camera_callback, initialized) == 32);
1987    assert!(std::mem::offset_of!(retro_camera_callback, deinitialized) == 36);
1988
1989    assert!(std::mem::size_of::<retro_location_callback>() == 24);
1990    assert!(std::mem::align_of::<retro_location_callback>() == 4);
1991    assert!(std::mem::offset_of!(retro_location_callback, start) == 0);
1992    assert!(std::mem::offset_of!(retro_location_callback, stop) == 4);
1993    assert!(std::mem::offset_of!(retro_location_callback, get_position) == 8);
1994    assert!(std::mem::offset_of!(retro_location_callback, set_interval) == 12);
1995    assert!(std::mem::offset_of!(retro_location_callback, initialized) == 16);
1996    assert!(std::mem::offset_of!(retro_location_callback, deinitialized) == 20);
1997
1998    assert!(std::mem::size_of::<retro_subsystem_memory_info>() == 8);
1999    assert!(std::mem::align_of::<retro_subsystem_memory_info>() == 4);
2000    assert!(std::mem::offset_of!(retro_subsystem_memory_info, extension) == 0);
2001    assert!(std::mem::offset_of!(retro_subsystem_memory_info, memory_type) == 4);
2002
2003    assert!(std::mem::size_of::<retro_subsystem_rom_info>() == 20);
2004    assert!(std::mem::align_of::<retro_subsystem_rom_info>() == 4);
2005    assert!(std::mem::offset_of!(retro_subsystem_rom_info, desc) == 0);
2006    assert!(std::mem::offset_of!(retro_subsystem_rom_info, valid_extensions) == 4);
2007    assert!(std::mem::offset_of!(retro_subsystem_rom_info, need_fullpath) == 8);
2008    assert!(std::mem::offset_of!(retro_subsystem_rom_info, block_extract) == 9);
2009    assert!(std::mem::offset_of!(retro_subsystem_rom_info, required) == 10);
2010    assert!(std::mem::offset_of!(retro_subsystem_rom_info, memory) == 12);
2011    assert!(std::mem::offset_of!(retro_subsystem_rom_info, num_memory) == 16);
2012
2013    assert!(std::mem::size_of::<retro_subsystem_info>() == 20);
2014    assert!(std::mem::align_of::<retro_subsystem_info>() == 4);
2015    assert!(std::mem::offset_of!(retro_subsystem_info, desc) == 0);
2016    assert!(std::mem::offset_of!(retro_subsystem_info, ident) == 4);
2017    assert!(std::mem::offset_of!(retro_subsystem_info, roms) == 8);
2018    assert!(std::mem::offset_of!(retro_subsystem_info, num_roms) == 12);
2019    assert!(std::mem::offset_of!(retro_subsystem_info, id) == 16);
2020
2021    assert!(std::mem::size_of::<retro_disk_control_callback>() == 28);
2022    assert!(std::mem::align_of::<retro_disk_control_callback>() == 4);
2023    assert!(std::mem::offset_of!(retro_disk_control_callback, set_eject_state) == 0);
2024    assert!(std::mem::offset_of!(retro_disk_control_callback, get_eject_state) == 4);
2025    assert!(std::mem::offset_of!(retro_disk_control_callback, get_image_index) == 8);
2026    assert!(std::mem::offset_of!(retro_disk_control_callback, set_image_index) == 12);
2027    assert!(std::mem::offset_of!(retro_disk_control_callback, get_num_images) == 16);
2028    assert!(std::mem::offset_of!(retro_disk_control_callback, replace_image_index) == 20);
2029    assert!(std::mem::offset_of!(retro_disk_control_callback, add_image_index) == 24);
2030
2031    assert!(std::mem::size_of::<retro_disk_control_ext_callback>() == 40);
2032    assert!(std::mem::align_of::<retro_disk_control_ext_callback>() == 4);
2033    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_eject_state) == 0);
2034    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_eject_state) == 4);
2035    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_index) == 8);
2036    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_image_index) == 12);
2037    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_num_images) == 16);
2038    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, replace_image_index) == 20);
2039    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, add_image_index) == 24);
2040    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_initial_image) == 28);
2041    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_path) == 32);
2042    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_label) == 36);
2043
2044    assert!(std::mem::size_of::<retro_netpacket_callback>() == 28);
2045    assert!(std::mem::align_of::<retro_netpacket_callback>() == 4);
2046    assert!(std::mem::offset_of!(retro_netpacket_callback, start) == 0);
2047    assert!(std::mem::offset_of!(retro_netpacket_callback, receive) == 4);
2048    assert!(std::mem::offset_of!(retro_netpacket_callback, stop) == 8);
2049    assert!(std::mem::offset_of!(retro_netpacket_callback, poll) == 12);
2050    assert!(std::mem::offset_of!(retro_netpacket_callback, connected) == 16);
2051    assert!(std::mem::offset_of!(retro_netpacket_callback, disconnected) == 20);
2052    assert!(std::mem::offset_of!(retro_netpacket_callback, protocol_version) == 24);
2053
2054    assert!(std::mem::size_of::<retro_microphone_params>() == 4);
2055    assert!(std::mem::align_of::<retro_microphone_params>() == 4);
2056    assert!(std::mem::offset_of!(retro_microphone_params, rate) == 0);
2057
2058    assert!(std::mem::size_of::<retro_microphone_interface>() == 28);
2059    assert!(std::mem::align_of::<retro_microphone_interface>() == 4);
2060    assert!(std::mem::offset_of!(retro_microphone_interface, interface_version) == 0);
2061    assert!(std::mem::offset_of!(retro_microphone_interface, open_mic) == 4);
2062    assert!(std::mem::offset_of!(retro_microphone_interface, close_mic) == 8);
2063    assert!(std::mem::offset_of!(retro_microphone_interface, get_params) == 12);
2064    assert!(std::mem::offset_of!(retro_microphone_interface, set_mic_state) == 16);
2065    assert!(std::mem::offset_of!(retro_microphone_interface, get_mic_state) == 20);
2066    assert!(std::mem::offset_of!(retro_microphone_interface, read_mic) == 24);
2067
2068    assert!(std::mem::size_of::<retro_vfs_interface>() == 76);
2069    assert!(std::mem::align_of::<retro_vfs_interface>() == 4);
2070    assert!(std::mem::offset_of!(retro_vfs_interface, get_path) == 0);
2071    assert!(std::mem::offset_of!(retro_vfs_interface, open) == 4);
2072    assert!(std::mem::offset_of!(retro_vfs_interface, close) == 8);
2073    assert!(std::mem::offset_of!(retro_vfs_interface, size) == 12);
2074    assert!(std::mem::offset_of!(retro_vfs_interface, tell) == 16);
2075    assert!(std::mem::offset_of!(retro_vfs_interface, seek) == 20);
2076    assert!(std::mem::offset_of!(retro_vfs_interface, read) == 24);
2077    assert!(std::mem::offset_of!(retro_vfs_interface, write) == 28);
2078    assert!(std::mem::offset_of!(retro_vfs_interface, flush) == 32);
2079    assert!(std::mem::offset_of!(retro_vfs_interface, remove) == 36);
2080    assert!(std::mem::offset_of!(retro_vfs_interface, rename) == 40);
2081    assert!(std::mem::offset_of!(retro_vfs_interface, truncate) == 44);
2082    assert!(std::mem::offset_of!(retro_vfs_interface, stat) == 48);
2083    assert!(std::mem::offset_of!(retro_vfs_interface, mkdir) == 52);
2084    assert!(std::mem::offset_of!(retro_vfs_interface, opendir) == 56);
2085    assert!(std::mem::offset_of!(retro_vfs_interface, readdir) == 60);
2086    assert!(std::mem::offset_of!(retro_vfs_interface, dirent_get_name) == 64);
2087    assert!(std::mem::offset_of!(retro_vfs_interface, dirent_is_dir) == 68);
2088    assert!(std::mem::offset_of!(retro_vfs_interface, closedir) == 72);
2089
2090    assert!(std::mem::size_of::<retro_vfs_interface_info>() == 8);
2091    assert!(std::mem::align_of::<retro_vfs_interface_info>() == 4);
2092    assert!(std::mem::offset_of!(retro_vfs_interface_info, required_interface_version) == 0);
2093    assert!(std::mem::offset_of!(retro_vfs_interface_info, iface) == 4);
2094
2095    assert!(std::mem::size_of::<retro_midi_interface>() == 20);
2096    assert!(std::mem::align_of::<retro_midi_interface>() == 4);
2097    assert!(std::mem::offset_of!(retro_midi_interface, input_enabled) == 0);
2098    assert!(std::mem::offset_of!(retro_midi_interface, output_enabled) == 4);
2099    assert!(std::mem::offset_of!(retro_midi_interface, read) == 8);
2100    assert!(std::mem::offset_of!(retro_midi_interface, write) == 12);
2101    assert!(std::mem::offset_of!(retro_midi_interface, flush) == 16);
2102
2103    let perf_counter_start_offset =
2104        (std::mem::size_of::<*const c_char>() + std::mem::align_of::<retro_perf_tick_t>() - 1)
2105            & !(std::mem::align_of::<retro_perf_tick_t>() - 1);
2106    let perf_counter_total_offset =
2107        perf_counter_start_offset + std::mem::size_of::<retro_perf_tick_t>();
2108    let perf_counter_call_count_offset =
2109        perf_counter_total_offset + std::mem::size_of::<retro_perf_tick_t>();
2110    let perf_counter_registered_offset =
2111        perf_counter_call_count_offset + std::mem::size_of::<retro_perf_tick_t>();
2112    let perf_counter_size = (perf_counter_registered_offset
2113        + std::mem::size_of::<bool>()
2114        + std::mem::align_of::<retro_perf_counter>()
2115        - 1)
2116        & !(std::mem::align_of::<retro_perf_counter>() - 1);
2117    assert!(std::mem::size_of::<retro_perf_counter>() == perf_counter_size);
2118    assert!(
2119        std::mem::align_of::<retro_perf_counter>()
2120            == max_usize(
2121                max_usize(
2122                    std::mem::align_of::<*const c_char>(),
2123                    std::mem::align_of::<retro_perf_tick_t>(),
2124                ),
2125                std::mem::align_of::<bool>(),
2126            )
2127    );
2128    assert!(std::mem::offset_of!(retro_perf_counter, ident) == 0);
2129    assert!(std::mem::offset_of!(retro_perf_counter, start) == perf_counter_start_offset);
2130    assert!(std::mem::offset_of!(retro_perf_counter, total) == perf_counter_total_offset);
2131    assert!(std::mem::offset_of!(retro_perf_counter, call_cnt) == perf_counter_call_count_offset);
2132    assert!(std::mem::offset_of!(retro_perf_counter, registered) == perf_counter_registered_offset);
2133
2134    assert!(std::mem::size_of::<retro_perf_callback>() == 28);
2135    assert!(std::mem::align_of::<retro_perf_callback>() == 4);
2136    assert!(std::mem::offset_of!(retro_perf_callback, get_time_usec) == 0);
2137    assert!(std::mem::offset_of!(retro_perf_callback, get_cpu_features) == 4);
2138    assert!(std::mem::offset_of!(retro_perf_callback, get_perf_counter) == 8);
2139    assert!(std::mem::offset_of!(retro_perf_callback, perf_register) == 12);
2140    assert!(std::mem::offset_of!(retro_perf_callback, perf_start) == 16);
2141    assert!(std::mem::offset_of!(retro_perf_callback, perf_stop) == 20);
2142    assert!(std::mem::offset_of!(retro_perf_callback, perf_log) == 24);
2143
2144    assert!(std::mem::size_of::<retro_keyboard_callback>() == 4);
2145    assert!(std::mem::align_of::<retro_keyboard_callback>() == 4);
2146    assert!(std::mem::offset_of!(retro_keyboard_callback, callback) == 0);
2147
2148    assert!(std::mem::size_of::<retro_audio_callback>() == 8);
2149    assert!(std::mem::align_of::<retro_audio_callback>() == 4);
2150    assert!(std::mem::offset_of!(retro_audio_callback, callback) == 0);
2151    assert!(std::mem::offset_of!(retro_audio_callback, set_state) == 4);
2152
2153    assert!(std::mem::size_of::<retro_audio_buffer_status_callback>() == 4);
2154    assert!(std::mem::align_of::<retro_audio_buffer_status_callback>() == 4);
2155    assert!(std::mem::offset_of!(retro_audio_buffer_status_callback, callback) == 0);
2156
2157    let frame_time_reference_offset = (std::mem::size_of::<retro_frame_time_callback_t>()
2158        + std::mem::align_of::<retro_usec_t>()
2159        - 1)
2160        & !(std::mem::align_of::<retro_usec_t>() - 1);
2161    assert!(
2162        std::mem::size_of::<retro_frame_time_callback>()
2163            == frame_time_reference_offset + std::mem::size_of::<retro_usec_t>()
2164    );
2165    assert!(
2166        std::mem::align_of::<retro_frame_time_callback>()
2167            == max_usize(
2168                std::mem::align_of::<retro_frame_time_callback_t>(),
2169                std::mem::align_of::<retro_usec_t>(),
2170            )
2171    );
2172    assert!(std::mem::offset_of!(retro_frame_time_callback, callback) == 0);
2173    assert!(
2174        std::mem::offset_of!(retro_frame_time_callback, reference) == frame_time_reference_offset
2175    );
2176
2177    assert!(std::mem::size_of::<retro_get_proc_address_interface>() == 4);
2178    assert!(std::mem::align_of::<retro_get_proc_address_interface>() == 4);
2179    assert!(std::mem::offset_of!(retro_get_proc_address_interface, get_proc_address) == 0);
2180
2181    assert!(std::mem::size_of::<retro_fastforwarding_override>() == 8);
2182    assert!(std::mem::align_of::<retro_fastforwarding_override>() == 4);
2183    assert!(std::mem::offset_of!(retro_fastforwarding_override, ratio) == 0);
2184    assert!(std::mem::offset_of!(retro_fastforwarding_override, fastforward) == 4);
2185    assert!(std::mem::offset_of!(retro_fastforwarding_override, notification) == 5);
2186    assert!(std::mem::offset_of!(retro_fastforwarding_override, inhibit_toggle) == 6);
2187
2188    assert!(std::mem::size_of::<retro_throttle_state>() == 8);
2189    assert!(std::mem::align_of::<retro_throttle_state>() == 4);
2190    assert!(std::mem::offset_of!(retro_throttle_state, mode) == 0);
2191    assert!(std::mem::offset_of!(retro_throttle_state, rate) == 4);
2192
2193    assert!(std::mem::size_of::<retro_variable>() == 8);
2194    assert!(std::mem::align_of::<retro_variable>() == 4);
2195    assert!(std::mem::offset_of!(retro_variable, key) == 0);
2196    assert!(std::mem::offset_of!(retro_variable, value) == 4);
2197
2198    assert!(std::mem::size_of::<retro_core_option_display>() == 8);
2199    assert!(std::mem::align_of::<retro_core_option_display>() == 4);
2200    assert!(std::mem::offset_of!(retro_core_option_display, key) == 0);
2201    assert!(std::mem::offset_of!(retro_core_option_display, visible) == 4);
2202
2203    assert!(std::mem::size_of::<retro_core_option_value>() == 8);
2204    assert!(std::mem::align_of::<retro_core_option_value>() == 4);
2205    assert!(std::mem::offset_of!(retro_core_option_value, value) == 0);
2206    assert!(std::mem::offset_of!(retro_core_option_value, label) == 4);
2207
2208    assert!(std::mem::size_of::<retro_core_option_definition>() == 1040);
2209    assert!(std::mem::align_of::<retro_core_option_definition>() == 4);
2210    assert!(std::mem::offset_of!(retro_core_option_definition, key) == 0);
2211    assert!(std::mem::offset_of!(retro_core_option_definition, desc) == 4);
2212    assert!(std::mem::offset_of!(retro_core_option_definition, info) == 8);
2213    assert!(std::mem::offset_of!(retro_core_option_definition, values) == 12);
2214    assert!(std::mem::offset_of!(retro_core_option_definition, default_value) == 1036);
2215
2216    assert!(std::mem::size_of::<retro_core_options_intl>() == 8);
2217    assert!(std::mem::align_of::<retro_core_options_intl>() == 4);
2218    assert!(std::mem::offset_of!(retro_core_options_intl, us) == 0);
2219    assert!(std::mem::offset_of!(retro_core_options_intl, local) == 4);
2220
2221    assert!(std::mem::size_of::<retro_core_option_v2_category>() == 12);
2222    assert!(std::mem::align_of::<retro_core_option_v2_category>() == 4);
2223    assert!(std::mem::offset_of!(retro_core_option_v2_category, key) == 0);
2224    assert!(std::mem::offset_of!(retro_core_option_v2_category, desc) == 4);
2225    assert!(std::mem::offset_of!(retro_core_option_v2_category, info) == 8);
2226
2227    assert!(std::mem::size_of::<retro_core_option_v2_definition>() == 1052);
2228    assert!(std::mem::align_of::<retro_core_option_v2_definition>() == 4);
2229    assert!(std::mem::offset_of!(retro_core_option_v2_definition, key) == 0);
2230    assert!(std::mem::offset_of!(retro_core_option_v2_definition, desc) == 4);
2231    assert!(std::mem::offset_of!(retro_core_option_v2_definition, desc_categorized) == 8);
2232    assert!(std::mem::offset_of!(retro_core_option_v2_definition, info) == 12);
2233    assert!(std::mem::offset_of!(retro_core_option_v2_definition, info_categorized) == 16);
2234    assert!(std::mem::offset_of!(retro_core_option_v2_definition, category_key) == 20);
2235    assert!(std::mem::offset_of!(retro_core_option_v2_definition, values) == 24);
2236    assert!(std::mem::offset_of!(retro_core_option_v2_definition, default_value) == 1048);
2237
2238    assert!(std::mem::size_of::<retro_core_options_v2>() == 8);
2239    assert!(std::mem::align_of::<retro_core_options_v2>() == 4);
2240    assert!(std::mem::offset_of!(retro_core_options_v2, categories) == 0);
2241    assert!(std::mem::offset_of!(retro_core_options_v2, definitions) == 4);
2242
2243    assert!(std::mem::size_of::<retro_core_options_v2_intl>() == 8);
2244    assert!(std::mem::align_of::<retro_core_options_v2_intl>() == 4);
2245    assert!(std::mem::offset_of!(retro_core_options_v2_intl, us) == 0);
2246    assert!(std::mem::offset_of!(retro_core_options_v2_intl, local) == 4);
2247
2248    assert!(std::mem::size_of::<retro_core_options_update_display_callback>() == 4);
2249    assert!(std::mem::align_of::<retro_core_options_update_display_callback>() == 4);
2250    assert!(std::mem::offset_of!(retro_core_options_update_display_callback, callback) == 0);
2251
2252    assert!(std::mem::size_of::<retro_system_content_info_override>() == 8);
2253    assert!(std::mem::align_of::<retro_system_content_info_override>() == 4);
2254    assert!(std::mem::offset_of!(retro_system_content_info_override, extensions) == 0);
2255    assert!(std::mem::offset_of!(retro_system_content_info_override, need_fullpath) == 4);
2256    assert!(std::mem::offset_of!(retro_system_content_info_override, persistent_data) == 5);
2257
2258    assert!(std::mem::size_of::<retro_game_info>() == 16);
2259    assert!(std::mem::align_of::<retro_game_info>() == 4);
2260
2261    assert!(std::mem::size_of::<retro_game_info_ext>() == 40);
2262    assert!(std::mem::align_of::<retro_game_info_ext>() == 4);
2263    assert!(std::mem::offset_of!(retro_game_info_ext, full_path) == 0);
2264    assert!(std::mem::offset_of!(retro_game_info_ext, archive_path) == 4);
2265    assert!(std::mem::offset_of!(retro_game_info_ext, archive_file) == 8);
2266    assert!(std::mem::offset_of!(retro_game_info_ext, dir) == 12);
2267    assert!(std::mem::offset_of!(retro_game_info_ext, name) == 16);
2268    assert!(std::mem::offset_of!(retro_game_info_ext, ext) == 20);
2269    assert!(std::mem::offset_of!(retro_game_info_ext, meta) == 24);
2270    assert!(std::mem::offset_of!(retro_game_info_ext, data) == 28);
2271    assert!(std::mem::offset_of!(retro_game_info_ext, size) == 32);
2272    assert!(std::mem::offset_of!(retro_game_info_ext, file_in_archive) == 36);
2273    assert!(std::mem::offset_of!(retro_game_info_ext, persistent_data) == 37);
2274
2275    assert!(std::mem::size_of::<retro_hw_render_callback>() == 40);
2276    assert!(std::mem::align_of::<retro_hw_render_callback>() == 4);
2277    assert!(std::mem::offset_of!(retro_hw_render_callback, context_type) == 0);
2278    assert!(std::mem::offset_of!(retro_hw_render_callback, context_reset) == 4);
2279    assert!(std::mem::offset_of!(retro_hw_render_callback, get_current_framebuffer) == 8);
2280    assert!(std::mem::offset_of!(retro_hw_render_callback, get_proc_address) == 12);
2281    assert!(std::mem::offset_of!(retro_hw_render_callback, depth) == 16);
2282    assert!(std::mem::offset_of!(retro_hw_render_callback, stencil) == 17);
2283    assert!(std::mem::offset_of!(retro_hw_render_callback, bottom_left_origin) == 18);
2284    assert!(std::mem::offset_of!(retro_hw_render_callback, version_major) == 20);
2285    assert!(std::mem::offset_of!(retro_hw_render_callback, version_minor) == 24);
2286    assert!(std::mem::offset_of!(retro_hw_render_callback, cache_context) == 28);
2287    assert!(std::mem::offset_of!(retro_hw_render_callback, context_destroy) == 32);
2288    assert!(std::mem::offset_of!(retro_hw_render_callback, debug_context) == 36);
2289
2290    assert!(std::mem::size_of::<retro_hw_render_interface>() == 8);
2291    assert!(std::mem::align_of::<retro_hw_render_interface>() == 4);
2292    assert!(std::mem::offset_of!(retro_hw_render_interface, interface_type) == 0);
2293    assert!(std::mem::offset_of!(retro_hw_render_interface, interface_version) == 4);
2294
2295    assert!(std::mem::size_of::<retro_hw_render_context_negotiation_interface>() == 8);
2296    assert!(std::mem::align_of::<retro_hw_render_context_negotiation_interface>() == 4);
2297    assert!(
2298        std::mem::offset_of!(
2299            retro_hw_render_context_negotiation_interface,
2300            interface_type
2301        ) == 0
2302    );
2303    assert!(
2304        std::mem::offset_of!(
2305            retro_hw_render_context_negotiation_interface,
2306            interface_version
2307        ) == 4
2308    );
2309};
2310
2311#[cfg(target_pointer_width = "64")]
2312const _: () = {
2313    assert!(std::mem::size_of::<retro_system_info>() == 32);
2314    assert!(std::mem::align_of::<retro_system_info>() == 8);
2315    assert!(std::mem::offset_of!(retro_system_info, need_fullpath) == 24);
2316    assert!(std::mem::offset_of!(retro_system_info, block_extract) == 25);
2317
2318    assert!(std::mem::size_of::<retro_system_av_info>() == 40);
2319
2320    assert!(std::mem::size_of::<retro_message>() == 16);
2321    assert!(std::mem::align_of::<retro_message>() == 8);
2322    assert!(std::mem::offset_of!(retro_message, msg) == 0);
2323    assert!(std::mem::offset_of!(retro_message, frames) == 8);
2324
2325    assert!(std::mem::size_of::<retro_message_ext>() == 32);
2326    assert!(std::mem::align_of::<retro_message_ext>() == 8);
2327    assert!(std::mem::offset_of!(retro_message_ext, msg) == 0);
2328    assert!(std::mem::offset_of!(retro_message_ext, duration) == 8);
2329    assert!(std::mem::offset_of!(retro_message_ext, priority) == 12);
2330    assert!(std::mem::offset_of!(retro_message_ext, level) == 16);
2331    assert!(std::mem::offset_of!(retro_message_ext, target) == 20);
2332    assert!(std::mem::offset_of!(retro_message_ext, type_) == 24);
2333    assert!(std::mem::offset_of!(retro_message_ext, progress) == 28);
2334
2335    assert!(std::mem::size_of::<retro_input_descriptor>() == 24);
2336    assert!(std::mem::align_of::<retro_input_descriptor>() == 8);
2337    assert!(std::mem::offset_of!(retro_input_descriptor, port) == 0);
2338    assert!(std::mem::offset_of!(retro_input_descriptor, device) == 4);
2339    assert!(std::mem::offset_of!(retro_input_descriptor, index) == 8);
2340    assert!(std::mem::offset_of!(retro_input_descriptor, id) == 12);
2341    assert!(std::mem::offset_of!(retro_input_descriptor, description) == 16);
2342
2343    assert!(std::mem::size_of::<retro_device_power>() == 12);
2344    assert!(std::mem::align_of::<retro_device_power>() == 4);
2345    assert!(std::mem::offset_of!(retro_device_power, state) == 0);
2346    assert!(std::mem::offset_of!(retro_device_power, seconds) == 4);
2347    assert!(std::mem::offset_of!(retro_device_power, percent) == 8);
2348
2349    assert!(std::mem::size_of::<retro_memory_descriptor>() == 64);
2350    assert!(std::mem::align_of::<retro_memory_descriptor>() == 8);
2351    assert!(std::mem::offset_of!(retro_memory_descriptor, flags) == 0);
2352    assert!(std::mem::offset_of!(retro_memory_descriptor, ptr) == 8);
2353    assert!(std::mem::offset_of!(retro_memory_descriptor, offset) == 16);
2354    assert!(std::mem::offset_of!(retro_memory_descriptor, start) == 24);
2355    assert!(std::mem::offset_of!(retro_memory_descriptor, select) == 32);
2356    assert!(std::mem::offset_of!(retro_memory_descriptor, disconnect) == 40);
2357    assert!(std::mem::offset_of!(retro_memory_descriptor, len) == 48);
2358    assert!(std::mem::offset_of!(retro_memory_descriptor, addrspace) == 56);
2359
2360    assert!(std::mem::size_of::<retro_memory_map>() == 16);
2361    assert!(std::mem::align_of::<retro_memory_map>() == 8);
2362    assert!(std::mem::offset_of!(retro_memory_map, descriptors) == 0);
2363    assert!(std::mem::offset_of!(retro_memory_map, num_descriptors) == 8);
2364
2365    assert!(std::mem::size_of::<retro_controller_description>() == 16);
2366    assert!(std::mem::align_of::<retro_controller_description>() == 8);
2367    assert!(std::mem::offset_of!(retro_controller_description, desc) == 0);
2368    assert!(std::mem::offset_of!(retro_controller_description, id) == 8);
2369
2370    assert!(std::mem::size_of::<retro_controller_info>() == 16);
2371    assert!(std::mem::align_of::<retro_controller_info>() == 8);
2372    assert!(std::mem::offset_of!(retro_controller_info, types) == 0);
2373    assert!(std::mem::offset_of!(retro_controller_info, num_types) == 8);
2374
2375    assert!(std::mem::size_of::<retro_framebuffer>() == 40);
2376    assert!(std::mem::align_of::<retro_framebuffer>() == 8);
2377    assert!(std::mem::offset_of!(retro_framebuffer, data) == 0);
2378    assert!(std::mem::offset_of!(retro_framebuffer, width) == 8);
2379    assert!(std::mem::offset_of!(retro_framebuffer, height) == 12);
2380    assert!(std::mem::offset_of!(retro_framebuffer, pitch) == 16);
2381    assert!(std::mem::offset_of!(retro_framebuffer, format) == 24);
2382    assert!(std::mem::offset_of!(retro_framebuffer, access_flags) == 28);
2383    assert!(std::mem::offset_of!(retro_framebuffer, memory_flags) == 32);
2384
2385    assert!(std::mem::size_of::<retro_led_interface>() == 8);
2386    assert!(std::mem::align_of::<retro_led_interface>() == 8);
2387    assert!(std::mem::offset_of!(retro_led_interface, set_led_state) == 0);
2388
2389    assert!(std::mem::size_of::<retro_rumble_interface>() == 8);
2390    assert!(std::mem::align_of::<retro_rumble_interface>() == 8);
2391    assert!(std::mem::offset_of!(retro_rumble_interface, set_rumble_state) == 0);
2392
2393    assert!(std::mem::size_of::<retro_sensor_interface>() == 16);
2394    assert!(std::mem::align_of::<retro_sensor_interface>() == 8);
2395    assert!(std::mem::offset_of!(retro_sensor_interface, set_sensor_state) == 0);
2396    assert!(std::mem::offset_of!(retro_sensor_interface, get_sensor_input) == 8);
2397
2398    assert!(std::mem::size_of::<retro_camera_callback>() == 64);
2399    assert!(std::mem::align_of::<retro_camera_callback>() == 8);
2400    assert!(std::mem::offset_of!(retro_camera_callback, caps) == 0);
2401    assert!(std::mem::offset_of!(retro_camera_callback, width) == 8);
2402    assert!(std::mem::offset_of!(retro_camera_callback, height) == 12);
2403    assert!(std::mem::offset_of!(retro_camera_callback, start) == 16);
2404    assert!(std::mem::offset_of!(retro_camera_callback, stop) == 24);
2405    assert!(std::mem::offset_of!(retro_camera_callback, frame_raw_framebuffer) == 32);
2406    assert!(std::mem::offset_of!(retro_camera_callback, frame_opengl_texture) == 40);
2407    assert!(std::mem::offset_of!(retro_camera_callback, initialized) == 48);
2408    assert!(std::mem::offset_of!(retro_camera_callback, deinitialized) == 56);
2409
2410    assert!(std::mem::size_of::<retro_location_callback>() == 48);
2411    assert!(std::mem::align_of::<retro_location_callback>() == 8);
2412    assert!(std::mem::offset_of!(retro_location_callback, start) == 0);
2413    assert!(std::mem::offset_of!(retro_location_callback, stop) == 8);
2414    assert!(std::mem::offset_of!(retro_location_callback, get_position) == 16);
2415    assert!(std::mem::offset_of!(retro_location_callback, set_interval) == 24);
2416    assert!(std::mem::offset_of!(retro_location_callback, initialized) == 32);
2417    assert!(std::mem::offset_of!(retro_location_callback, deinitialized) == 40);
2418
2419    assert!(std::mem::size_of::<retro_subsystem_memory_info>() == 16);
2420    assert!(std::mem::align_of::<retro_subsystem_memory_info>() == 8);
2421    assert!(std::mem::offset_of!(retro_subsystem_memory_info, extension) == 0);
2422    assert!(std::mem::offset_of!(retro_subsystem_memory_info, memory_type) == 8);
2423
2424    assert!(std::mem::size_of::<retro_subsystem_rom_info>() == 40);
2425    assert!(std::mem::align_of::<retro_subsystem_rom_info>() == 8);
2426    assert!(std::mem::offset_of!(retro_subsystem_rom_info, desc) == 0);
2427    assert!(std::mem::offset_of!(retro_subsystem_rom_info, valid_extensions) == 8);
2428    assert!(std::mem::offset_of!(retro_subsystem_rom_info, need_fullpath) == 16);
2429    assert!(std::mem::offset_of!(retro_subsystem_rom_info, block_extract) == 17);
2430    assert!(std::mem::offset_of!(retro_subsystem_rom_info, required) == 18);
2431    assert!(std::mem::offset_of!(retro_subsystem_rom_info, memory) == 24);
2432    assert!(std::mem::offset_of!(retro_subsystem_rom_info, num_memory) == 32);
2433
2434    assert!(std::mem::size_of::<retro_subsystem_info>() == 32);
2435    assert!(std::mem::align_of::<retro_subsystem_info>() == 8);
2436    assert!(std::mem::offset_of!(retro_subsystem_info, desc) == 0);
2437    assert!(std::mem::offset_of!(retro_subsystem_info, ident) == 8);
2438    assert!(std::mem::offset_of!(retro_subsystem_info, roms) == 16);
2439    assert!(std::mem::offset_of!(retro_subsystem_info, num_roms) == 24);
2440    assert!(std::mem::offset_of!(retro_subsystem_info, id) == 28);
2441
2442    assert!(std::mem::size_of::<retro_disk_control_callback>() == 56);
2443    assert!(std::mem::align_of::<retro_disk_control_callback>() == 8);
2444    assert!(std::mem::offset_of!(retro_disk_control_callback, set_eject_state) == 0);
2445    assert!(std::mem::offset_of!(retro_disk_control_callback, get_eject_state) == 8);
2446    assert!(std::mem::offset_of!(retro_disk_control_callback, get_image_index) == 16);
2447    assert!(std::mem::offset_of!(retro_disk_control_callback, set_image_index) == 24);
2448    assert!(std::mem::offset_of!(retro_disk_control_callback, get_num_images) == 32);
2449    assert!(std::mem::offset_of!(retro_disk_control_callback, replace_image_index) == 40);
2450    assert!(std::mem::offset_of!(retro_disk_control_callback, add_image_index) == 48);
2451
2452    assert!(std::mem::size_of::<retro_disk_control_ext_callback>() == 80);
2453    assert!(std::mem::align_of::<retro_disk_control_ext_callback>() == 8);
2454    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_eject_state) == 0);
2455    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_eject_state) == 8);
2456    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_index) == 16);
2457    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_image_index) == 24);
2458    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_num_images) == 32);
2459    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, replace_image_index) == 40);
2460    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, add_image_index) == 48);
2461    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, set_initial_image) == 56);
2462    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_path) == 64);
2463    assert!(std::mem::offset_of!(retro_disk_control_ext_callback, get_image_label) == 72);
2464
2465    assert!(std::mem::size_of::<retro_netpacket_callback>() == 56);
2466    assert!(std::mem::align_of::<retro_netpacket_callback>() == 8);
2467    assert!(std::mem::offset_of!(retro_netpacket_callback, start) == 0);
2468    assert!(std::mem::offset_of!(retro_netpacket_callback, receive) == 8);
2469    assert!(std::mem::offset_of!(retro_netpacket_callback, stop) == 16);
2470    assert!(std::mem::offset_of!(retro_netpacket_callback, poll) == 24);
2471    assert!(std::mem::offset_of!(retro_netpacket_callback, connected) == 32);
2472    assert!(std::mem::offset_of!(retro_netpacket_callback, disconnected) == 40);
2473    assert!(std::mem::offset_of!(retro_netpacket_callback, protocol_version) == 48);
2474
2475    assert!(std::mem::size_of::<retro_microphone_params>() == 4);
2476    assert!(std::mem::align_of::<retro_microphone_params>() == 4);
2477    assert!(std::mem::offset_of!(retro_microphone_params, rate) == 0);
2478
2479    assert!(std::mem::size_of::<retro_microphone_interface>() == 56);
2480    assert!(std::mem::align_of::<retro_microphone_interface>() == 8);
2481    assert!(std::mem::offset_of!(retro_microphone_interface, interface_version) == 0);
2482    assert!(std::mem::offset_of!(retro_microphone_interface, open_mic) == 8);
2483    assert!(std::mem::offset_of!(retro_microphone_interface, close_mic) == 16);
2484    assert!(std::mem::offset_of!(retro_microphone_interface, get_params) == 24);
2485    assert!(std::mem::offset_of!(retro_microphone_interface, set_mic_state) == 32);
2486    assert!(std::mem::offset_of!(retro_microphone_interface, get_mic_state) == 40);
2487    assert!(std::mem::offset_of!(retro_microphone_interface, read_mic) == 48);
2488
2489    assert!(std::mem::size_of::<retro_vfs_interface>() == 152);
2490    assert!(std::mem::align_of::<retro_vfs_interface>() == 8);
2491    assert!(std::mem::offset_of!(retro_vfs_interface, get_path) == 0);
2492    assert!(std::mem::offset_of!(retro_vfs_interface, open) == 8);
2493    assert!(std::mem::offset_of!(retro_vfs_interface, close) == 16);
2494    assert!(std::mem::offset_of!(retro_vfs_interface, size) == 24);
2495    assert!(std::mem::offset_of!(retro_vfs_interface, tell) == 32);
2496    assert!(std::mem::offset_of!(retro_vfs_interface, seek) == 40);
2497    assert!(std::mem::offset_of!(retro_vfs_interface, read) == 48);
2498    assert!(std::mem::offset_of!(retro_vfs_interface, write) == 56);
2499    assert!(std::mem::offset_of!(retro_vfs_interface, flush) == 64);
2500    assert!(std::mem::offset_of!(retro_vfs_interface, remove) == 72);
2501    assert!(std::mem::offset_of!(retro_vfs_interface, rename) == 80);
2502    assert!(std::mem::offset_of!(retro_vfs_interface, truncate) == 88);
2503    assert!(std::mem::offset_of!(retro_vfs_interface, stat) == 96);
2504    assert!(std::mem::offset_of!(retro_vfs_interface, mkdir) == 104);
2505    assert!(std::mem::offset_of!(retro_vfs_interface, opendir) == 112);
2506    assert!(std::mem::offset_of!(retro_vfs_interface, readdir) == 120);
2507    assert!(std::mem::offset_of!(retro_vfs_interface, dirent_get_name) == 128);
2508    assert!(std::mem::offset_of!(retro_vfs_interface, dirent_is_dir) == 136);
2509    assert!(std::mem::offset_of!(retro_vfs_interface, closedir) == 144);
2510
2511    assert!(std::mem::size_of::<retro_vfs_interface_info>() == 16);
2512    assert!(std::mem::align_of::<retro_vfs_interface_info>() == 8);
2513    assert!(std::mem::offset_of!(retro_vfs_interface_info, required_interface_version) == 0);
2514    assert!(std::mem::offset_of!(retro_vfs_interface_info, iface) == 8);
2515
2516    assert!(std::mem::size_of::<retro_midi_interface>() == 40);
2517    assert!(std::mem::align_of::<retro_midi_interface>() == 8);
2518    assert!(std::mem::offset_of!(retro_midi_interface, input_enabled) == 0);
2519    assert!(std::mem::offset_of!(retro_midi_interface, output_enabled) == 8);
2520    assert!(std::mem::offset_of!(retro_midi_interface, read) == 16);
2521    assert!(std::mem::offset_of!(retro_midi_interface, write) == 24);
2522    assert!(std::mem::offset_of!(retro_midi_interface, flush) == 32);
2523
2524    assert!(std::mem::size_of::<retro_perf_counter>() == 40);
2525    assert!(std::mem::align_of::<retro_perf_counter>() == 8);
2526    assert!(std::mem::offset_of!(retro_perf_counter, ident) == 0);
2527    assert!(std::mem::offset_of!(retro_perf_counter, start) == 8);
2528    assert!(std::mem::offset_of!(retro_perf_counter, total) == 16);
2529    assert!(std::mem::offset_of!(retro_perf_counter, call_cnt) == 24);
2530    assert!(std::mem::offset_of!(retro_perf_counter, registered) == 32);
2531
2532    assert!(std::mem::size_of::<retro_perf_callback>() == 56);
2533    assert!(std::mem::align_of::<retro_perf_callback>() == 8);
2534    assert!(std::mem::offset_of!(retro_perf_callback, get_time_usec) == 0);
2535    assert!(std::mem::offset_of!(retro_perf_callback, get_cpu_features) == 8);
2536    assert!(std::mem::offset_of!(retro_perf_callback, get_perf_counter) == 16);
2537    assert!(std::mem::offset_of!(retro_perf_callback, perf_register) == 24);
2538    assert!(std::mem::offset_of!(retro_perf_callback, perf_start) == 32);
2539    assert!(std::mem::offset_of!(retro_perf_callback, perf_stop) == 40);
2540    assert!(std::mem::offset_of!(retro_perf_callback, perf_log) == 48);
2541
2542    assert!(std::mem::size_of::<retro_keyboard_callback>() == 8);
2543    assert!(std::mem::align_of::<retro_keyboard_callback>() == 8);
2544    assert!(std::mem::offset_of!(retro_keyboard_callback, callback) == 0);
2545
2546    assert!(std::mem::size_of::<retro_audio_callback>() == 16);
2547    assert!(std::mem::align_of::<retro_audio_callback>() == 8);
2548    assert!(std::mem::offset_of!(retro_audio_callback, callback) == 0);
2549    assert!(std::mem::offset_of!(retro_audio_callback, set_state) == 8);
2550
2551    assert!(std::mem::size_of::<retro_audio_buffer_status_callback>() == 8);
2552    assert!(std::mem::align_of::<retro_audio_buffer_status_callback>() == 8);
2553    assert!(std::mem::offset_of!(retro_audio_buffer_status_callback, callback) == 0);
2554
2555    assert!(std::mem::size_of::<retro_frame_time_callback>() == 16);
2556    assert!(std::mem::align_of::<retro_frame_time_callback>() == 8);
2557    assert!(std::mem::offset_of!(retro_frame_time_callback, callback) == 0);
2558    assert!(std::mem::offset_of!(retro_frame_time_callback, reference) == 8);
2559
2560    assert!(std::mem::size_of::<retro_get_proc_address_interface>() == 8);
2561    assert!(std::mem::align_of::<retro_get_proc_address_interface>() == 8);
2562    assert!(std::mem::offset_of!(retro_get_proc_address_interface, get_proc_address) == 0);
2563
2564    assert!(std::mem::size_of::<retro_fastforwarding_override>() == 8);
2565    assert!(std::mem::align_of::<retro_fastforwarding_override>() == 4);
2566    assert!(std::mem::offset_of!(retro_fastforwarding_override, ratio) == 0);
2567    assert!(std::mem::offset_of!(retro_fastforwarding_override, fastforward) == 4);
2568    assert!(std::mem::offset_of!(retro_fastforwarding_override, notification) == 5);
2569    assert!(std::mem::offset_of!(retro_fastforwarding_override, inhibit_toggle) == 6);
2570
2571    assert!(std::mem::size_of::<retro_throttle_state>() == 8);
2572    assert!(std::mem::align_of::<retro_throttle_state>() == 4);
2573    assert!(std::mem::offset_of!(retro_throttle_state, mode) == 0);
2574    assert!(std::mem::offset_of!(retro_throttle_state, rate) == 4);
2575
2576    assert!(std::mem::size_of::<retro_variable>() == 16);
2577    assert!(std::mem::align_of::<retro_variable>() == 8);
2578    assert!(std::mem::offset_of!(retro_variable, key) == 0);
2579    assert!(std::mem::offset_of!(retro_variable, value) == 8);
2580
2581    assert!(std::mem::size_of::<retro_core_option_display>() == 16);
2582    assert!(std::mem::align_of::<retro_core_option_display>() == 8);
2583    assert!(std::mem::offset_of!(retro_core_option_display, key) == 0);
2584    assert!(std::mem::offset_of!(retro_core_option_display, visible) == 8);
2585
2586    assert!(std::mem::size_of::<retro_core_option_value>() == 16);
2587    assert!(std::mem::align_of::<retro_core_option_value>() == 8);
2588    assert!(std::mem::offset_of!(retro_core_option_value, value) == 0);
2589    assert!(std::mem::offset_of!(retro_core_option_value, label) == 8);
2590
2591    assert!(std::mem::size_of::<retro_core_option_definition>() == 2080);
2592    assert!(std::mem::align_of::<retro_core_option_definition>() == 8);
2593    assert!(std::mem::offset_of!(retro_core_option_definition, key) == 0);
2594    assert!(std::mem::offset_of!(retro_core_option_definition, desc) == 8);
2595    assert!(std::mem::offset_of!(retro_core_option_definition, info) == 16);
2596    assert!(std::mem::offset_of!(retro_core_option_definition, values) == 24);
2597    assert!(std::mem::offset_of!(retro_core_option_definition, default_value) == 2072);
2598
2599    assert!(std::mem::size_of::<retro_core_options_intl>() == 16);
2600    assert!(std::mem::align_of::<retro_core_options_intl>() == 8);
2601    assert!(std::mem::offset_of!(retro_core_options_intl, us) == 0);
2602    assert!(std::mem::offset_of!(retro_core_options_intl, local) == 8);
2603
2604    assert!(std::mem::size_of::<retro_core_option_v2_category>() == 24);
2605    assert!(std::mem::align_of::<retro_core_option_v2_category>() == 8);
2606    assert!(std::mem::offset_of!(retro_core_option_v2_category, key) == 0);
2607    assert!(std::mem::offset_of!(retro_core_option_v2_category, desc) == 8);
2608    assert!(std::mem::offset_of!(retro_core_option_v2_category, info) == 16);
2609
2610    assert!(std::mem::size_of::<retro_core_option_v2_definition>() == 2104);
2611    assert!(std::mem::align_of::<retro_core_option_v2_definition>() == 8);
2612    assert!(std::mem::offset_of!(retro_core_option_v2_definition, key) == 0);
2613    assert!(std::mem::offset_of!(retro_core_option_v2_definition, desc) == 8);
2614    assert!(std::mem::offset_of!(retro_core_option_v2_definition, desc_categorized) == 16);
2615    assert!(std::mem::offset_of!(retro_core_option_v2_definition, info) == 24);
2616    assert!(std::mem::offset_of!(retro_core_option_v2_definition, info_categorized) == 32);
2617    assert!(std::mem::offset_of!(retro_core_option_v2_definition, category_key) == 40);
2618    assert!(std::mem::offset_of!(retro_core_option_v2_definition, values) == 48);
2619    assert!(std::mem::offset_of!(retro_core_option_v2_definition, default_value) == 2096);
2620
2621    assert!(std::mem::size_of::<retro_core_options_v2>() == 16);
2622    assert!(std::mem::align_of::<retro_core_options_v2>() == 8);
2623    assert!(std::mem::offset_of!(retro_core_options_v2, categories) == 0);
2624    assert!(std::mem::offset_of!(retro_core_options_v2, definitions) == 8);
2625
2626    assert!(std::mem::size_of::<retro_core_options_v2_intl>() == 16);
2627    assert!(std::mem::align_of::<retro_core_options_v2_intl>() == 8);
2628    assert!(std::mem::offset_of!(retro_core_options_v2_intl, us) == 0);
2629    assert!(std::mem::offset_of!(retro_core_options_v2_intl, local) == 8);
2630
2631    assert!(std::mem::size_of::<retro_core_options_update_display_callback>() == 8);
2632    assert!(std::mem::align_of::<retro_core_options_update_display_callback>() == 8);
2633    assert!(std::mem::offset_of!(retro_core_options_update_display_callback, callback) == 0);
2634
2635    assert!(std::mem::size_of::<retro_system_content_info_override>() == 16);
2636    assert!(std::mem::align_of::<retro_system_content_info_override>() == 8);
2637    assert!(std::mem::offset_of!(retro_system_content_info_override, extensions) == 0);
2638    assert!(std::mem::offset_of!(retro_system_content_info_override, need_fullpath) == 8);
2639    assert!(std::mem::offset_of!(retro_system_content_info_override, persistent_data) == 9);
2640
2641    assert!(std::mem::size_of::<retro_game_info>() == 32);
2642    assert!(std::mem::align_of::<retro_game_info>() == 8);
2643    assert!(std::mem::offset_of!(retro_game_info, path) == 0);
2644    assert!(std::mem::offset_of!(retro_game_info, data) == 8);
2645    assert!(std::mem::offset_of!(retro_game_info, size) == 16);
2646    assert!(std::mem::offset_of!(retro_game_info, meta) == 24);
2647
2648    assert!(std::mem::size_of::<retro_game_info_ext>() == 80);
2649    assert!(std::mem::align_of::<retro_game_info_ext>() == 8);
2650    assert!(std::mem::offset_of!(retro_game_info_ext, full_path) == 0);
2651    assert!(std::mem::offset_of!(retro_game_info_ext, archive_path) == 8);
2652    assert!(std::mem::offset_of!(retro_game_info_ext, archive_file) == 16);
2653    assert!(std::mem::offset_of!(retro_game_info_ext, dir) == 24);
2654    assert!(std::mem::offset_of!(retro_game_info_ext, name) == 32);
2655    assert!(std::mem::offset_of!(retro_game_info_ext, ext) == 40);
2656    assert!(std::mem::offset_of!(retro_game_info_ext, meta) == 48);
2657    assert!(std::mem::offset_of!(retro_game_info_ext, data) == 56);
2658    assert!(std::mem::offset_of!(retro_game_info_ext, size) == 64);
2659    assert!(std::mem::offset_of!(retro_game_info_ext, file_in_archive) == 72);
2660    assert!(std::mem::offset_of!(retro_game_info_ext, persistent_data) == 73);
2661
2662    assert!(std::mem::size_of::<retro_hw_render_callback>() == 64);
2663    assert!(std::mem::align_of::<retro_hw_render_callback>() == 8);
2664    assert!(std::mem::offset_of!(retro_hw_render_callback, context_type) == 0);
2665    assert!(std::mem::offset_of!(retro_hw_render_callback, context_reset) == 8);
2666    assert!(std::mem::offset_of!(retro_hw_render_callback, get_current_framebuffer) == 16);
2667    assert!(std::mem::offset_of!(retro_hw_render_callback, get_proc_address) == 24);
2668    assert!(std::mem::offset_of!(retro_hw_render_callback, depth) == 32);
2669    assert!(std::mem::offset_of!(retro_hw_render_callback, stencil) == 33);
2670    assert!(std::mem::offset_of!(retro_hw_render_callback, bottom_left_origin) == 34);
2671    assert!(std::mem::offset_of!(retro_hw_render_callback, version_major) == 36);
2672    assert!(std::mem::offset_of!(retro_hw_render_callback, version_minor) == 40);
2673    assert!(std::mem::offset_of!(retro_hw_render_callback, cache_context) == 44);
2674    assert!(std::mem::offset_of!(retro_hw_render_callback, context_destroy) == 48);
2675    assert!(std::mem::offset_of!(retro_hw_render_callback, debug_context) == 56);
2676
2677    assert!(std::mem::size_of::<retro_hw_render_interface>() == 8);
2678    assert!(std::mem::align_of::<retro_hw_render_interface>() == 4);
2679    assert!(std::mem::offset_of!(retro_hw_render_interface, interface_type) == 0);
2680    assert!(std::mem::offset_of!(retro_hw_render_interface, interface_version) == 4);
2681
2682    assert!(std::mem::size_of::<retro_hw_render_context_negotiation_interface>() == 8);
2683    assert!(std::mem::align_of::<retro_hw_render_context_negotiation_interface>() == 4);
2684    assert!(
2685        std::mem::offset_of!(
2686            retro_hw_render_context_negotiation_interface,
2687            interface_type
2688        ) == 0
2689    );
2690    assert!(
2691        std::mem::offset_of!(
2692            retro_hw_render_context_negotiation_interface,
2693            interface_version
2694        ) == 4
2695    );
2696};