DEV Community

Alex Spinov
Alex Spinov

Posted on

wgpu Has a Free API You've Never Heard Of

wgpu is a cross-platform graphics API implementation in Rust. It powers Firefox's WebGPU implementation, but what most developers don't know is that you can use it for native applications too — getting Vulkan/Metal/DX12 performance with a single, safe Rust API.

What Makes wgpu Special?

  • Cross-platform — runs on Vulkan, Metal, DX12, OpenGL, and WebGPU
  • Rust safety — no unsafe GPU code, the API prevents errors at compile time
  • Browser AND native — same code runs in Chrome and as a desktop app
  • Production-ready — powers Firefox, Deno, and many game engines

The Hidden API: Native GPU Compute

use wgpu::*;

async fn run_compute() {
    let instance = Instance::new(&InstanceDescriptor::default());
    let adapter = instance.request_adapter(&RequestAdapterOptions {
        power_preference: PowerPreference::HighPerformance,
        ..Default::default()
    }).await.unwrap();

    let (device, queue) = adapter.request_device(
        &DeviceDescriptor {
            label: Some("compute device"),
            required_features: Features::empty(),
            required_limits: Limits::default(),
            ..Default::default()
        }, None
    ).await.unwrap();

    let shader = device.create_shader_module(ShaderModuleDescriptor {
        label: Some("compute shader"),
        source: ShaderSource::Wgsl(include_str!("shader.wgsl").into()),
    });

    println!("GPU: {:?}", adapter.get_info().name);
}
Enter fullscreen mode Exit fullscreen mode

Render API — Cross-Platform Graphics

let render_pipeline = device.create_render_pipeline(&RenderPipelineDescriptor {
    label: Some("render pipeline"),
    layout: Some(&pipeline_layout),
    vertex: VertexState {
        module: &shader,
        entry_point: Some("vs_main"),
        buffers: &vertex_buffers,
        compilation_options: Default::default(),
    },
    fragment: Some(FragmentState {
        module: &shader,
        entry_point: Some("fs_main"),
        targets: &[Some(ColorTargetState {
            format: surface_format,
            blend: Some(BlendState::REPLACE),
            write_mask: ColorWrites::ALL,
        })],
        compilation_options: Default::default(),
    }),
    primitive: PrimitiveState::default(),
    depth_stencil: None,
    multisample: MultisampleState::default(),
    multiview: None,
    cache: None,
});
Enter fullscreen mode Exit fullscreen mode

Quick Start

cargo new my-gpu-app
cd my-gpu-app
cargo add wgpu pollster
Enter fullscreen mode Exit fullscreen mode

Why Game Developers Choose wgpu

A game engine developer shared: "We evaluated Vulkan, Metal wrappers, and wgpu. wgpu won because one codebase targets every platform. Our engine runs on Windows, macOS, Linux, and the web — from the same Rust source."


Building GPU-accelerated tools? Email spinov001@gmail.com or check out my developer toolkit.

What's your GPU programming stack? Have you tried wgpu?

Top comments (0)