Skip to main content

WebGPU for Python

Project description

CI Documentation Status PyPI version

wgpu-py

A Python implementation of WebGPU - the next generation GPU API. 🚀

Introduction

The purpose of wgpu-py to to provide Python with a powerful and reliable GPU API.

It serves as a basis to build a broad range of applications and libraries related to visualization and GPU compute. We use it in pygfx to create a modern Pythonic render engine.

To get an idea of what this API looks like have a look at triangle.py and the other examples.

Status

  • Until WebGPU settles as a standard, its specification may change, and with that our API will probably too. Check the changelog when you upgrade!
  • Coverage of the WebGPU spec is complete enough to build e.g. pygfx.
  • Test coverage of the API is close to 100%.
  • Support for Windows, Linux (x86 and aarch64), and MacOS (Intel and M1).

What is WebGPU / wgpu?

WGPU is the future for GPU graphics; the successor to OpenGL.

WebGPU is a JavaScript API with a well-defined spec, the successor to WebGL. The somewhat broader term "wgpu" is used to refer to "desktop" implementations of WebGPU in various languages.

OpenGL is old and showing its cracks. New API's like Vulkan, Metal and DX12 provide a modern way to control the GPU, but these are too low-level for general use. WebGPU follows the same concepts, but with a simpler (higher level) API. With wgpu-py we bring WebGPU to Python.

Technically speaking, wgpu-py is a wrapper for wgpu-native, exposing its functionality with a Pythonic API closely resembling the WebGPU spec.

Installation

pip install wgpu glfw

Linux users should make sure that pip >= 20.3. That should do the trick on most systems. See getting started for details.

Usage

Also see the online documentation and the examples.

The full API is accessible via the main namespace:

import wgpu

To render to the screen you can use a variety of GUI toolkits:

# The auto backend selects either the glfw, qt or jupyter backend
from wgpu.gui.auto import WgpuCanvas, run, call_later

# Visualizations can be embedded as a widget in a Qt application.
# Import PySide6, PyQt6, PySide2 or PyQt5 before running the line below.
# The code will detect and use the library that is imported.
from wgpu.gui.qt import WgpuCanvas

# Visualizations can be embedded as a widget in a wx application.
from wgpu.gui.wx import WgpuCanvas

Some functions in the original wgpu-native API are async. In the Python API, the default functions are all sync (blocking), making things easy for general use. Async versions of these functions are available, so wgpu can also work well with Asyncio or Trio.

License

This code is distributed under the 2-clause BSD license.

Projects using wgpu-py

  • pygfx - A python render engine running on wgpu.
  • shadertoy - Shadertoy implementation using wgpu-py.
  • tinygrad - deep learning framework
  • fastplotlib - A fast plotting library
  • xdsl - A Python Compiler Design Toolkit (optional wgpu interpreter)

Developers

  • Clone the repo.
  • Install devtools using pip install -r dev-requirements.txt (you can replace pip with pipenv to install to a virtualenv).
  • Install wgpu-py in editable mode by running pip install -e ., this will also install runtime dependencies as needed.
  • Run python download-wgpu-native.py to download the upstream wgpu-native binaries.
    • Or alternatively point the WGPU_LIB_PATH environment variable to a custom build.
  • Use black . to apply autoformatting.
  • Use flake8 . to check for flake errors.
  • Use pytest . to run the tests.
  • Use pip wheel --no-deps . to build a wheel.

Updating to a later version of WebGPU or wgpu-native

To update to upstream changes, we use a combination of automatic code generation and manual updating. See the codegen utility for more information.

Testing

The test suite is divided into multiple parts:

  • pytest -v tests runs the core unit tests.
  • pytest -v examples tests the examples.
  • pytest -v wgpu/__pyinstaller tests if wgpu is properly supported by pyinstaller.
  • pytest -v codegen lints the generated binding code.

There are two types of tests for examples included:

Type 1: Checking if examples can run

When running the test suite, pytest will run every example in a subprocess, to see if it can run and exit cleanly. You can opt out of this mechanism by including the comment # run_example = false in the module.

Type 2: Checking if examples output an image

You can also (independently) opt-in to output testing for examples, by including the comment # test_example = true in the module. Output testing means the test suite will attempt to import the canvas instance global from your example, and call it to see if an image is produced.

To support this type of testing, ensure the following requirements are met:

  • The WgpuCanvas class is imported from the wgpu.gui.auto module.
  • The canvas instance is exposed as a global in the module.
  • A rendering callback has been registered with canvas.request_draw(fn).

Reference screenshots are stored in the examples/screenshots folder, the test suite will compare the rendered image with the reference.

