From 1fd21affde5f13a357eaebb53339e6ce97eccbcb Mon Sep 17 00:00:00 2001 From: Maciej Samborski Date: Thu, 16 Jan 2025 23:07:37 +0100 Subject: [PATCH] Added `push` and `get` to wasmgl module --- src/js/wasm.js | 22 ++++++++++++++-------- src/js/wasm.ts | 30 ++++++++++++++++++++---------- src/wasm/main.c | 16 ++++++++-------- src/wasm/wasmgl.h | 2 +- 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/js/wasm.js b/src/js/wasm.js index e4f2afb..b4bb28a 100644 --- a/src/js/wasm.js +++ b/src/js/wasm.js @@ -1,11 +1,3 @@ -export class WASMGLvalue { - ptr; - size; - constructor(ptr, size) { - this.ptr = ptr; - this.size = size; - } -} export async function loadWasmModule(path) { return WebAssembly.instantiateStreaming(fetch(path)); } @@ -34,4 +26,18 @@ export class WASMGL { }); return ptr; } + push(data) { + let ptr = this.alloc(data.length); + data.forEach((v, i) => { + this.mem[ptr + i] = v; + }); + return ptr; + } + get(ptr, length) { + let a = new Array(length); + for (let i = 0; i < length; ++i) { + a[i] = this.mem[ptr + i]; + } + return a; + } } diff --git a/src/js/wasm.ts b/src/js/wasm.ts index 136c7f2..b2f5069 100644 --- a/src/js/wasm.ts +++ b/src/js/wasm.ts @@ -1,13 +1,3 @@ -export class WASMGLvalue { - ptr: number; - size: number; - - constructor(ptr: number, size: number) { - this.ptr = ptr; - this.size = size; - } -} - export interface WASMGLEnvironment { exports: any, mem: Float32Array, @@ -58,4 +48,24 @@ export class WASMGL { return ptr; } + + push(data: number[]): number { + let ptr = this.alloc(data.length); + + data.forEach((v, i) => { + this.mem[ptr + i] = v; + }); + + return ptr; + } + + get(ptr: number, length: number): Array { + let a = new Array(length); + + for (let i = 0; i < length; ++i) { + a[i] = this.mem[ptr + i]; + } + + return a; + } } diff --git a/src/wasm/main.c b/src/wasm/main.c index d7f7ce2..4f1e922 100644 --- a/src/wasm/main.c +++ b/src/wasm/main.c @@ -1,20 +1,20 @@ #include "wasmgl.h" -void doubel(WASMGLvalue(0)) +void doubel(WASMGLvalue(data)) { - for (int i = 0; i < size_0; ++i) - WASMGLset(ptr_0 + i, WASMGLmemory[ptr_0 + i] * 2.0); + for (int i = 0; i < size_data; ++i) + WASMGLset(ptr_data + i, WASMGLmemory[ptr_data + i] * 2.0); } -void uppercase(WASMGLvalue(0)) { +void uppercase(WASMGLvalue(data)) { int val = 0; - for (int i = 0; i < size_0; ++i) + for (int i = 0; i < size_data; ++i) { - val = WASMGLmemory[ptr_0 + i] - 32; + val = WASMGLmemory[ptr_data + i] - 32; - if (val < 65 || val > 122) val = WASMGLmemory[ptr_0 + i]; + if (val < 65 || val > 122) val = WASMGLmemory[ptr_data + i]; - WASMGLset(ptr_0 + i, val); + WASMGLset(ptr_data + i, val); } } diff --git a/src/wasm/wasmgl.h b/src/wasm/wasmgl.h index 59f8d1e..a86aa15 100644 --- a/src/wasm/wasmgl.h +++ b/src/wasm/wasmgl.h @@ -17,7 +17,7 @@ extern float WASMGLmemory[WASMGLmemory_size]; typedef unsigned int WASMGLptr; typedef unsigned int WASMGLsize; -#define WASMGLvalue(n) WASMGLptr ptr_##n, WASMGLsize size_##n +#define WASMGLvalue(name) WASMGLptr ptr_##name, WASMGLsize size_##name WASMGLptr WASMGLmalloc(WASMGLsize size); void WASMGLset(WASMGLptr ptr, int value);