summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-01-14 08:28:56 +0100
committerMitya Selivanov <automainint@guattari.tech>2025-01-14 08:28:56 +0100
commitbefe5320de589d223baeff8914515753a5896b61 (patch)
tree2620aac301bdb9df19349ea9a5d80c7a84f006a2
parentdced6f7768e02252af11f9b41017d75c66b47d81 (diff)
downloadreduced_system_layer-befe5320de589d223baeff8914515753a5896b61.zip
wasm fixes
-rw-r--r--index.htm24
-rwxr-xr-xreduced_system_layer.c70
2 files changed, 64 insertions, 30 deletions
diff --git a/index.htm b/index.htm
index e06e63b..0e5b1fb 100644
--- a/index.htm
+++ b/index.htm
@@ -63,22 +63,26 @@
},
}
).then((program) => {
- program.exports.js_main(
- options.processorOptions.href // FIXME
- );
+ this.memory_buffer = program.exports.memory.buffer;
+
+ let href_bytes = options.processorOptions.href;
+ let href_address = program.exports.js_href();
+ let href_len = Math.min(program.exports.js_href_size(), href_bytes.length);
+ new Uint8Array(this.memory_buffer, href_address, href_len).set(href_bytes.subarray(0, href_len));
+
+ program.exports.js_main();
- this.memory_buffer = program.exports.memory.buffer;
this.sound_buffer_address = program.exports.js_sound_buffer();
this.pixels_address = program.exports.js_pixels();
this.frames = new Float32Array(this.memory_buffer, this.sound_buffer_address, program.exports.js_max_num_audio_frames());
let bytes = new Uint8Array(this.memory_buffer);
let title_address = program.exports.js_title();
- let len = 0;
- while (bytes[title_address + len] != 0)
- ++len;
- let title_buffer = new ArrayBuffer(len);
- new Uint8Array(title_buffer).set(bytes.subarray(title_address, title_address + len));
+ let title_len = 0;
+ while (bytes[title_address + title_len] != 0)
+ ++title_len;
+ let title_buffer = new ArrayBuffer(title_len);
+ new Uint8Array(title_buffer).set(bytes.subarray(title_address, title_address + title_len));
this.port.postMessage({
id : "init",
@@ -385,7 +389,7 @@
"Sound_Node",
{ numberOfInputs : 0,
outputChannelCount : [ sound_num_channels ],
- processorOptions : { href : document.location.href }, }
+ processorOptions : { href : new TextEncoder("utf8").encode(document.location.href) }, }
);
sound_node.connect(sound_context.destination);
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__)
// ================================================================