mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-25 00:03:29 +00:00
Cross-platform, safe, pure-rust graphics api.
a60f3f13fa
62: Separate object identity from storage r=grovesNL a=kvark This turned out to be a giant change touching multiple parts... with main goal to prepare for wgpu-remote. The basic incompatibility I found is that the client side needs to know the IDs and manage them, while the server side needs to access the actual objects by those IDs. This change moves the `IdentityManager` out, while still making it convenient for the local bindings to use it the old way. The actions for creating a buffer remotely would be: 1. client allocates a new ID 2. client sends the descriptor and ID to the server 3. server creates an actual backend object from the descriptor 4. server associates it with the given ID While doing that, I also decided to bring the local/remote registries closer together. There isn't much benefit from representing an ID with a pointer in local mode. Locking is still the same (at least, it's hugely problematic to make it different and maintain both paths sanely), and the cache utilization is better when they are stored sequentially. This simplification leaded to the renaming and refactoring of "registry/mod.rs" to just "hub.rs". Total list of changes: - separate object identity from storage, this affects all the entry points creating items. They are now split into a public-visible "_impl()" method that just creates something, and the old creation is only visible under "local" feature now, using that helper. The sequence of actions on remote is different, as described above. - unified local/remote registries - "local" feature instead of "remote" - removed blend and depth/stencil interfaces in favor of structs inside the pipeline descriptors - pipeline descriptors are update to reflect the IDL (shader stages, rasterization state, color states, etc) Co-authored-by: Dzmitry Malyshau <dmalyshau@mozilla.com> |
||
---|---|---|
examples | ||
gfx-examples | ||
wgpu-bindings | ||
wgpu-native | ||
wgpu-rs | ||
.gitignore | ||
.travis.yml | ||
bors.toml | ||
Cargo.lock | ||
Cargo.toml | ||
LICENSE | ||
Makefile | ||
README.md | ||
rustfmt.toml |
WebGPU
This is an experimental WebGPU implementation as a native static library. It's written in Rust and is based on gfx-hal and satellite libraries. The corresponding WebIDL specification can be found at gpuweb project.
The implementation consists of the following parts:
wgpu-native
- the native implementation of WebGPU as a C API librarywgpu-bindings
- automatic generator of actual C headerswgpu-remote
- remoting layer to work with WebGPU across the process boundarywgpu-rs
- idiomatic Rust wrapper of the native library
Example
To run an example, simply cd
to the examples
or gfx-examples
directory, then use cargo run
with --features {backend}
to specify the backend (where {backend}
is either vulkan
, dx12
, dx11
or metal
). For example:
# Clone the wgpu repository
git clone https://github.com/gfx-rs/wgpu
# Change directory to `examples`
cd wgpu/examples
# Vulkan (Linux/Windows)
cargo run --bin hello_triangle --features vulkan
# Metal (macOS/iOS)
cargo run --bin hello_triangle --features metal
# DirectX12 (Windows)
cargo run --bin hello_triangle --features dx12
cd ../gfx-examples
# Vulkan (Linux/Windows)
cargo run --bin cube --features vulkan
# Metal (macOS/iOS)
cargo run --bin cube --features metal
# DirectX12 (Windows)
cargo run --bin cube --features dx12
These examples assume that necessary dependencies for the graphics backend are already installed. For more information about installation and usage, refer to the Getting Started guide.