From 05d68ab3c13d2073818c19f6b8c8e720cd9d0208 Mon Sep 17 00:00:00 2001 From: Iris Pupo Date: Tue, 8 Nov 2022 17:40:50 -0500 Subject: [PATCH 01/77] enabled wasmtime built in caching --- src/backend/wasmtime.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/wasmtime.rs b/src/backend/wasmtime.rs index 6551565..7df636a 100644 --- a/src/backend/wasmtime.rs +++ b/src/backend/wasmtime.rs @@ -13,12 +13,14 @@ type Linker = wasmtime::Linker; pub struct WasmtimeBackend { engine: wasmtime::Engine, } + impl WasmtimeBackend { pub fn new() -> anyhow::Result { let mut config = wasmtime::Config::new(); config.wasm_simd(true); config.wasm_bulk_memory(true); config.cranelift_opt_level(wasmtime::OptLevel::Speed); + config.cache_config_load_default()?; let engine = wasmtime::Engine::new(&config)?; @@ -26,7 +28,9 @@ impl WasmtimeBackend { } } + impl Backend for WasmtimeBackend { + fn load_module(&self, module: &[u8]) -> anyhow::Result> { let module = wasmtime::Module::new(&self.engine, module)?; let abi = ScriptAbiImpl::default(); From 14540db59c3ece3b88d182cac57ce48203150fa5 Mon Sep 17 00:00:00 2001 From: mars Date: Wed, 16 Nov 2022 21:08:17 -0700 Subject: [PATCH 02/77] Add panel_send_message and PanelAbi --- src/backend/mod.rs | 31 ++++++++++++++++++++++++++++++- src/backend/wasmtime.rs | 17 +++++++++++++---- src/lib.rs | 16 +++++++++++----- 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/backend/mod.rs b/src/backend/mod.rs index b815501..aa2c1d1 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -8,6 +8,8 @@ //! implemented, but in the future, [wasm3](https://github.com/wasm3/wasm3) //! will also be provided. +use std::collections::VecDeque; + use super::*; pub mod wasmtime; @@ -22,7 +24,7 @@ pub fn make_default_backend() -> anyhow::Result> { /// A WebAssembly runtime backend. pub trait Backend { - fn load_module(&self, abi: ScriptAbi, module: &[u8]) -> anyhow::Result>; + fn load_module(&self, abi: Arc, module: &[u8]) -> anyhow::Result>; } /// An instance of a WebAssembly module. @@ -69,6 +71,7 @@ pub struct ScriptAbi { loaded_fonts: RwLock>>, text_layouts: RwLock>, message_store: RwLock>>, + panels: RwLock>, } impl ScriptAbi { @@ -79,6 +82,13 @@ impl ScriptAbi { } } + /// Allocates a new ID and host-side storage for a panel. + pub fn create_panel(&self) -> PanelId { + let abi = PanelAbi::default(); + let id = self.panels.write().insert(abi); + PanelId(id) + } + pub fn start_draw(&self) { let mut lock = self.draw_cmds.lock(); lock.clear(); @@ -157,4 +167,23 @@ impl ScriptAbi { let src = store.get(id as usize).unwrap(); dst.copy_from_slice(src); } + + pub fn panel_send_message(&self, id: u32, message: Vec) { + if let Some(panel) = self.panels.read().get(id as usize) { + panel.outgoing_messages.write().push_back(message); + } + } + + pub fn recv_panel_messages(&self, id: PanelId) -> Vec> { + if let Some(panel) = self.panels.read().get(id.0) { + panel.outgoing_messages.write().drain(..).collect() + } else { + Vec::new() + } + } +} + +#[derive(Default)] +pub struct PanelAbi { + outgoing_messages: RwLock>>, } diff --git a/src/backend/wasmtime.rs b/src/backend/wasmtime.rs index 1024aaa..73b3133 100644 --- a/src/backend/wasmtime.rs +++ b/src/backend/wasmtime.rs @@ -9,9 +9,9 @@ use crate::DrawCommand; use canary_script::{Color, CursorEventKind, Rect, Vec2}; use parking_lot::Mutex; -type Caller<'a> = wasmtime::Caller<'a, ScriptAbi>; -type Store = wasmtime::Store; -type Linker = wasmtime::Linker; +type Caller<'a> = wasmtime::Caller<'a, Arc>; +type Store = wasmtime::Store>; +type Linker = wasmtime::Linker>; pub struct WasmtimeBackend { engine: wasmtime::Engine, @@ -30,7 +30,7 @@ impl WasmtimeBackend { } impl Backend for WasmtimeBackend { - fn load_module(&self, abi: ScriptAbi, module: &[u8]) -> anyhow::Result> { + fn load_module(&self, abi: Arc, module: &[u8]) -> anyhow::Result> { let module = wasmtime::Module::new(&self.engine, module)?; let mut store = wasmtime::Store::new(&self.engine, abi); let mut linker = Linker::new(&self.engine); @@ -147,6 +147,15 @@ impl WasmtimeInstance { }, )?; + linker.func_wrap( + module, + "panel_send_message", + |mut caller: Caller<'_>, id: u32, ptr: u32, len: u32| { + let message = Self::get_memory_slice_bytes(&mut caller, ptr as usize, len as usize); + caller.data().panel_send_message(id, message.to_vec()) + }, + )?; + Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index f356234..02cea3f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,11 +29,12 @@ impl Runtime { pub fn load_module(&self, module: &[u8]) -> anyhow::Result