Cross-platform, safe, pure-rust graphics api.
Go to file
bors[bot] ba0acc94a1
Merge #427
427: Rewrite of the resource lifetime tracking r=crossed-fingers a=kvark

Addresses this TODO item in `triage_referenced()`:
> //TODO: lock less, if possible

Now, also fixes #428 

Pros:
  - only locking the storages that need to be, and only for the duration of their cleanup
  - less run-time branching, more predefined code paths, which may lead to better cache utilization (thinking of both instruction and data cache here)
  - more consistent use of `Stored` type

Cons:
  - a bit of verbosity / code duplication in `triage_referenced()`. In particular, the code that finds where to register an unreferenced resource, it used to be unified for all resources.

---
@grovesNL this should be reviewable on a commit basis. The high-level breakdown of changes is:
  1. Switch from enum of resource types to structure of arrays for the matter of lifetime tracker
  2. Rename the involved structures to better reflect what they do (the old `PendingResources` was bad)
  3. Separate lifetime tracking into a sub-module
  4. Make `RefCount` in objects optional, getting the semantics of "user needs it" when `Some`.
  5. Rewrite the first stage of lifetime tracking: instead of permanently staging resources that the user doesn't need, and adding strong refcounts to them, we only populate it temporarily with anything that gets the refcount reduced. This means less overhead for `maintain()` at an increased risk of leaking some stuff (depends on our code quality).
  6. Consequently, device tracker becomes the main (and last) owner of all the resources.

Overall, it's a major change and risk. I tested on `vange-rs` (which I consider to be the most complex wgpu-rs app) with Vulkan validation enabled, and it seems all to be working good now.

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
2020-01-08 23:26:44 +00:00
examples Enable wayland support for examples/triangle 2020-01-02 17:10:45 +09:00
ffi Command buffer/encoder destruction 2020-01-08 18:14:45 -05:00
wgpu-core Command buffer/encoder destruction 2020-01-08 18:14:45 -05:00
wgpu-native Command buffer/encoder destruction 2020-01-08 18:14:45 -05:00
wgpu-remote Add missing license in wgpu-remote/Cargo.toml 2019-12-06 13:41:42 +09:00
.clang-format Reduce left indentation for nested structs 2019-03-08 07:15:36 -07:00
.gitignore makefile package command and travis deploy step 2019-12-24 14:19:43 +01:00
.travis.yml New deploy credentials 2020-01-04 01:24:11 -05:00
bors.toml CI scripts 2018-09-14 11:39:24 -04:00
Cargo.lock Switch XlibHandle window to c_ulong 2020-01-01 10:49:00 -05:00
Cargo.toml Separate native from the core 2019-11-16 00:36:23 -05:00
CHANGELOG.md Release preparations 2019-11-03 18:52:57 -05:00
LICENSE Initial commit 2018-09-13 15:18:51 -04:00
Makefile Update Makefile 2019-12-28 10:30:32 +01:00
README.md Add wgpu-py 2020-01-03 01:21:40 -05:00
rustfmt.toml Enforce the HUB lock order 2019-07-04 14:43:54 -04:00

This is an active GitHub mirror of the WebGPU native implementation in Rust, which now lives in Mozilla-central. Issues and pull requests are accepted, but we merge them in m-c manually and then sync to GitHub instead of landing directly here.


WebGPU

Build Status Crates.io Gitter

This is an experimental WebGPU implementation as a native static library. It's written in Rust and is based on gfx-hal and Rendy libraries. The corresponding WebIDL specification can be found at gpuweb project.

The implementation consists of the following parts:

  1. wgpu-core - internal Rust API for WebGPU implementations to use
  2. wgpu-native - the native implementation of WebGPU as a C API library
  3. wgpu-remote - remoting layer to work with WebGPU across the process boundary
  4. ffi - the C headers generated by cbindgen for both of the libraries

Supported Platforms

API Windows Linux macOS & iOS
DX11 ✔️
DX12 ✔️
Vulkan ✔️ ✔️
Metal ✔️
OpenGL

Usage

This repository contains C-language examples that link to the native library targets and perform basic rendering and computation. Please refer to our Getting Started page at the wiki for more information.

Bindings: