glemu 0.1.2

WebGL (via web_sys) to GL shims for Rust, based on Emscripten's GL emulation layer
Documentation

glemu

glemu is a WebGL2-focused shim crate for wasm32-unknown-unknown. It keeps OpenGL-style integer IDs mapped to web_sys WebGL objects, exposes proc-address lookup for proc-table based GL consumers, and provides a typed Context API for direct WebGL2 usage.

The crate is influenced by both Emscripten's libglemu.js approach to GL shims and glow's web_sys backend structure.

It was mainly created for rust-skia, as there was no fitting crate that provided the same functionality.

Public API

glemu intentionally exposes a small public surface:

  • Context for typed WebGL2 access when the api feature is enabled
  • typed handle wrappers: Buffer, Framebuffer, Program, Query, Renderbuffer, Sampler, Shader, Texture, TransformFeedback, and VertexArray when the api feature is enabled
  • ContextId
  • get_proc_address for proc-table assembly when the raw-proc feature is enabled
  • context registry helpers for proc-table consumers:
    • register_gl_context
    • set_gl_context
    • drop_gl_context
    • current_context_id

Everything under the raw implementation modules is internal and may change without notice.

Feature flags

The default feature set keeps the current out-of-the-box behavior:

  • api
  • raw-proc
  • image-data
  • dom-uploads

Optional feature:

  • video-frame: enables VideoFrame upload helpers and still requires --cfg=web_sys_unstable_apis

To minimize wasm size, disable default features and opt back into only what you use:

glemu = { version = "...", default-features = false, features = ["api"] }

Upload helper gating:

  • image-data enables ImageData upload helpers
  • dom-uploads enables ImageBitmap, HtmlCanvasElement, HtmlImageElement, and HtmlVideoElement upload helpers

Proc-address API

Use get_proc_address("glFunctionName") when you need a raw function pointer by symbol name. If a consumer wants a callback-style proc resolver, it can trivially wrap get_proc_address itself. This API is available when raw-proc is enabled.

The proc table surface keeps the expected GL symbol names stable, including supported aliases such as glBindVertexArrayOES.

Context registration helpers

For proc-table consumers, register a web_sys::WebGl2RenderingContext with register_gl_context. The returned ContextId becomes current immediately. Use set_gl_context to switch the current context, current_context_id to inspect it, and drop_gl_context to unregister it when the context is no longer needed.

Typed Context API

Context is a small typed wrapper over the registered WebGL2 state:

  • Context::register / Context::from_webgl2_context create and register a context
  • Context::current and Context::from_context_id recover typed access later
  • Context::make_current switches the active registered context
  • resource creation methods return typed handles bound to the originating context
  • texture upload helpers are feature-gated by source type so consumers can opt out of unused DOM/media upload surfaces

A minimal browser demo lives in examples/wasm-pack-demo.

cd examples/wasm-pack-demo
wasm-pack build --target web --dev --out-dir web/pkg
python3 -m http.server --directory web 8001

Then open http://localhost:8001/.

Note that this project was created mostly with AI, and there may be things that were missed in my brief review of it, but I have tested it and it is functional in rust-skia.