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 is 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

# Just wgpu
pip install wgpu

# If you want to render to screen
pip install wgpu rendercanvas 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 rendercanvas auto backend selects either the glfw, qt, wx, or jupyter backend
from rendercanvas.auto import RenderCanvas, loop

# 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 rendercanvas.qt import RenderCanvas

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 -e .[dev].
  • Using pip install -e . will also download the upstream wgpu-native binaries.
    • You can use python tools/download_wgpu_native.py when needed.
    • Or point the WGPU_LIB_PATH environment variable to a custom build of wgpu-native.
  • Use ruff format to apply autoformatting.
  • Use ruff check to check for linting errors.
  • Optionally, if you install pre-commit hooks with pre-commit install, lint fixes and formatting will be automatically applied on git commit.

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 unit tests.
  • pytest -v examples tests the examples.
  • pytest -v wgpu/__pyinstaller tests if wgpu is properly supported by pyinstaller.
  • pytest -v codegen tests the code that autogenerates the API.
  • pytest -v tests_mem tests against memoryleaks.

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 RenderCanvas class is imported from the rendercanvas.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.

Testing Locally

Testing locally is possible, however pixel perfect results will differ from those on the CIs due to discrepencies in hardware, and driver (we use llvmpipe) versions.

On linux, it is possible to force the usage of LLVMPIPE in the test suite and compare the generated results of screenshots. Beware, the results on your machine may differ to those on the CI. We always include the CI screenshots in the test suite to improve the repeatability of the tests.

If you have access to a linux machine with llvmpipe installed, you may run the example pixel comparison testing by setting the WGPUPY_WGPU_ADAPTER_NAME environment variable appropriately. For example

WGPUPY_WGPU_ADAPTER_NAME=llvmpipe pytest -v examples/

The WGPUPY_WGPU_ADAPTER_NAME variable is modeled after the https://github.com/gfx-rs/wgpu?tab=readme-ov-file#environment-variables and should only be used for testing the wgpu-py library itself. It is not part of the supported wgpu-py interface.

Project details


Release history Release notifications | RSS feed

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.24.0.tar.gz (149.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

wgpu-0.24.0-py3-none-win_arm64.whl (3.0 MB view details)

Uploaded Python 3Windows ARM64

wgpu-0.24.0-py3-none-win_amd64.whl (3.1 MB view details)

Uploaded Python 3Windows x86-64

wgpu-0.24.0-py3-none-win32.whl (3.0 MB view details)

Uploaded Python 3Windows x86

wgpu-0.24.0-py3-none-manylinux_2_28_x86_64.whl (3.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

wgpu-0.24.0-py3-none-manylinux_2_28_aarch64.whl (3.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

wgpu-0.24.0-py3-none-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

wgpu-0.24.0-py3-none-macosx_10_9_x86_64.whl (2.7 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: wgpu-0.24.0.tar.gz
  • Upload date:
  • Size: 149.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wgpu-0.24.0.tar.gz
Algorithm Hash digest
SHA256 1040974678e8c7049e4d772fec404196b0173f9ff76bd70c72d9c97bf1993bdb
MD5 3aa14a3fbbb529bd52c4868fd5a479d6
BLAKE2b-256 55fedb1839ba3faf447c4d7464be3de8e5d032688b892770289ea1eb91d80f63

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0.tar.gz:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wgpu-0.24.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: wgpu-0.24.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 3.0 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wgpu-0.24.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 1606c3d5a836905c7fbda087cc88700b991da65a124dce7d8223fda67d2b2c95
MD5 92f0dfef23d59e8f58833c02681ce34b
BLAKE2b-256 f92aee202862f9890de4cfa9ef9c372c80ccdbe0cf5bea9aec5e75ce6b9d304c

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-win_arm64.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: wgpu-0.24.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wgpu-0.24.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8047f9f8a15ca286077d826f3082a6a354d4aa302fb77d4ed15471f74d003e7f
MD5 a75f48539c7a15e1558abfd8ed7a6b60
BLAKE2b-256 d7dbfe975eaa4d7010ab071dc7d4f575895cf3a0f99bf51956df4aaf84d308c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-win_amd64.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: wgpu-0.24.0-py3-none-win32.whl
  • Upload date:
  • Size: 3.0 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wgpu-0.24.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 426402dd601ba02a561ed80f8199b28de1525264be620834a41d70ae59cbfe4d
MD5 5808640b01ad4d21e4ecf9297950c2a1
BLAKE2b-256 aa5ffb2c2075693a9d1e65791c7eef91450b9b50060f5fcaf9b7e4209eff6945

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-win32.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for wgpu-0.24.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f9572162f41f8ac916cf038b6aafbd290194d8bac5b7fa733cac20ad92d2488b
MD5 39a0b4d8906be3fff54a9050803906f6
BLAKE2b-256 73697ef8f8c078e7a53c96a200abfe43015776362ef8ff57b610cd751992c633

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for wgpu-0.24.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d05d344ed0ad6c2c4c6d097d19a6ebac975e065de496100d68e06f8013386aae
MD5 ca69cee5000b619efffade02663afc0b
BLAKE2b-256 170226a94af93a5afe5af634c368e8be93679d1ac1dac728a99a8cd773cb65dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: wgpu-0.24.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wgpu-0.24.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c2233a9ee5fdd7269a5ad75dc8ee3bb0f3abedea6c4e78e1b23af90200658f5f
MD5 34e3b4562af0ff802bdfe7ebdab0be2d
BLAKE2b-256 3c8bd84d419806802a00eb4699464fb40cc8e175716157dee4773c5129d15cc1

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-macosx_11_0_arm64.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for wgpu-0.24.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e02f8d8ba2c6dcc6010edfe1b8fe605e82b7fd3f3ab6bde24b43f31cae6960b6
MD5 a47efee12b00c10ab41dd6acfab09f65
BLAKE2b-256 8f54dffb9c7dbc2fa9e1da62aa3c48e790077ede905678a0ec8627260860fc0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for wgpu-0.24.0-py3-none-macosx_10_9_x86_64.whl:

Publisher: cd.yml on pygfx/wgpu-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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