#graphics #glsl #shader #rendering #language

rpu

RPU is a GLSL-compatible language for rendering procedural graphics on the CPU

12 releases

0.3.0 May 13, 2024
0.2.5 May 7, 2024
0.1.5 Apr 30, 2024
0.1.1 Jul 20, 2023
0.1.0 Jul 31, 2022

#324 in Graphics APIs

Download history 21/week @ 2024-07-28 52/week @ 2024-09-22 1/week @ 2024-09-29

711 downloads per month
Used in rpuc

MIT license

320KB
8K SLoC

header

RPU is a GLSL compatible programming language for rendering procedural graphics on the CPU.

For more information visit rpu-lang.org.

Usage

To execute a function:

let fib = r#"
int fib(int n) {
  if (n <= 1) return n;
  return fib(n - 2) + fib(n - 1);
}

export int main(int x) {
    return fib(x);
}"#;

let rpu = RPU::new();
let use_64_bit = true;
if let Ok(rc) = rpu.compile_and_run(source, "main", [WasmValue::I64(10)], use_64_bit) {
    assert_eq!(
        rc, Ok(vec![WasmValue::I64(55)])
    );
}

If you only want to compile to WAT you can call:

let rc = compile_to_wat(source);

It returns a String containing the WAT source code.

To run the WAT source as a shader use

let mut buffer = ColorBuffer::new(800, 600);
let rc = rpu.compile_wat_and_run_as_shader(&wat, "shader", &mut buffer, use_64_bit);

The color buffer will contain the shader output. This runs the shader in a single thread. To run the shader in parallel use:

let mut buffer = Arc::new(Mutex::new(ColorBuffer::new(800, 600)));
let rc = rpu.compile_wat_and_run_as_tiled_shader(&wat, "shader", &mut buffer, (80, 80), 1, use_64_bit);

Where (80, 80) is the tile size. The buffer is wrapped in an Arc<Mutex<>> to allow multiple threads to write to it. The '1' is the number of iterations to compute (in case the shader is a path tracer).

Dependencies

~5–14MB
~186K SLoC