diff --git a/build/assets/stdlib.h b/build/assets/stdlib.h index 98ec64b..6e96a96 100644 --- a/build/assets/stdlib.h +++ b/build/assets/stdlib.h @@ -6,6 +6,7 @@ extern "C" { #include #include +#include extern unsigned char __heap_base; #define IMPORT(name) __attribute__((import_module("env"), import_name(#name))) @@ -13,8 +14,6 @@ extern unsigned char __heap_base; #define NULL ((void*)0) -typedef uint32_t size_t; - EXPORT(malloc) void* malloc(size_t); EXPORT(free) void free(void*); EXPORT(realloc) void* realloc(void*, size_t); @@ -23,7 +22,7 @@ void* memset(void* s, uint8_t c, uint32_t n); void* memcpy(void* dest, const void* src, uint32_t n); int memcmp(const void* s1, const void* s2, uint32_t n); -IMPORT(log) void print_int(int64_t); +IMPORT(log) void printf(const char* format, ...); EXPORT(__srand) void srand(uint64_t seed); uint64_t rand(void); diff --git a/build/filePlugin.ts b/build/filePlugin.ts index a206288..97997bc 100644 --- a/build/filePlugin.ts +++ b/build/filePlugin.ts @@ -4,7 +4,6 @@ const filePlugin: BunPlugin = { name: "File loader", async setup(build) { build.onLoad({ filter: /\.glsl$/ }, async (args) => { - console.log(args); const text = await Bun.file(args.path).text(); return { contents: ` diff --git a/build/wasmPlugin.ts b/build/wasmPlugin.ts index 8c9c2bd..cd8ad06 100644 --- a/build/wasmPlugin.ts +++ b/build/wasmPlugin.ts @@ -17,12 +17,43 @@ const wasmPlugin = ({ production, portable }: WasmLoaderConfig = {}): BunPlugin const memory = new WebAssembly.Memory({ initial: 32, }); - let data = new DataView(memory.buffer); + let data = new DataView(memory.buffer); + const decoder = new TextDecoder(); + const getString = (ptr) => { + const view = new Uint8Array(memory.buffer, ptr); + const start = ptr; + const end = ptr + view.indexOf(0); + + return decoder.decode(memory.buffer.slice(start, end)); + }; const { instance } = await WebAssembly.instantiateStreaming(fetch(url), { env: { memory, - log(...args) { - console.log('[wasm]', ...args); + log(format, argsPtr) { + format = getString(format); + let buf = ''; + let isFormat = false; + let w = 4; + const align = (a) => argsPtr += (argsPtr % a); + for (const c of format) { + if (!isFormat && c !== '%') { + buf += c; + } else if (c === '%') { + isFormat = true; + } else switch(c) { + case '%': buf += '%'; isFormat = false; break; + case 's': align(4); buf += getString(data.getInt32(argsPtr, true)); argsPtr += 4; isFormat = false; break; + case 'd': align(w); buf += data[w === 4 ? 'getInt32': 'getBigInt64'](argsPtr, true); argsPtr += w; isFormat = false; break; + case 'x': align(w); buf += data[w === 4 ? 'getInt32': 'getBigInt64'](argsPtr, true).toString(16); argsPtr += w; isFormat = false; break; + case 'o': align(w); buf += data[w === 4 ? 'getInt32': 'getBigInt64'](argsPtr, true).toString(8); argsPtr += w; isFormat = false; break; + case 'u': align(w); buf += data[w === 4 ? 'getUint32': 'getBigUint64'](argsPtr, true); argsPtr += w; isFormat = false; break; + case 'f': align(8); buf += data.getFloat64(argsPtr, true); argsPtr += 8; isFormat = false; break; + case 'c': align(4); buf += String.fromCharCode(data.getInt32(argsPtr, true)); argsPtr += 4; isFormat = false; break; + case 'l': w = 8; break; + } + } + + console.log('[wasm] ' + buf); }, grow(blocks) { if (blocks > 0) { @@ -49,7 +80,7 @@ const wasmPlugin = ({ production, portable }: WasmLoaderConfig = {}): BunPlugin } else { const buildAssets = path.resolve(import.meta.dir, 'assets'); const stdlib = `${buildAssets}/stdlib.c`; - const opt = production ? '-O3': '-O0'; + const opt = production ? '-O3' : '-O0'; const result = await $`clang --target=wasm32 ${opt} -flto -fno-builtin --no-standard-libraries -I ${buildAssets} -Wall -Wextra -Wpedantic -Werror -Wl,--lto-O3 -Wl,--no-entry -Wl,--import-memory -o ${wasmPath} ${args.path} ${stdlib}`; if (result.exitCode !== 0) { diff --git a/src/games/playground/awoo.cpp b/src/games/playground/awoo.cpp index f715b59..fc7e772 100644 --- a/src/games/playground/awoo.cpp +++ b/src/games/playground/awoo.cpp @@ -1,16 +1,5 @@ #include -struct awoo { - int a; - - awoo operator+(const awoo& other) const { return awoo{a + other.a}; } - - operator int() const { return a * 2; } -}; - -EXPORT(cpptest) uint32_t cpptest() { - awoo a{42}; - awoo b{69}; - - return a + b; +EXPORT(cpptest) void cpptest() { + printf("Awoo d=%d d2=%d", 69llu, 42ll); } \ No newline at end of file diff --git a/src/games/playground/index.tsx b/src/games/playground/index.tsx index da43e6e..1e74a32 100644 --- a/src/games/playground/index.tsx +++ b/src/games/playground/index.tsx @@ -1,13 +1,7 @@ -import { render } from "preact"; import awoo from "./awoo.cpp"; -import shader from './assets/shader.glsl'; export default function main() { - console.log(shader); - render( - , - document.body - ); + awoo.cpptest(); + // awoo.data.getBig + console.log(awoo.memory); } \ No newline at end of file diff --git a/src/games/wfc/wfc.c b/src/games/wfc/wfc.c index b287176..2f0396b 100644 --- a/src/games/wfc/wfc.c +++ b/src/games/wfc/wfc.c @@ -103,8 +103,7 @@ void patterns_init(uint32_t* pixel_data, uint16_t image_width, uint16_t image_he } } - print_int(num_patterns); - print_int(max_patterns); + log("num=%u, max=%u", num_patterns, max_patterns); } void superposition_init(void) {