From befe5320de589d223baeff8914515753a5896b61 Mon Sep 17 00:00:00 2001 From: Mitya Selivanov Date: Tue, 14 Jan 2025 08:28:56 +0100 Subject: wasm fixes --- reduced_system_layer.c | 70 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 20 deletions(-) (limited to 'reduced_system_layer.c') diff --git a/reduced_system_layer.c b/reduced_system_layer.c index 522d672..cc150e9 100755 --- a/reduced_system_layer.c +++ b/reduced_system_layer.c @@ -184,8 +184,12 @@ extern "C" { #endif #ifndef MAX_NUM_SOCKETS +#if defined(__wasm__) +#define MAX_NUM_SOCKETS 0 +#else #define MAX_NUM_SOCKETS 64 #endif +#endif #ifndef MAX_NUM_KEYS #define MAX_NUM_KEYS 512 @@ -204,7 +208,11 @@ extern "C" { #endif #ifndef MAX_FRAME_DURATION -#define MAX_FRAME_DURATION 38 +#if defined(__wasm__) +#define MAX_FRAME_DURATION 83 +#else +#define MAX_FRAME_DURATION 41 +#endif #endif #ifndef NUM_SOUND_CHANNELS @@ -441,9 +449,8 @@ i64 p_send(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port); extern Platform g_platform; -#ifdef __wasm__ +#if defined(__wasm__) i32 main(i32 argc, c8 **argv); - f64 floor(f64 x); f64 ceil(f64 x); f64 sqrt(f64 x); @@ -460,6 +467,7 @@ f64 asin(f64 x); f64 acos(f64 x); f64 atan(f64 x); f64 atan2(f64 y, f64 x); +#endif // defined(__wasm__) #ifndef NULL #define NULL ((void *) 0) @@ -468,7 +476,6 @@ f64 atan2(f64 y, f64 x); #ifndef M_PI #define M_PI 3.14159265358979323846 #endif -#endif #ifdef __cplusplus } @@ -695,8 +702,8 @@ typedef struct { IP_Address address; } Socket_Slot; -b8 _sockets_ready = 0; -Socket_Slot _sockets[MAX_NUM_SOCKETS] = {0}; +static b8 _sockets_ready = 0; +static Socket_Slot _sockets[MAX_NUM_SOCKETS] = {0}; static void sockets_init(void) { if (_sockets_ready) @@ -1712,11 +1719,12 @@ void p_clipboard_write(i64 size, c8 *data) { // // ================================================================ -#ifdef __wasm__ +#if defined(__wasm__) +static c8 _href[512] = {0}; static i32 _frame_width = 0; static i32 _frame_height = 0; -static vec3_f32 _pixels[MAX_NUM_PIXELS] = {0}; +static vec4_f32 _pixels[MAX_NUM_PIXELS] = {0}; static i32 _pixel_size = 0; static u32 _pixels_scaled[MAX_NUM_PIXELS] = {0}; static u32 _pixels_internal[MAX_NUM_PIXELS] = {0}; @@ -1726,10 +1734,19 @@ static i32 _num_events = 0; static i32 _input_size = 0; static b8 _key_pressed[MAX_NUM_KEYS] = {0}; static b8 _wait_events = 0; -i64 _sound_position = 0; -i64 _sound_read = 0; -f32 _sound_ring[MAX_NUM_SOUND_FRAMES] = {0}; -f32 _sound_buffer[MAX_NUM_SOUND_FRAMES] = {0}; +static i64 _timeout = 0; +static i64 _sound_position = 0; +static i64 _sound_read = 0; +static f32 _sound_ring[MAX_NUM_SOUND_FRAMES] = {0}; +static f32 _sound_buffer[MAX_NUM_SOUND_FRAMES] = {0}; + +i64 p_recv(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port, IP_Address *remote_address) { + return 0; +} + +i64 p_send(u16 slot, IP_Address address, i64 size, u8 *data, u16 *local_port) { + return 0; +} i32 p_time_impl(void); @@ -1738,7 +1755,12 @@ i64 p_time(void) { } void p_sleep_for(i64 duration) { - // TODO + i64 t = p_time(); + + if (_timeout < t) + _timeout = t + duration; + else + _timeout += duration; } void p_init(void) { @@ -1775,11 +1797,11 @@ void p_render_frame(void) { if (_frame_width == g_platform.frame_width && _frame_height == g_platform.frame_height) { i64 size = g_platform.frame_width * g_platform.frame_height; for (i64 i = 0; i < size; ++i) - _pixels_internal[i] = 0xff000000u | rgb_u32_from_f32((vec3_f32) { _pixels[i].x, _pixels[i].y, _pixels[i].z }); + _pixels_internal[i] = 0xff000000u | rgb_u32_from_f32((vec3_f32) { _pixels[i].z, _pixels[i].y, _pixels[i].x }); } else { i64 size = g_platform.frame_width * g_platform.frame_height; for (i64 i = 0; i < size; ++i) - _pixels_scaled[i] = rgb_u32_from_f32((vec3_f32) { _pixels[i].x, _pixels[i].y, _pixels[i].z }); + _pixels_scaled[i] = rgb_u32_from_f32((vec3_f32) { _pixels[i].z, _pixels[i].y, _pixels[i].x }); for (i64 j = 0; j < _frame_height; ++j) { i64 j0 = (j * g_platform.frame_height) / _frame_height; @@ -1846,8 +1868,16 @@ void p_queue_sound(i64 delay_in_samples, i64 num_samples, f32 *frames) { } } -__attribute__((export_name("js_main"))) void js_main(c8 *href) { - main(1, &href); +__attribute__((export_name("js_href"))) void *js_href(void) { + return _href; +} + +__attribute__((export_name("js_href_size"))) i32 js_href_size(void) { + return (sizeof _href) - 1; +} + +__attribute__((export_name("js_main"))) void js_main(void) { + main(1, &_href); } __attribute__((export_name("js_title"))) void *js_title(void) { @@ -1877,7 +1907,7 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram } if (g_platform.real_width != _frame_width || g_platform.real_height != _frame_height) { - ++num_events; + ++_num_events; g_platform.real_width = frame_width; g_platform.real_height = frame_height; } @@ -1891,7 +1921,7 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram g_platform.done = 0; - b8 do_render = _num_events > 0 || !_wait_events; + b8 do_render = (frame_time >= _timeout) && (_num_events > 0 || !_wait_events); if (do_render) { _wait_events = 0; @@ -2000,7 +2030,7 @@ __attribute__((export_name("js_clipboard_buffer"))) void *js_clipboard_buffer(i3 return g_platform.clipboard; } -#endif // __wasm__ +#endif // defined(__wasm__) // ================================================================ -- cgit v1.2.3