Skip to main content

frame_buffer_wasmtime/
lib.rs

1//! This crate is mostly just a shell. It exports `HasBuffer` and binds it to wasmtime.
2//!
3//! The actual implementation lives in the `surface-wasmtime` crate (see `surface_frame_buffer.rs`).
4
5use crate::wasi_gfx::frame_buffer::frame_buffer;
6use wasmtime::component::{HasData, Resource};
7
8wasmtime::component::bindgen!({
9    world: "wasi-gfx:frame-buffer/imports",
10    imports: {
11        default: trappable,
12    },
13    with: {
14        "wasi-gfx:frame-buffer/frame-buffer.buffer": GfxBuffer,
15    },
16});
17
18// types
19
20// trait that providers of the frame-buffer should implement
21pub trait HasBuffer: Send {
22    fn get_buffer(&self) -> wasmtime::Result<Vec<u8>>;
23    fn set_buffer(&mut self, value: &[u8]) -> wasmtime::Result<()>;
24}
25pub struct GfxBuffer {
26    pub buffer: Box<dyn HasBuffer>,
27}
28
29// linker connection
30pub fn add_to_linker<T>(l: &mut wasmtime::component::Linker<T>) -> wasmtime::Result<()>
31where
32    T: FrameBufferCtxView,
33{
34    wasi_gfx::frame_buffer::frame_buffer::add_to_linker::<_, HasFrameBufferCtx>(
35        l,
36        T::frame_buffer_ctx,
37    )?;
38    Ok(())
39}
40
41pub trait FrameBufferCtxView {
42    fn frame_buffer_ctx<'a>(&'a mut self) -> FrameBufferCtx<'a>;
43}
44
45pub struct FrameBufferCtx<'a> {
46    pub table: &'a mut wasmtime_wasi::ResourceTable,
47}
48
49struct HasFrameBufferCtx;
50
51impl HasData for HasFrameBufferCtx {
52    type Data<'a> = FrameBufferCtx<'a>;
53}
54
55// wasmtime trait impls
56impl<'a> frame_buffer::Host for FrameBufferCtx<'a> {}
57
58impl<'a> frame_buffer::HostBuffer for FrameBufferCtx<'a> {
59    fn get_with_copy(&mut self, buffer: Resource<GfxBuffer>) -> wasmtime::Result<Vec<u8>> {
60        let buffer = self.table.get(&buffer)?;
61        let buffer = buffer.buffer.get_buffer()?;
62        Ok(buffer)
63    }
64
65    fn set_with_copy(&mut self, buffer: Resource<GfxBuffer>, val: Vec<u8>) -> wasmtime::Result<()> {
66        let buffer = self.table.get_mut(&buffer)?;
67        buffer.buffer.set_buffer(&val).unwrap();
68        Ok(())
69    }
70
71    fn drop(&mut self, frame_buffer: Resource<GfxBuffer>) -> wasmtime::Result<()> {
72        let _frame_buffer = self.table.delete(frame_buffer)?;
73        Ok(())
74    }
75}