Skip to main content

gasm/
sys.rs

1//! Raw ABI. On wasm32 these are the real imports (see spec/ABI.md). On other
2//! targets they are backed by [`crate::native`], an in-process stub host used
3//! for native parity tests and benchmarks.
4//!
5//! GENERATED from spec/abi.json by scripts/gen-abi.mjs. Do not edit by hand.
6
7#![allow(clippy::missing_safety_doc)]
8
9#[cfg(target_arch = "wasm32")]
10mod imports {
11    #[link(wasm_import_module = "gasm")]
12    unsafe extern "C" {
13        /// Write a line to the runner's log.
14        pub fn log(msg: *const u8, msg_len: u32);
15        /// Monotonic time in milliseconds (virtual, frame-derived in headless runs).
16        pub fn time_ms() -> f64;
17        /// Rate (Hz) at which the runner calls gasm_frame(). Default 60; 1-1000.
18        pub fn set_frame_rate(hz: f64);
19        /// Present RGBA8 pixels (bytes R,G,B,A), stride bytes per row, w,h <= 4096. Copied before returning; letterboxed by the runner.
20        pub fn video_present(rgba: *const u8, width: u32, height: u32, stride: u32);
21        /// Format for audio_push: 8-192 kHz, 1 or 2 channels. Default 44100/2.
22        pub fn audio_config(sample_rate: u32, channels: u32);
23        /// Queue frames x channels interleaved f32 samples in [-1, 1]; the runner resamples.
24        pub fn audio_push(samples: *const f32, frames: u32);
25        /// Bitmask of GASM_BTN_* held on virtual pad player (0..3), stable within a frame.
26        pub fn input_pad(player: u32) -> u32;
27        /// Size in bytes of asset name, or -1 if it does not exist.
28        pub fn asset_size(name: *const u8, name_len: u32) -> i32;
29        /// Copy up to cap bytes of asset name into dst. Bytes copied, or -1 if missing.
30        pub fn asset_read(name: *const u8, name_len: u32, dst: *mut u8, cap: u32) -> i32;
31        /// Copy up to len bytes of asset name starting at offset (streaming). Bytes copied (0 at the end), or -1 if missing.
32        pub fn asset_read_at(name: *const u8, name_len: u32, offset: u32, dst: *mut u8, len: u32) -> i32;
33        /// Launch parameter value length, or -1 if unset. Copied only if length <= cap (cap = 0 queries the length).
34        pub fn param(name: *const u8, name_len: u32, dst: *mut u8, cap: u32) -> i32;
35    }
36
37    #[link(wasm_import_module = "gasm:gfx")]
38    unsafe extern "C" {
39        /// Current drawable width in pixels.
40        #[link_name = "width"]
41        pub fn gfx_width() -> u32;
42        /// Current drawable height in pixels.
43        #[link_name = "height"]
44        pub fn gfx_height() -> u32;
45        /// Compile WGSL source.
46        #[link_name = "create_shader"]
47        pub fn gfx_create_shader(wgsl: *const u8, wgsl_len: u32) -> u32;
48        /// size: non-zero multiple of 4; usage: GASM_BUF_* (WebGPU GPUBufferUsage bits; COPY_DST always added).
49        #[link_name = "create_buffer"]
50        pub fn gfx_create_buffer(size: u32, usage: u32) -> u32;
51        /// GPURenderPipelineDescriptor as JSON (layout auto).
52        #[link_name = "create_pipeline"]
53        pub fn gfx_create_pipeline(json: *const u8, json_len: u32) -> u32;
54        /// {"pipeline":P,"group":G,"entries":[{"binding":B,"buffer":H,"offset":O,"size":S}]}
55        #[link_name = "create_bind_group"]
56        pub fn gfx_create_bind_group(json: *const u8, json_len: u32) -> u32;
57        /// Queue a write, applied before the frame's draws. offset/len: multiples of 4.
58        #[link_name = "write_buffer"]
59        pub fn gfx_write_buffer(buffer: u32, offset: u32, data: *const u8, len: u32);
60        /// Start the frame (clears color and depth). 1 = will be shown, 0 = discarded (the guest may skip draws).
61        #[link_name = "begin_frame"]
62        pub fn gfx_begin_frame(r: f32, g: f32, b: f32, a: f32) -> u32;
63        #[link_name = "set_pipeline"]
64        pub fn gfx_set_pipeline(pipeline: u32);
65        #[link_name = "set_bind_group"]
66        pub fn gfx_set_bind_group(index: u32, bind_group: u32);
67        #[link_name = "set_vertex_buffer"]
68        pub fn gfx_set_vertex_buffer(slot: u32, buffer: u32, offset: u32);
69        /// format: GASM_INDEX_U16 or GASM_INDEX_U32.
70        #[link_name = "set_index_buffer"]
71        pub fn gfx_set_index_buffer(buffer: u32, format: u32, offset: u32);
72        #[link_name = "draw"]
73        pub fn gfx_draw(vertex_count: u32, instance_count: u32, first_vertex: u32, first_instance: u32);
74        #[link_name = "draw_indexed"]
75        pub fn gfx_draw_indexed(index_count: u32, instance_count: u32, first_index: u32, base_vertex: i32, first_instance: u32);
76        /// Submit and present.
77        #[link_name = "end_frame"]
78        pub fn gfx_end_frame();
79    }
80
81    #[link(wasm_import_module = "gasm:net")]
82    unsafe extern "C" {
83        /// Open a ws:// or wss:// URL. Handle > 0, or -1 if denied/invalid.
84        #[link_name = "open"]
85        pub fn net_open(url: *const u8, url_len: u32) -> i32;
86        /// GASM_NET_CONNECTING / OPEN / CLOSED / ERROR.
87        #[link_name = "state"]
88        pub fn net_state(conn: i32) -> u32;
89        /// Send one message (len > 0). 0, or -1 if not open.
90        #[link_name = "send"]
91        pub fn net_send(conn: i32, data: *const u8, len: u32) -> i32;
92        /// Next message's length (copied only if <= cap, else it stays queued), 0 if none, -1 if closed and drained.
93        #[link_name = "recv"]
94        pub fn net_recv(conn: i32, dst: *mut u8, cap: u32) -> i32;
95        #[link_name = "close"]
96        pub fn net_close(conn: i32);
97    }
98
99    #[link(wasm_import_module = "gasm:storage")]
100    unsafe extern "C" {
101        /// Value length, or -1 if missing. Copied only if length <= cap.
102        #[link_name = "get"]
103        pub fn storage_get(key: *const u8, key_len: u32, dst: *mut u8, cap: u32) -> i32;
104        /// 0, or -1 on invalid key, too large, quota exceeded or I/O error.
105        #[link_name = "set"]
106        pub fn storage_set(key: *const u8, key_len: u32, data: *const u8, len: u32) -> i32;
107        /// 0 if deleted, -1 if it did not exist.
108        #[link_name = "delete"]
109        pub fn storage_delete(key: *const u8, key_len: u32) -> i32;
110    }
111
112    #[link(wasm_import_module = "wasi_snapshot_preview1")]
113    unsafe extern "C" {
114        /// End the game; 0 is a normal exit.
115        pub fn proc_exit(code: i32) -> !;
116    }
117}
118
119#[cfg(target_arch = "wasm32")]
120pub use imports::*;
121
122#[cfg(not(target_arch = "wasm32"))]
123pub use crate::native::abi::*;