Wayland layer-surface wallpaper runner powered by GLSL/WGSL fragment shaders, built on [wgpu](https://wgpu.rs).
Runs shaders full-screen on one or all monitors as a proper compositor layer surface (via `zwlr-layer-shell-v1`). Supports Vulkan and OpenGL backends, with automatic fallback for drivers that misbehave at device creation (e.g. Mesa V3DV on Raspberry Pi).
## Features
- **GLSL and WGSL shaders** — use `.frag`/`.glsl` for GLSL or `.wgsl` for WGSL
- **ShaderToy-compatible GLSL** — shaders using `mainImage(out vec4, in vec2)` work without modification
- **glpaper-compatible GLSL** — shaders using `void main()` and `gl_FragColor` work as-is
- **Multi-monitor support** — target a specific output by name or use `all` to run on every connected display simultaneously
- **Hotplug** — new outputs are picked up automatically when using `all`
- **Vulkan-first with GL fallback** — prefers discrete Vulkan, falls back gracefully to integrated or GL
- **Layer selection** — place the shader on any compositor layer: `background`, `bottom`, `top`, or `overlay`
| `time` | `float` | Seconds since program start |
| `resolution` | `vec2` | Output dimensions in pixels |
| `mouse` | `vec2` | Mouse position (currently `0,0`) |
**WGSL** shaders receive these via a uniform buffer:
```wgsl
structUniforms{
time:f32,
_pad:f32,
resolution:vec2<f32>,
mouse:vec2<f32>,
}
@group(0)@binding(0)var<uniform>u:Uniforms;
```
**GLSL** shaders can declare them as bare `uniform` variables — gpupaper strips those declarations and injects the UBO automatically, so existing ShaderToy-style shaders need no changes.
Inspired by [glpaper](https://hg.sr.ht/~scoopta/glpaper) by Scoopta. gpupaper extends the concept with multi-monitor support, WGSL, a wgpu backend, and compatibility with both glpaper-style and ShaderToy-style GLSL shaders.