Note: this step will be skipped when not running on CI. Since images will have subtle differences depending on the system on which they are rendered, that would make the tests unreliable.

For every test that fails on screenshot verification, diffs will be generated for the rgb and alpha channels and made available in the examples/screenshots/diffs folder. On CI, the examples/screenshots folder will be published as a build artifact so you can download and inspect the differences.

If you want to update the reference screenshot for a given example, you can grab those from the build artifacts as well and commit them to your branch.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wgpu-0.18.1.tar.gz (174.4 kB view details)

Uploaded Source

Built Distributions

wgpu-0.18.1-py3-none-win_amd64.whl (3.2 MB view details)

Uploaded Python 3 Windows x86-64

wgpu-0.18.1-py3-none-win32.whl (2.9 MB view details)

Uploaded Python 3 Windows x86

wgpu-0.18.1-py3-none-manylinux_2_28_x86_64.whl (3.1 MB view details)

Uploaded Python 3 manylinux: glibc 2.28+ x86-64

wgpu-0.18.1-py3-none-manylinux_2_28_aarch64.whl (3.2 MB view details)

Uploaded Python 3 manylinux: glibc 2.28+ ARM64

wgpu-0.18.1-py3-none-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded Python 3 macOS 11.0+ ARM64

wgpu-0.18.1-py3-none-macosx_10_9_x86_64.whl (2.3 MB view details)

Uploaded Python 3 macOS 10.9+ x86-64

File details

Details for the file wgpu-0.18.1.tar.gz.

File metadata

  • Download URL: wgpu-0.18.1.tar.gz
  • Upload date:
  • Size: 174.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for wgpu-0.18.1.tar.gz
Algorithm Hash digest
SHA256 b25fb7f115d05a7ffadf3f13b63e2d2e135ca85f6b982bd4fd214b3ed603a67e
MD5 8f3adbe0a0c34a77696de7256d4241fa
BLAKE2b-256 d52d32b9a4b2f96f7a6124a08a0afef011a678705a72a88f64117530a80a2f03

See more details on using hashes here.

File details

Details for the file wgpu-0.18.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: wgpu-0.18.1-py3-none-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for wgpu-0.18.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 989cfff59cd66238acde21809ea5dff6fea8c52817619b6ba1ede4e6ffe7df69
MD5 9345156edb508d724e04915bac1a45ce
BLAKE2b-256 c0d668911e5bd170f29361c19741f6fe9a3c71e41fa1b6715e4ab2bcb2686050

See more details on using hashes here.

File details

Details for the file wgpu-0.18.1-py3-none-win32.whl.

File metadata

  • Download URL: wgpu-0.18.1-py3-none-win32.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.6

File hashes

Hashes for wgpu-0.18.1-py3-none-win32.whl
Algorithm Hash digest
SHA256 3c53a806e93e967ee705b3047ec702896cbca4e4de602b3e7006685eb714c29c
MD5 cf48e0f68cdeee02875b783a273bac3a
BLAKE2b-256 6dd6665e55119c94a9d45fd1f5dce10dea782114f660103d4f06b2713a615aca

See more details on using hashes here.

File details

Details for the file wgpu-0.18.1-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for wgpu-0.18.1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 81ff225c62194654e0ac66190af51aba2daed483dbd1ceaed0defaf8148cb1f5
MD5 18f5c2a3ef1a4f551d813688656729d0
BLAKE2b-256 ff8e02291c204af57204a356b38e92044a8acc0cd29aa15eedb6bf4da8037c94

See more details on using hashes here.

File details

Details for the file wgpu-0.18.1-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for wgpu-0.18.1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f1eaad864482afbe0bdd2b7f1ae3d080398edb209a1f5eefdd3a6f0fdfaf8f85
MD5 0b6fc7d6d1171433c939ddccacd8f936
BLAKE2b-256 26584e803fe196c7000b8842171520ddb56fe9fcd3774b4d8331326e8db2baeb

See more details on using hashes here.

File details

Details for the file wgpu-0.18.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for wgpu-0.18.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5e006e274bd2423f0dd2d635df26063b67530fbf02f4810b62f46b6b99acb615
MD5 d3d14c7d916b57bf79c22647319aaf71
BLAKE2b-256 4a09498cd99487e0808c5a409fe801a92a39a7e95263dc1cd6c440d1cc60ec2c

See more details on using hashes here.

File details

Details for the file wgpu-0.18.1-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for wgpu-0.18.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c43ccbb61989a2df25854db75df1cdfe4b21945feccac925f402fd6152b24fce
MD5 1c0aa618d801dd935177c18f22a90f0f
BLAKE2b-256 9ef03894dc00e488f0a9ad78e904ae9774b3055b7a0710f40e22de3688968673

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page