Bug 1575008 - WebGPU implementation basis r=baku,bzbarsky
☠☠ backed out by 6387f7830d66 ☠ ☠
authorDzmitry Malyshau <dmalyshau@mozilla.com>
Wed, 13 Nov 2019 12:48:33 +0000
changeset 501737 4d16c3d62cfc0503075206bccfbd3b32ad396e64
parent 501736 09a0252278f8bcd493345f2e05179f78f16e5a10
child 501738 47a58584b81390485c7530b1eef7d59b2d6c32b2
push id114172
push userdluca@mozilla.com
push dateTue, 19 Nov 2019 11:31:10 +0000
treeherdermozilla-inbound@b5c5ba07d3db [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbaku, bzbarsky
bugs1575008, 1594182
milestone72.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1575008 - WebGPU implementation basis r=baku,bzbarsky This change vendors `wgpu` library in-tree and hooks up the initialization bits. It implements adapter and device initialization and adds a simple test. Complementary ecosystem tracker - https://github.com/gfx-rs/wgpu/issues/374 Current status: - [x] Architecture - [x] figure out the IPC story - [ ] move wgpu crates into a dedicated folder (postponed as https://bugzilla.mozilla.org/show_bug.cgi?id=1594182) - [x] Linux - [x] avoid depending on spirv_cross - [x] macOS - [x] due to cross-compiling shaders - [x] need the dependency update - [x] stop using gcc - [x] unexpected SSL header collision - https://phabricator.services.mozilla.com/D51148 - [x] undefined Metal symbols - [x] missing webrtc headers for IPDL magic - https://phabricator.services.mozilla.com/D51558 - [x] spirv-cross linking failure in ASAN - https://phabricator.services.mozilla.com/D52688 - [x] Windows - [x] due to "ipc-channel" not supporting Windows yet - [x] due to some exceptional stuff - [x] undefined symbol: `D3D12CreateDevice` - [x] d3d12.dll is not found, dxgi1_4 doesn't present - [x] d3d11.dll and dxgi.dll need to be explicitly loaded on win32 mingw - [x] libbacktrace fails to link on win32 mingw - [x] cc mislinking C++ standard library - [x] Android - [x] spirv-cross fails to build due to exceptions Update-1: We decided to go with IPDL mechanism instead of Rust based ipc-channel (or any alternatives), which unblocks Windows build. Update-2: It appears that WebGPUThreading isn't needed any more as the child thread (and its event loop) is now managed by IPDL infrastructure. This PR removes it 🎉 . Update-3: InstanceProvider is also removed. Update-4: All set, the try is green, waiting for dependent changes to go in. Differential Revision: https://phabricator.services.mozilla.com/D49458
.cargo/config.in
.clang-format-ignore
Cargo.lock
Cargo.toml
dom/base/nsGlobalWindowInner.cpp
dom/base/nsGlobalWindowInner.h
dom/webgpu/Adapter.cpp
dom/webgpu/Adapter.h
dom/webgpu/Device.cpp
dom/webgpu/Device.h
dom/webgpu/Instance.cpp
dom/webgpu/Instance.h
dom/webgpu/InstanceProvider.cpp
dom/webgpu/InstanceProvider.h
dom/webgpu/ObjectModel.h
dom/webgpu/ffi/moz.build
dom/webgpu/ffi/wgpu.h
dom/webgpu/ipc/PWebGPU.ipdl
dom/webgpu/ipc/WebGPUChild.cpp
dom/webgpu/ipc/WebGPUChild.h
dom/webgpu/ipc/WebGPUParent.cpp
dom/webgpu/ipc/WebGPUParent.h
dom/webgpu/ipc/WebGPUSerialize.h
dom/webgpu/ipc/WebGPUTypes.h
dom/webgpu/mochitest/mochitest.ini
dom/webgpu/mochitest/test_device_creation.html
dom/webgpu/moz.build
dom/webgpu/thread/WebGPUThreading.cpp
dom/webgpu/thread/WebGPUThreading.h
dom/webgpu/thread/moz.build
dom/webgpu/wgpu-native/Cargo.toml
dom/webgpu/wgpu-native/cbindgen.toml
dom/webgpu/wgpu-native/src/binding_model.rs
dom/webgpu/wgpu-native/src/command/allocator.rs
dom/webgpu/wgpu-native/src/command/bind.rs
dom/webgpu/wgpu-native/src/command/compute.rs
dom/webgpu/wgpu-native/src/command/mod.rs
dom/webgpu/wgpu-native/src/command/render.rs
dom/webgpu/wgpu-native/src/command/transfer.rs
dom/webgpu/wgpu-native/src/conv.rs
dom/webgpu/wgpu-native/src/device.rs
dom/webgpu/wgpu-native/src/hub.rs
dom/webgpu/wgpu-native/src/id.rs
dom/webgpu/wgpu-native/src/instance.rs
dom/webgpu/wgpu-native/src/lib.rs
dom/webgpu/wgpu-native/src/pipeline.rs
dom/webgpu/wgpu-native/src/resource.rs
dom/webgpu/wgpu-native/src/swap_chain.rs
dom/webgpu/wgpu-native/src/track/buffer.rs
dom/webgpu/wgpu-native/src/track/mod.rs
dom/webgpu/wgpu-native/src/track/range.rs
dom/webgpu/wgpu-native/src/track/texture.rs
dom/webgpu/wgpu-remote/Cargo.toml
dom/webgpu/wgpu-remote/cbindgen.toml
dom/webgpu/wgpu-remote/src/lib.rs
dom/webgpu/wgpu-remote/src/server.rs
dom/webidl/WebGPU.webidl
gfx/ipc/GPUParent.cpp
gfx/layers/ipc/CompositorBridgeChild.cpp
gfx/layers/ipc/CompositorBridgeChild.h
gfx/layers/ipc/CompositorBridgeParent.cpp
gfx/layers/ipc/CompositorBridgeParent.h
gfx/layers/ipc/ContentCompositorBridgeParent.cpp
gfx/layers/ipc/ContentCompositorBridgeParent.h
gfx/layers/ipc/PCompositorBridge.ipdl
gfx/thebes/gfxPlatform.cpp
servo/components/style/Cargo.toml
third_party/rust/arrayvec/.cargo-checksum.json
third_party/rust/arrayvec/Cargo.toml
third_party/rust/arrayvec/README.rst
third_party/rust/arrayvec/benches/extend.rs
third_party/rust/arrayvec/build.rs
third_party/rust/arrayvec/src/array.rs
third_party/rust/arrayvec/src/array_string.rs
third_party/rust/arrayvec/src/char.rs
third_party/rust/arrayvec/src/lib.rs
third_party/rust/arrayvec/src/maybe_uninit.rs
third_party/rust/arrayvec/src/maybe_uninit_nodrop.rs
third_party/rust/arrayvec/src/maybe_uninit_stable.rs
third_party/rust/arrayvec/src/range.rs
third_party/rust/arrayvec/tests/serde.rs
third_party/rust/arrayvec/tests/tests.rs
third_party/rust/ash/.cargo-checksum.json
third_party/rust/ash/Cargo.toml
third_party/rust/ash/output
third_party/rust/ash/src/allocator.rs
third_party/rust/ash/src/device.rs
third_party/rust/ash/src/entry.rs
third_party/rust/ash/src/extensions/experimental/amd.rs
third_party/rust/ash/src/extensions/experimental/mod.rs
third_party/rust/ash/src/extensions/ext/debug_marker.rs
third_party/rust/ash/src/extensions/ext/debug_report.rs
third_party/rust/ash/src/extensions/ext/debug_utils.rs
third_party/rust/ash/src/extensions/ext/mod.rs
third_party/rust/ash/src/extensions/khr/android_surface.rs
third_party/rust/ash/src/extensions/khr/display_swapchain.rs
third_party/rust/ash/src/extensions/khr/mod.rs
third_party/rust/ash/src/extensions/khr/surface.rs
third_party/rust/ash/src/extensions/khr/swapchain.rs
third_party/rust/ash/src/extensions/khr/wayland_surface.rs
third_party/rust/ash/src/extensions/khr/win32_surface.rs
third_party/rust/ash/src/extensions/khr/xcb_surface.rs
third_party/rust/ash/src/extensions/khr/xlib_surface.rs
third_party/rust/ash/src/extensions/mod.rs
third_party/rust/ash/src/extensions/mvk/ios_surface.rs
third_party/rust/ash/src/extensions/mvk/macos_surface.rs
third_party/rust/ash/src/extensions/mvk/mod.rs
third_party/rust/ash/src/extensions/nv/mesh_shader.rs
third_party/rust/ash/src/extensions/nv/mod.rs
third_party/rust/ash/src/extensions/nv/ray_tracing.rs
third_party/rust/ash/src/instance.rs
third_party/rust/ash/src/lib.rs
third_party/rust/ash/src/prelude.rs
third_party/rust/ash/src/util.rs
third_party/rust/ash/src/version.rs
third_party/rust/ash/src/vk.rs
third_party/rust/ash/tests/constant_size_arrays.rs
third_party/rust/ash/tests/display.rs
third_party/rust/atom/.cargo-checksum.json
third_party/rust/atom/Cargo.toml
third_party/rust/atom/LICENSE
third_party/rust/atom/examples/fifo.rs
third_party/rust/atom/examples/simple.rs
third_party/rust/atom/readme.md
third_party/rust/atom/src/lib.rs
third_party/rust/atom/tests/atom.rs
third_party/rust/backtrace/.cargo-checksum.json
third_party/rust/backtrace/Cargo.lock
third_party/rust/backtrace/Cargo.toml
third_party/rust/backtrace/README.md
third_party/rust/backtrace/appveyor.yml
third_party/rust/backtrace/benches/benchmarks.rs
third_party/rust/backtrace/ci/android-sdk.sh
third_party/rust/backtrace/ci/docker/arm-linux-androideabi/Dockerfile
third_party/rust/backtrace/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
third_party/rust/backtrace/ci/run-docker.sh
third_party/rust/backtrace/ci/runtest-android.rs
third_party/rust/backtrace/examples/raw.rs
third_party/rust/backtrace/src/backtrace/dbghelp.rs
third_party/rust/backtrace/src/backtrace/libunwind.rs
third_party/rust/backtrace/src/backtrace/mod.rs
third_party/rust/backtrace/src/backtrace/noop.rs
third_party/rust/backtrace/src/backtrace/unix_backtrace.rs
third_party/rust/backtrace/src/capture.rs
third_party/rust/backtrace/src/dbghelp.rs
third_party/rust/backtrace/src/dylib.rs
third_party/rust/backtrace/src/lib.rs
third_party/rust/backtrace/src/print.rs
third_party/rust/backtrace/src/print/fuchsia.rs
third_party/rust/backtrace/src/symbolize/coresymbolication.rs
third_party/rust/backtrace/src/symbolize/dbghelp.rs
third_party/rust/backtrace/src/symbolize/dladdr.rs
third_party/rust/backtrace/src/symbolize/dladdr_resolve.rs
third_party/rust/backtrace/src/symbolize/gimli.rs
third_party/rust/backtrace/src/symbolize/libbacktrace.rs
third_party/rust/backtrace/src/symbolize/mod.rs
third_party/rust/backtrace/src/symbolize/noop.rs
third_party/rust/backtrace/src/types.rs
third_party/rust/backtrace/src/windows.rs
third_party/rust/backtrace/tests/accuracy/auxiliary.rs
third_party/rust/backtrace/tests/accuracy/main.rs
third_party/rust/backtrace/tests/concurrent-panics.rs
third_party/rust/backtrace/tests/long_fn_name.rs
third_party/rust/backtrace/tests/skip_inner_frames.rs
third_party/rust/backtrace/tests/smoke.rs
third_party/rust/blake2b_simd/.cargo-checksum.json
third_party/rust/blake2b_simd/Cargo.toml
third_party/rust/block/.cargo-checksum.json
third_party/rust/block/Cargo.toml
third_party/rust/block/README.md
third_party/rust/block/src/lib.rs
third_party/rust/block/src/test_utils.rs
third_party/rust/cc/.cargo-checksum.json
third_party/rust/cc/Cargo.lock
third_party/rust/cc/Cargo.toml
third_party/rust/cc/README.md
third_party/rust/cc/azure-pipelines.yml
third_party/rust/cc/ci/azure-install-rust.yml
third_party/rust/cc/ci/azure-steps.yml
third_party/rust/cc/src/bin/gcc-shim.rs
third_party/rust/cc/src/com.rs
third_party/rust/cc/src/lib.rs
third_party/rust/cc/src/setup_config.rs
third_party/rust/cc/src/winapi.rs
third_party/rust/cc/src/windows_registry.rs
third_party/rust/cc/tests/cc_env.rs
third_party/rust/cc/tests/cflags.rs
third_party/rust/cc/tests/cxxflags.rs
third_party/rust/cc/tests/support/mod.rs
third_party/rust/cc/tests/test.rs
third_party/rust/cocoa/.cargo-checksum.json
third_party/rust/cocoa/COPYRIGHT
third_party/rust/cocoa/Cargo.lock
third_party/rust/cocoa/Cargo.toml
third_party/rust/cocoa/LICENSE-APACHE
third_party/rust/cocoa/LICENSE-MIT
third_party/rust/cocoa/README.md
third_party/rust/cocoa/examples/color.rs
third_party/rust/cocoa/examples/fullscreen.rs
third_party/rust/cocoa/examples/hello_world.rs
third_party/rust/cocoa/examples/tab_view.rs
third_party/rust/cocoa/src/appkit.rs
third_party/rust/cocoa/src/base.rs
third_party/rust/cocoa/src/foundation.rs
third_party/rust/cocoa/src/lib.rs
third_party/rust/cocoa/src/macros.rs
third_party/rust/cocoa/src/quartzcore.rs
third_party/rust/cocoa/tests/foundation.rs
third_party/rust/colorful/.cargo-checksum.json
third_party/rust/colorful/Cargo.toml
third_party/rust/colorful/CodeOfConduct.md
third_party/rust/colorful/README.md
third_party/rust/colorful/license
third_party/rust/colorful/rustfmt.toml
third_party/rust/colorful/src/core/color_string.rs
third_party/rust/colorful/src/core/colors.rs
third_party/rust/colorful/src/core/hsl.rs
third_party/rust/colorful/src/core/mod.rs
third_party/rust/colorful/src/core/rgb.rs
third_party/rust/colorful/src/core/style.rs
third_party/rust/colorful/src/core/symbols.rs
third_party/rust/colorful/src/lib.rs
third_party/rust/colorful/tests/test_all_color.rs
third_party/rust/colorful/tests/test_animation.rs
third_party/rust/colorful/tests/test_basic.rs
third_party/rust/colorful/tests/test_extra.rs
third_party/rust/colorful/tests/test_gradient.rs
third_party/rust/colorful/tests/test_hsl.rs
third_party/rust/copyless/.cargo-checksum.json
third_party/rust/copyless/CHANGELOG.md
third_party/rust/copyless/Cargo.toml
third_party/rust/copyless/LICENSE
third_party/rust/copyless/README.md
third_party/rust/copyless/bors.toml
third_party/rust/copyless/rustfmt.toml
third_party/rust/copyless/src/boxed.rs
third_party/rust/copyless/src/lib.rs
third_party/rust/copyless/src/vec.rs
third_party/rust/core-graphics/.cargo-checksum.json
third_party/rust/core-graphics/Cargo.toml
third_party/rust/core-graphics/src/color.rs
third_party/rust/core-graphics/src/lib.rs
third_party/rust/core-graphics/src/window.rs
third_party/rust/crossbeam-deque/.cargo-checksum.json
third_party/rust/crossbeam-deque/CHANGELOG.md
third_party/rust/crossbeam-deque/Cargo.toml
third_party/rust/crossbeam-deque/LICENSE-MIT
third_party/rust/crossbeam-deque/README.md
third_party/rust/crossbeam-deque/src/lib.rs
third_party/rust/crossbeam-deque/tests/fifo.rs
third_party/rust/crossbeam-deque/tests/injector.rs
third_party/rust/crossbeam-deque/tests/lifo.rs
third_party/rust/crossbeam-epoch/.cargo-checksum.json
third_party/rust/crossbeam-epoch/CHANGELOG.md
third_party/rust/crossbeam-epoch/Cargo.lock
third_party/rust/crossbeam-epoch/Cargo.toml
third_party/rust/crossbeam-epoch/README.md
third_party/rust/crossbeam-epoch/build.rs
third_party/rust/crossbeam-epoch/src/atomic.rs
third_party/rust/crossbeam-epoch/src/deferred.rs
third_party/rust/crossbeam-epoch/src/guard.rs
third_party/rust/crossbeam-epoch/src/internal.rs
third_party/rust/crossbeam-epoch/src/lib.rs
third_party/rust/crossbeam-epoch/src/sync/queue.rs
third_party/rust/crossbeam-utils-0.6.5/.cargo-checksum.json
third_party/rust/crossbeam-utils-0.6.5/CHANGELOG.md
third_party/rust/crossbeam-utils-0.6.5/Cargo.toml
third_party/rust/crossbeam-utils-0.6.5/LICENSE-APACHE
third_party/rust/crossbeam-utils-0.6.5/LICENSE-MIT
third_party/rust/crossbeam-utils-0.6.5/README.md
third_party/rust/crossbeam-utils-0.6.5/benches/atomic_cell.rs
third_party/rust/crossbeam-utils-0.6.5/src/atomic/atomic_cell.rs
third_party/rust/crossbeam-utils-0.6.5/src/atomic/consume.rs
third_party/rust/crossbeam-utils-0.6.5/src/atomic/mod.rs
third_party/rust/crossbeam-utils-0.6.5/src/backoff.rs
third_party/rust/crossbeam-utils-0.6.5/src/cache_padded.rs
third_party/rust/crossbeam-utils-0.6.5/src/lib.rs
third_party/rust/crossbeam-utils-0.6.5/src/sync/mod.rs
third_party/rust/crossbeam-utils-0.6.5/src/sync/parker.rs
third_party/rust/crossbeam-utils-0.6.5/src/sync/sharded_lock.rs
third_party/rust/crossbeam-utils-0.6.5/src/sync/wait_group.rs
third_party/rust/crossbeam-utils-0.6.5/src/thread.rs
third_party/rust/crossbeam-utils-0.6.5/tests/atomic_cell.rs
third_party/rust/crossbeam-utils-0.6.5/tests/cache_padded.rs
third_party/rust/crossbeam-utils-0.6.5/tests/parker.rs
third_party/rust/crossbeam-utils-0.6.5/tests/sharded_lock.rs
third_party/rust/crossbeam-utils-0.6.5/tests/thread.rs
third_party/rust/crossbeam-utils-0.6.5/tests/wait_group.rs
third_party/rust/crossbeam-utils/.cargo-checksum.json
third_party/rust/crossbeam-utils/CHANGELOG.md
third_party/rust/crossbeam-utils/Cargo.toml
third_party/rust/crossbeam-utils/LICENSE-MIT
third_party/rust/crossbeam-utils/README.md
third_party/rust/crossbeam-utils/benches/atomic_cell.rs
third_party/rust/crossbeam-utils/build.rs
third_party/rust/crossbeam-utils/src/atomic/atomic_cell.rs
third_party/rust/crossbeam-utils/src/atomic/mod.rs
third_party/rust/crossbeam-utils/src/atomic/seq_lock.rs
third_party/rust/crossbeam-utils/src/atomic/seq_lock_wide.rs
third_party/rust/crossbeam-utils/src/backoff.rs
third_party/rust/crossbeam-utils/src/cache_padded.rs
third_party/rust/crossbeam-utils/src/lib.rs
third_party/rust/crossbeam-utils/src/thread.rs
third_party/rust/crossbeam-utils/tests/atomic_cell.rs
third_party/rust/crossbeam-utils/tests/parker.rs
third_party/rust/crossbeam-utils/tests/sharded_lock.rs
third_party/rust/crossbeam-utils/tests/thread.rs
third_party/rust/d3d12/.cargo-checksum.json
third_party/rust/d3d12/Cargo.toml
third_party/rust/d3d12/README.md
third_party/rust/d3d12/appveyor.yml
third_party/rust/d3d12/bors.toml
third_party/rust/d3d12/src/com.rs
third_party/rust/d3d12/src/command_allocator.rs
third_party/rust/d3d12/src/command_list.rs
third_party/rust/d3d12/src/debug.rs
third_party/rust/d3d12/src/descriptor.rs
third_party/rust/d3d12/src/device.rs
third_party/rust/d3d12/src/dxgi.rs
third_party/rust/d3d12/src/heap.rs
third_party/rust/d3d12/src/lib.rs
third_party/rust/d3d12/src/pso.rs
third_party/rust/d3d12/src/query.rs
third_party/rust/d3d12/src/queue.rs
third_party/rust/d3d12/src/resource.rs
third_party/rust/d3d12/src/sync.rs
third_party/rust/gfx-auxil/.cargo-checksum.json
third_party/rust/gfx-auxil/Cargo.toml
third_party/rust/gfx-auxil/src/lib.rs
third_party/rust/gfx-backend-dx11/.cargo-checksum.json
third_party/rust/gfx-backend-dx11/Cargo.toml
third_party/rust/gfx-backend-dx11/README.md
third_party/rust/gfx-backend-dx11/shaders/blit.hlsl
third_party/rust/gfx-backend-dx11/shaders/clear.hlsl
third_party/rust/gfx-backend-dx11/shaders/copy.hlsl
third_party/rust/gfx-backend-dx11/src/conv.rs
third_party/rust/gfx-backend-dx11/src/debug.rs
third_party/rust/gfx-backend-dx11/src/device.rs
third_party/rust/gfx-backend-dx11/src/dxgi.rs
third_party/rust/gfx-backend-dx11/src/internal.rs
third_party/rust/gfx-backend-dx11/src/lib.rs
third_party/rust/gfx-backend-dx11/src/shader.rs
third_party/rust/gfx-backend-dx12/.cargo-checksum.json
third_party/rust/gfx-backend-dx12/Cargo.toml
third_party/rust/gfx-backend-dx12/README.md
third_party/rust/gfx-backend-dx12/shaders/blit.hlsl
third_party/rust/gfx-backend-dx12/src/command.rs
third_party/rust/gfx-backend-dx12/src/conv.rs
third_party/rust/gfx-backend-dx12/src/descriptors_cpu.rs
third_party/rust/gfx-backend-dx12/src/device.rs
third_party/rust/gfx-backend-dx12/src/internal.rs
third_party/rust/gfx-backend-dx12/src/lib.rs
third_party/rust/gfx-backend-dx12/src/pool.rs
third_party/rust/gfx-backend-dx12/src/resource.rs
third_party/rust/gfx-backend-dx12/src/root_constants.rs
third_party/rust/gfx-backend-dx12/src/window.rs
third_party/rust/gfx-backend-empty/.cargo-checksum.json
third_party/rust/gfx-backend-empty/Cargo.toml
third_party/rust/gfx-backend-empty/src/lib.rs
third_party/rust/gfx-backend-metal/.cargo-checksum.json
third_party/rust/gfx-backend-metal/Cargo.toml
third_party/rust/gfx-backend-metal/README.md
third_party/rust/gfx-backend-metal/shaders/blit.metal
third_party/rust/gfx-backend-metal/shaders/clear.metal
third_party/rust/gfx-backend-metal/shaders/fill.metal
third_party/rust/gfx-backend-metal/shaders/gfx_shaders.metallib
third_party/rust/gfx-backend-metal/shaders/macros.h
third_party/rust/gfx-backend-metal/src/command.rs
third_party/rust/gfx-backend-metal/src/conversions.rs
third_party/rust/gfx-backend-metal/src/device.rs
third_party/rust/gfx-backend-metal/src/internal.rs
third_party/rust/gfx-backend-metal/src/lib.rs
third_party/rust/gfx-backend-metal/src/native.rs
third_party/rust/gfx-backend-metal/src/soft.rs
third_party/rust/gfx-backend-metal/src/window.rs
third_party/rust/gfx-backend-vulkan/.cargo-checksum.json
third_party/rust/gfx-backend-vulkan/Cargo.toml
third_party/rust/gfx-backend-vulkan/README.md
third_party/rust/gfx-backend-vulkan/src/command.rs
third_party/rust/gfx-backend-vulkan/src/conv.rs
third_party/rust/gfx-backend-vulkan/src/device.rs
third_party/rust/gfx-backend-vulkan/src/info.rs
third_party/rust/gfx-backend-vulkan/src/lib.rs
third_party/rust/gfx-backend-vulkan/src/native.rs
third_party/rust/gfx-backend-vulkan/src/pool.rs
third_party/rust/gfx-backend-vulkan/src/window.rs
third_party/rust/gfx-hal/.cargo-checksum.json
third_party/rust/gfx-hal/Cargo.toml
third_party/rust/gfx-hal/src/adapter.rs
third_party/rust/gfx-hal/src/buffer.rs
third_party/rust/gfx-hal/src/command/clear.rs
third_party/rust/gfx-hal/src/command/mod.rs
third_party/rust/gfx-hal/src/command/structs.rs
third_party/rust/gfx-hal/src/device.rs
third_party/rust/gfx-hal/src/format.rs
third_party/rust/gfx-hal/src/image.rs
third_party/rust/gfx-hal/src/lib.rs
third_party/rust/gfx-hal/src/memory.rs
third_party/rust/gfx-hal/src/pass.rs
third_party/rust/gfx-hal/src/pool.rs
third_party/rust/gfx-hal/src/pso/compute.rs
third_party/rust/gfx-hal/src/pso/descriptor.rs
third_party/rust/gfx-hal/src/pso/graphics.rs
third_party/rust/gfx-hal/src/pso/input_assembler.rs
third_party/rust/gfx-hal/src/pso/mod.rs
third_party/rust/gfx-hal/src/pso/output_merger.rs
third_party/rust/gfx-hal/src/pso/specialization.rs
third_party/rust/gfx-hal/src/query.rs
third_party/rust/gfx-hal/src/queue/family.rs
third_party/rust/gfx-hal/src/queue/mod.rs
third_party/rust/gfx-hal/src/range.rs
third_party/rust/gfx-hal/src/window.rs
third_party/rust/hibitset/.cargo-checksum.json
third_party/rust/hibitset/Cargo.toml
third_party/rust/hibitset/LICENSE-APACHE
third_party/rust/hibitset/LICENSE-MIT
third_party/rust/hibitset/README.md
third_party/rust/hibitset/benches/benches.rs
third_party/rust/hibitset/benches/iter.rs
third_party/rust/hibitset/bors.toml
third_party/rust/hibitset/src/atomic.rs
third_party/rust/hibitset/src/iter/drain.rs
third_party/rust/hibitset/src/iter/mod.rs
third_party/rust/hibitset/src/iter/parallel.rs
third_party/rust/hibitset/src/lib.rs
third_party/rust/hibitset/src/ops.rs
third_party/rust/hibitset/src/util.rs
third_party/rust/malloc_buf/.cargo-checksum.json
third_party/rust/malloc_buf/Cargo.toml
third_party/rust/malloc_buf/src/lib.rs
third_party/rust/metal/.cargo-checksum.json
third_party/rust/metal/Cargo.lock
third_party/rust/metal/Cargo.toml
third_party/rust/metal/LICENSE-APACHE
third_party/rust/metal/LICENSE-MIT
third_party/rust/metal/README.md
third_party/rust/metal/bors.toml
third_party/rust/metal/examples/argument-buffer/main.rs
third_party/rust/metal/examples/bind/main.rs
third_party/rust/metal/examples/caps/main.rs
third_party/rust/metal/examples/compute/compute-argument-buffer.metal
third_party/rust/metal/examples/compute/compute-argument-buffer.rs
third_party/rust/metal/examples/compute/default.metallib
third_party/rust/metal/examples/compute/embedded-lib.rs
third_party/rust/metal/examples/compute/main.rs
third_party/rust/metal/examples/compute/shaders.metal
third_party/rust/metal/examples/library/main.rs
third_party/rust/metal/examples/reflection/main.rs
third_party/rust/metal/examples/window/default.metallib
third_party/rust/metal/examples/window/main.rs
third_party/rust/metal/examples/window/shaders.metal
third_party/rust/metal/src/argument.rs
third_party/rust/metal/src/buffer.rs
third_party/rust/metal/src/capturemanager.rs
third_party/rust/metal/src/commandbuffer.rs
third_party/rust/metal/src/commandqueue.rs
third_party/rust/metal/src/constants.rs
third_party/rust/metal/src/depthstencil.rs
third_party/rust/metal/src/device.rs
third_party/rust/metal/src/drawable.rs
third_party/rust/metal/src/encoder.rs
third_party/rust/metal/src/heap.rs
third_party/rust/metal/src/lib.rs
third_party/rust/metal/src/library.rs
third_party/rust/metal/src/pipeline/compute.rs
third_party/rust/metal/src/pipeline/mod.rs
third_party/rust/metal/src/pipeline/render.rs
third_party/rust/metal/src/renderpass.rs
third_party/rust/metal/src/resource.rs
third_party/rust/metal/src/sampler.rs
third_party/rust/metal/src/texture.rs
third_party/rust/metal/src/types.rs
third_party/rust/metal/src/vertexdescriptor.rs
third_party/rust/neqo-common/.cargo-checksum.json
third_party/rust/neqo-common/src/log.rs
third_party/rust/neqo-common/tests/log.rs
third_party/rust/neqo-crypto/.cargo-checksum.json
third_party/rust/neqo-crypto/build.rs
third_party/rust/neqo-crypto/src/agent.rs
third_party/rust/neqo-crypto/src/agentio.rs
third_party/rust/neqo-http3/.cargo-checksum.json
third_party/rust/neqo-http3/src/connection.rs
third_party/rust/neqo-http3/src/connection_client.rs
third_party/rust/neqo-http3/src/connection_server.rs
third_party/rust/neqo-http3/src/control_stream_local.rs
third_party/rust/neqo-http3/src/control_stream_remote.rs
third_party/rust/neqo-http3/src/hframe.rs
third_party/rust/neqo-http3/src/stream_type_reader.rs
third_party/rust/neqo-http3/src/transaction_client.rs
third_party/rust/neqo-http3/src/transaction_server.rs
third_party/rust/neqo-qpack/.cargo-checksum.json
third_party/rust/neqo-qpack/src/decoder.rs
third_party/rust/neqo-qpack/src/encoder.rs
third_party/rust/neqo-transport/.cargo-checksum.json
third_party/rust/neqo-transport/src/connection.rs
third_party/rust/neqo-transport/src/crypto.rs
third_party/rust/neqo-transport/src/dump.rs
third_party/rust/neqo-transport/src/flow_mgr.rs
third_party/rust/neqo-transport/src/frame.rs
third_party/rust/neqo-transport/src/recovery.rs
third_party/rust/neqo-transport/src/recv_stream.rs
third_party/rust/neqo-transport/src/send_stream.rs
third_party/rust/neqo-transport/src/server.rs
third_party/rust/neqo-transport/src/tracking.rs
third_party/rust/objc/.cargo-checksum.json
third_party/rust/objc/CHANGELOG.md
third_party/rust/objc/Cargo.toml
third_party/rust/objc/LICENSE.txt
third_party/rust/objc/README.md
third_party/rust/objc/examples/example.rs
third_party/rust/objc/src/declare.rs
third_party/rust/objc/src/encode.rs
third_party/rust/objc/src/exception.rs
third_party/rust/objc/src/lib.rs
third_party/rust/objc/src/macros.rs
third_party/rust/objc/src/message/apple/arm.rs
third_party/rust/objc/src/message/apple/arm64.rs
third_party/rust/objc/src/message/apple/mod.rs
third_party/rust/objc/src/message/apple/x86.rs
third_party/rust/objc/src/message/apple/x86_64.rs
third_party/rust/objc/src/message/gnustep.rs
third_party/rust/objc/src/message/mod.rs
third_party/rust/objc/src/message/verify.rs
third_party/rust/objc/src/rc/autorelease.rs
third_party/rust/objc/src/rc/mod.rs
third_party/rust/objc/src/rc/strong.rs
third_party/rust/objc/src/rc/weak.rs
third_party/rust/objc/src/runtime.rs
third_party/rust/objc/src/test_utils.rs
third_party/rust/objc_exception/.cargo-checksum.json
third_party/rust/objc_exception/Cargo.toml
third_party/rust/objc_exception/build.rs
third_party/rust/objc_exception/extern/exception.m
third_party/rust/objc_exception/src/lib.rs
third_party/rust/range-alloc/.cargo-checksum.json
third_party/rust/range-alloc/Cargo.toml
third_party/rust/range-alloc/src/lib.rs
third_party/rust/raw-window-handle/.cargo-checksum.json
third_party/rust/raw-window-handle/CHANGELOG.md
third_party/rust/raw-window-handle/Cargo.toml
third_party/rust/raw-window-handle/LICENSE
third_party/rust/raw-window-handle/README.md
third_party/rust/raw-window-handle/appveyor.yml
third_party/rust/raw-window-handle/rustfmt.toml
third_party/rust/raw-window-handle/src/android.rs
third_party/rust/raw-window-handle/src/ios.rs
third_party/rust/raw-window-handle/src/lib.rs
third_party/rust/raw-window-handle/src/macos.rs
third_party/rust/raw-window-handle/src/unix.rs
third_party/rust/raw-window-handle/src/web.rs
third_party/rust/raw-window-handle/src/windows.rs
third_party/rust/relevant/.cargo-checksum.json
third_party/rust/relevant/Cargo.toml
third_party/rust/relevant/LICENSE-APACHE
third_party/rust/relevant/LICENSE-MIT
third_party/rust/relevant/README.md
third_party/rust/relevant/src/lib.rs
third_party/rust/rendy-descriptor/.cargo-checksum.json
third_party/rust/rendy-descriptor/Cargo.toml
third_party/rust/rendy-descriptor/src/allocator.rs
third_party/rust/rendy-descriptor/src/lib.rs
third_party/rust/rendy-descriptor/src/ranges.rs
third_party/rust/rendy-memory/.cargo-checksum.json
third_party/rust/rendy-memory/Cargo.toml
third_party/rust/rendy-memory/src/allocator/dedicated.rs
third_party/rust/rendy-memory/src/allocator/dynamic.rs
third_party/rust/rendy-memory/src/allocator/linear.rs
third_party/rust/rendy-memory/src/allocator/mod.rs
third_party/rust/rendy-memory/src/block.rs
third_party/rust/rendy-memory/src/heaps/heap.rs
third_party/rust/rendy-memory/src/heaps/memory_type.rs
third_party/rust/rendy-memory/src/heaps/mod.rs
third_party/rust/rendy-memory/src/lib.rs
third_party/rust/rendy-memory/src/mapping/mod.rs
third_party/rust/rendy-memory/src/mapping/range.rs
third_party/rust/rendy-memory/src/mapping/write.rs
third_party/rust/rendy-memory/src/memory.rs
third_party/rust/rendy-memory/src/usage.rs
third_party/rust/rendy-memory/src/util.rs
third_party/rust/rendy-memory/src/utilization.rs
third_party/rust/shared_library/.cargo-checksum.json
third_party/rust/shared_library/Cargo.toml
third_party/rust/shared_library/LICENSE-APACHE
third_party/rust/shared_library/LICENSE-MIT
third_party/rust/shared_library/src/dynamic_library.rs
third_party/rust/shared_library/src/lib.rs
third_party/rust/spirv_cross/.cargo-checksum.json
third_party/rust/spirv_cross/Cargo.toml
third_party/rust/spirv_cross/build.rs
third_party/rust/spirv_cross/src/bindings_native.rs
third_party/rust/spirv_cross/src/bindings_wasm.rs
third_party/rust/spirv_cross/src/bindings_wasm_functions.rs
third_party/rust/spirv_cross/src/compiler.rs
third_party/rust/spirv_cross/src/emscripten.rs
third_party/rust/spirv_cross/src/glsl.rs
third_party/rust/spirv_cross/src/hlsl.rs
third_party/rust/spirv_cross/src/lib.rs
third_party/rust/spirv_cross/src/msl.rs
third_party/rust/spirv_cross/src/ptr_util.rs
third_party/rust/spirv_cross/src/spirv.rs
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/.clang-format
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/.gitignore
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/CMakeLists.txt
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/GLSL.std.450.h
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/LICENSE
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/Makefile
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/cmake/gitversion.in.h
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/format_all.sh
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/gn/BUILD.gn
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/include/spirv_cross/barrier.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/include/spirv_cross/external_interface.h
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/include/spirv_cross/image.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/include/spirv_cross/internal_interface.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/include/spirv_cross/sampler.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/include/spirv_cross/thread_group.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/main.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/pkg-config/spirv-cross-c-shared.pc.in
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv.h
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cfg.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cfg.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_common.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cpp.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cpp.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_c.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_c.h
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_containers.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_error_handling.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_parsed_ir.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_parsed_ir.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_util.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_cross_util.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_glsl.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_glsl.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_hlsl.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_hlsl.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_msl.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_msl.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_parser.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_parser.hpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_reflect.cpp
third_party/rust/spirv_cross/src/vendor/SPIRV-Cross/spirv_reflect.hpp
third_party/rust/spirv_cross/src/wrapper.cpp
third_party/rust/spirv_cross/src/wrapper.hpp
third_party/rust/spirv_cross/tests/common/mod.rs
third_party/rust/spirv_cross/tests/glsl_tests.rs
third_party/rust/spirv_cross/tests/hlsl_tests.rs
third_party/rust/spirv_cross/tests/msl_tests.rs
third_party/rust/spirv_cross/tests/shaders/array.vert
third_party/rust/spirv_cross/tests/shaders/array.vert.spv
third_party/rust/spirv_cross/tests/shaders/rasterize_disabled.vert
third_party/rust/spirv_cross/tests/shaders/rasterize_disabled.vert.spv
third_party/rust/spirv_cross/tests/shaders/sampler.frag
third_party/rust/spirv_cross/tests/shaders/sampler.frag.spv
third_party/rust/spirv_cross/tests/shaders/simple.vert
third_party/rust/spirv_cross/tests/shaders/simple.vert.spv
third_party/rust/spirv_cross/tests/shaders/specialization.comp
third_party/rust/spirv_cross/tests/shaders/specialization.comp.spv
third_party/rust/spirv_cross/tests/shaders/struct.frag
third_party/rust/spirv_cross/tests/shaders/struct.frag.spv
third_party/rust/spirv_cross/tests/shaders/struct.vert
third_party/rust/spirv_cross/tests/shaders/struct.vert.spv
third_party/rust/spirv_cross/tests/shaders/workgroup.comp
third_party/rust/spirv_cross/tests/shaders/workgroup.comp.spv
third_party/rust/spirv_cross/tests/spirv_tests.rs
third_party/rust/storage-map/.cargo-checksum.json
third_party/rust/storage-map/Cargo.toml
third_party/rust/storage-map/LICENSE
third_party/rust/storage-map/README.md
third_party/rust/storage-map/src/lib.rs
third_party/rust/storage-map/tests/ten.rs
third_party/rust/uluru/.cargo-checksum.json
third_party/rust/uluru/Cargo.toml
third_party/rust/wio/.cargo-checksum.json
third_party/rust/wio/Cargo.toml
third_party/rust/wio/LICENSE-APACHE
third_party/rust/wio/LICENSE-MIT
third_party/rust/wio/README.md
third_party/rust/wio/src/apc.rs
third_party/rust/wio/src/com.rs
third_party/rust/wio/src/console.rs
third_party/rust/wio/src/error.rs
third_party/rust/wio/src/handle.rs
third_party/rust/wio/src/lib.rs
third_party/rust/wio/src/perf.rs
third_party/rust/wio/src/pipe.rs
third_party/rust/wio/src/sleep.rs
third_party/rust/wio/src/thread.rs
third_party/rust/wio/src/ums.rs
third_party/rust/wio/src/wide.rs
third_party/rust/x11/.cargo-checksum.json
third_party/rust/x11/Cargo.toml
third_party/rust/x11/build.rs
third_party/rust/x11/examples/hello-world.rs
third_party/rust/x11/examples/input.rs
third_party/rust/x11/examples/xrecord.rs
third_party/rust/x11/src/dpms.rs
third_party/rust/x11/src/glx.rs
third_party/rust/x11/src/internal.rs
third_party/rust/x11/src/keysym.rs
third_party/rust/x11/src/lib.rs
third_party/rust/x11/src/link.rs
third_party/rust/x11/src/xcursor.rs
third_party/rust/x11/src/xf86vmode.rs
third_party/rust/x11/src/xfixes.rs
third_party/rust/x11/src/xft.rs
third_party/rust/x11/src/xinerama.rs
third_party/rust/x11/src/xinput.rs
third_party/rust/x11/src/xinput2.rs
third_party/rust/x11/src/xlib.rs
third_party/rust/x11/src/xlib_xcb.rs
third_party/rust/x11/src/xmd.rs
third_party/rust/x11/src/xmu.rs
third_party/rust/x11/src/xrandr.rs
third_party/rust/x11/src/xrecord.rs
third_party/rust/x11/src/xrender.rs
third_party/rust/x11/src/xss.rs
third_party/rust/x11/src/xt.rs
third_party/rust/x11/src/xtest.rs
toolkit/library/gtest/rust/Cargo.toml
toolkit/library/moz.build
toolkit/library/rust/Cargo.toml
toolkit/library/rust/gkrust-features.mozbuild
toolkit/library/rust/shared/Cargo.toml
toolkit/library/rust/shared/lib.rs
tools/vcs/mach_commands.py
--- a/.cargo/config.in
+++ b/.cargo/config.in
@@ -7,16 +7,26 @@ branch = "r0.13.1"
 git = "https://github.com/shravanrn/nix/"
 replace-with = "vendored-sources"
 
 [source."https://github.com/mozilla/neqo"]
 branch = "master"
 git = "https://github.com/mozilla/neqo"
 replace-with = "vendored-sources"
 
+[source."https://github.com/kvark/spirv_cross"]
+branch = "wgpu"
+git = "https://github.com/kvark/spirv_cross"
+replace-with = "vendored-sources"
+
+[source."https://github.com/kvark/rust-objc-exception"]
+branch = "cc"
+git = "https://github.com/kvark/rust-objc-exception"
+replace-with = "vendored-sources"
+
 [source."https://github.com/jfkthame/mapped_hyph.git"]
 git = "https://github.com/jfkthame/mapped_hyph.git"
 replace-with = "vendored-sources"
 tag = "v0.3.0"
 
 [source."https://github.com/hsivonen/packed_simd"]
 branch = "rust_1_32"
 git = "https://github.com/hsivonen/packed_simd"
--- a/.clang-format-ignore
+++ b/.clang-format-ignore
@@ -33,16 +33,17 @@ layout/style/nsStyleStructList.h
 
 # Generated by protobuf
 .*/.*.pb.h
 .*/.*.pb.cc
 
 # Autogenerated file
 gfx/gl/GLConsts.h
 gfx/webrender_bindings/webrender_ffi_generated.h
+dom/webgpu/ffi/wgpu_ffi_generated.h
 intl/unicharutil/util/nsSpecialCasingData.cpp
 intl/unicharutil/util/nsUnicodePropertyData.cpp
 intl/unicharutil/util/nsUnicodeScriptCodes.h
 media/mp4parse-rust/mp4parse.h
 security/manager/ssl/StaticHPKPins.h
 widget/gtk/wayland/gtk-primary-selection-client-protocol.h
 widget/gtk/wayland/gtk-primary-selection-protocol.c
 
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -41,21 +41,31 @@ dependencies = [
 
 [[package]]
 name = "arrayref"
 version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "arrayvec"
-version = "0.4.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
-]
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "ash"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "atom"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "atomic"
 version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "atomic_refcell"
@@ -87,17 +97,17 @@ dependencies = [
 
 [[package]]
 name = "audioipc"
 version = "0.2.4"
 dependencies = [
  "audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "cubeb 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -160,32 +170,31 @@ dependencies = [
 
 [[package]]
 name = "autocfg"
 version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "backtrace"
-version = "0.3.9"
+version = "0.3.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "backtrace-sys"
 version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "baldrdash"
 version = "0.1.0"
 dependencies = [
  "bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -330,25 +339,30 @@ dependencies = [
  "moz_task 0.1.0",
  "nserror 0.1.0",
  "nsstring 0.1.0",
  "xpcom 0.1.0",
 ]
 
 [[package]]
 name = "blake2b_simd"
-version = "0.5.8"
+version = "0.5.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "block-buffer"
 version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "block-padding 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "byte-tools 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -406,17 +420,17 @@ dependencies = [
 
 [[package]]
 name = "cast"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "cc"
-version = "1.0.34"
+version = "1.0.47"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "cert_storage"
 version = "0.0.1"
 dependencies = [
  "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -492,18 +506,37 @@ dependencies = [
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cmake"
 version = "0.1.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
-]
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
+ "objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "colorful"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "comedy"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -519,47 +552,52 @@ source = "registry+https://github.com/ru
 name = "cookie"
 version = "0.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "copyless"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "core-foundation"
 version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-foundation-sys"
 version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "core-graphics"
-version = "0.17.1"
+version = "0.17.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-text"
 version = "13.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "coreaudio-sys"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -669,31 +707,31 @@ name = "crc32fast"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "crossbeam-deque"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "crossbeam-epoch"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "crossbeam-queue"
 version = "0.1.2"
@@ -707,16 +745,26 @@ name = "crossbeam-utils"
 version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "crossbeam-utils"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "cssparser"
 version = "0.25.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser-macros 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -813,16 +861,26 @@ name = "cubeb-sys"
 version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "d3d12"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "darling"
 version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "darling_core 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "darling_macro 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1030,17 +1088,17 @@ dependencies = [
  "serde 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "failure"
 version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "failure_derive"
 version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -1213,16 +1271,126 @@ source = "registry+https://github.com/ru
 dependencies = [
  "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "gfx-auxil"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "spirv_cross 0.16.0 (git+https://github.com/kvark/spirv_cross?branch=wgpu)",
+]
+
+[[package]]
+name = "gfx-backend-dx11"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-auxil 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "range-alloc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "spirv_cross 0.16.0 (git+https://github.com/kvark/spirv_cross?branch=wgpu)",
+ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wio 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gfx-backend-dx12"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "d3d12 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-auxil 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "range-alloc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "spirv_cross 0.16.0 (git+https://github.com/kvark/spirv_cross?branch=wgpu)",
+ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gfx-backend-empty"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gfx-backend-metal"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cocoa 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-auxil 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "metal 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "range-alloc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "spirv_cross 0.16.0 (git+https://github.com/kvark/spirv_cross?branch=wgpu)",
+ "storage-map 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gfx-backend-vulkan"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ash 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "x11 2.18.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "gfx-hal"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "gkrust"
 version = "0.1.0"
 dependencies = [
  "gkrust-shared 0.1.0",
  "mozilla-central-workspace-hack 0.1.0",
  "stylo_tests 0.0.1",
 ]
 
@@ -1237,17 +1405,17 @@ dependencies = [
  "nsstring-gtest 0.1.0",
  "xpcom-gtest 0.1.0",
 ]
 
 [[package]]
 name = "gkrust-shared"
 version = "0.1.0"
 dependencies = [
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "audioipc-client 0.4.0",
  "audioipc-server 0.2.3",
  "authenticator 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitsdownload 0.1.0",
  "bookmark_sync 0.1.0",
  "cert_storage 0.0.1",
  "cose-c 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1274,16 +1442,17 @@ dependencies = [
  "profiler_helper 0.1.0",
  "rlbox_lucet_sandbox 0.1.0 (git+https://github.com/PLSysSec/rlbox_lucet_sandbox/?rev=997c648eb0eaeaaa7a00a9eee20431f750b4e190)",
  "rsdparsa_capi 0.1.0",
  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "shift_or_euc_c 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "static_prefs 0.1.0",
  "storage 0.1.0",
  "webrender_bindings 0.1.0",
+ "wgpu-remote 0.1.0",
  "xpcom 0.1.0",
  "xulstore 0.1.0",
 ]
 
 [[package]]
 name = "gkrust_utils"
 version = "0.1.0"
 dependencies = [
@@ -1388,16 +1557,24 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "hibitset"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "atom 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "http"
 version = "0.1.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -1604,17 +1781,17 @@ dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "libloading"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "libudev"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -1630,17 +1807,17 @@ dependencies = [
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "libz-sys"
 version = "1.0.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "line-wrap"
 version = "0.1.1"
@@ -1666,17 +1843,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "lmdb-rkv-sys"
 version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lock_api"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1708,33 +1885,33 @@ dependencies = [
  "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-runtime"
 version = "0.1.1"
 source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
 dependencies = [
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-runtime-internals 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-runtime-internals"
 version = "0.1.1"
 source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
 dependencies = [
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "getrandom 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "nix 0.13.1 (git+https://github.com/shravanrn/nix/?branch=r0.13.1)",
@@ -1767,16 +1944,24 @@ source = "registry+https://github.com/ru
 name = "mach"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "malloc_size_of"
 version = "0.0.1"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.25.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "hashglobe 0.1.0",
  "selectors 0.21.0",
@@ -1849,16 +2034,30 @@ dependencies = [
 name = "memoffset"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "metal"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cocoa 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "mime"
 version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1870,17 +2069,17 @@ dependencies = [
  "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "miniz-sys"
 version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "miniz_oxide"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -2086,66 +2285,66 @@ dependencies = [
 [[package]]
 name = "murmurhash3"
 version = "0.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "neqo-common"
 version = "0.1.4"
-source = "git+https://github.com/mozilla/neqo#a17c1e83bb44ed923eb16a4c675ffe569b3a08f3"
+source = "git+https://github.com/mozilla/neqo#cf61e302a90ea844a61381a9e0bc464946187868"
 dependencies = [
  "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "neqo-crypto"
 version = "0.1.4"
-source = "git+https://github.com/mozilla/neqo#a17c1e83bb44ed923eb16a4c675ffe569b3a08f3"
+source = "git+https://github.com/mozilla/neqo#cf61e302a90ea844a61381a9e0bc464946187868"
 dependencies = [
  "bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "neqo-common 0.1.4 (git+https://github.com/mozilla/neqo)",
  "serde 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
  "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "neqo-http3"
 version = "0.1.4"
-source = "git+https://github.com/mozilla/neqo#a17c1e83bb44ed923eb16a4c675ffe569b3a08f3"
+source = "git+https://github.com/mozilla/neqo#cf61e302a90ea844a61381a9e0bc464946187868"
 dependencies = [
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "neqo-common 0.1.4 (git+https://github.com/mozilla/neqo)",
  "neqo-crypto 0.1.4 (git+https://github.com/mozilla/neqo)",
  "neqo-qpack 0.1.4 (git+https://github.com/mozilla/neqo)",
  "neqo-transport 0.1.4 (git+https://github.com/mozilla/neqo)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "neqo-qpack"
 version = "0.1.4"
-source = "git+https://github.com/mozilla/neqo#a17c1e83bb44ed923eb16a4c675ffe569b3a08f3"
+source = "git+https://github.com/mozilla/neqo#cf61e302a90ea844a61381a9e0bc464946187868"
 dependencies = [
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "neqo-common 0.1.4 (git+https://github.com/mozilla/neqo)",
  "neqo-crypto 0.1.4 (git+https://github.com/mozilla/neqo)",
  "neqo-transport 0.1.4 (git+https://github.com/mozilla/neqo)",
 ]
 
 [[package]]
 name = "neqo-transport"
 version = "0.1.4"
-source = "git+https://github.com/mozilla/neqo#a17c1e83bb44ed923eb16a4c675ffe569b3a08f3"
+source = "git+https://github.com/mozilla/neqo#cf61e302a90ea844a61381a9e0bc464946187868"
 dependencies = [
  "derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "neqo-common 0.1.4 (git+https://github.com/mozilla/neqo)",
  "neqo-crypto 0.1.4 (git+https://github.com/mozilla/neqo)",
  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "slice-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2193,17 +2392,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "nix"
 version = "0.13.1"
 source = "git+https://github.com/shravanrn/nix/?branch=r0.13.1#4af6c367603869a30fddb5ffb0aba2b9477ba92e"
 dependencies = [
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "nodrop"
 version = "0.1.12"
@@ -2305,16 +2504,33 @@ source = "registry+https://github.com/ru
 name = "num_cpus"
 version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "objc"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "objc_exception 0.1.2 (git+https://github.com/kvark/rust-objc-exception?branch=cc)",
+]
+
+[[package]]
+name = "objc_exception"
+version = "0.1.2"
+source = "git+https://github.com/kvark/rust-objc-exception?branch=cc#c86ad3a52984461fc5c63980d12e8ceed847854c"
+dependencies = [
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "object"
 version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "flate2 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "parity-wasm 0.40.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2703,31 +2919,44 @@ dependencies = [
 name = "rand_xorshift"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "range-alloc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "raw-window-handle"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "rayon"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rayon-core"
 version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rdrand"
@@ -2774,24 +3003,58 @@ dependencies = [
 ]
 
 [[package]]
 name = "regex-syntax"
 version = "0.6.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "relevant"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "remove_dir_all"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "rendy-descriptor"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "relevant 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rendy-memory"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "colorful 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "hibitset 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "relevant 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "ringbuf"
 version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -2850,17 +3113,17 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "rust-argon2"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rust-ini"
 version = "0.10.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -3093,16 +3356,25 @@ source = "registry+https://github.com/ru
 dependencies = [
  "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "shared_library"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "shift_or_euc"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)",
  "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -3164,16 +3436,24 @@ source = "registry+https://github.com/ru
 dependencies = [
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "spirv_cross"
+version = "0.16.0"
+source = "git+https://github.com/kvark/spirv_cross?branch=wgpu#636677bad724797789239c16e6d332e9b4d97b86"
+dependencies = [
+ "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "stable_deref_trait"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "static_prefs"
 version = "0.1.0"
 
@@ -3184,16 +3464,24 @@ dependencies = [
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
  "storage_variant 0.1.0",
  "xpcom 0.1.0",
 ]
 
 [[package]]
+name = "storage-map"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "storage_variant"
 version = "0.1.0"
 dependencies = [
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
  "xpcom 0.1.0",
 ]
@@ -3208,17 +3496,17 @@ name = "strsim"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "style"
 version = "0.0.1"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.25.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fallible 0.0.1",
@@ -3252,17 +3540,17 @@ dependencies = [
  "static_prefs 0.1.0",
  "style_derive 0.0.1",
  "style_traits 0.0.1",
  "thin-slice 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
  "to_shmem 0.0.1",
  "to_shmem_derive 0.0.1",
  "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "uluru 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uluru 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "style_derive"
@@ -3593,17 +3881,17 @@ dependencies = [
  "tokio-reactor 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "tokio-threadpool"
 version = "0.1.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3666,20 +3954,20 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "typenum"
 version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "uluru"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "unicase"
 version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3844,17 +4132,17 @@ name = "webrender"
 version = "0.60.0"
 dependencies = [
  "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3882,17 +4170,17 @@ dependencies = [
 [[package]]
 name = "webrender_api"
 version = "0.60.0"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "peek-poke 0.2.0",
  "serde 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3901,17 +4189,17 @@ dependencies = [
 
 [[package]]
 name = "webrender_bindings"
 version = "0.1.0"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
  "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3942,16 +4230,50 @@ dependencies = [
 name = "weedle"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "wgpu-native"
+version = "0.4.0"
+dependencies = [
+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-backend-dx11 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-backend-dx12 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-backend-empty 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-backend-metal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-backend-vulkan 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rendy-descriptor 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rendy-memory 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)",
+ "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "wgpu-remote"
+version = "0.1.0"
+dependencies = [
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wgpu-native 0.4.0",
+]
+
+[[package]]
 name = "winapi"
 version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "winapi"
 version = "0.3.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3996,16 +4318,24 @@ dependencies = [
 name = "winreg"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "wio"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "wr_malloc_size_of"
 version = "0.0.1"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -4030,16 +4360,25 @@ name = "ws2_32-sys"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "x11"
+version = "2.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "xfailure"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "xml-rs"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4116,81 +4455,89 @@ dependencies = [
 
 [metadata]
 "checksum Inflector 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
 "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
 "checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
 "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
 "checksum app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dadc668390b373e73e4abbfc1f07238b09a25858f2f39c06cebc6d8e141d774"
 "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
-"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba"
+"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
+"checksum ash 0.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "003d1fb2eb12eb06d4a03dbe02eea67a9fac910fa97932ab9e3a75b96a1ea5e5"
+"checksum atom 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3c86699c3f02778ec07158376991c8f783dd1f2f95c579ffaf0738dc984b2fe2"
 "checksum atomic 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c210c1f4db048cda477b652d170572d84c9640695835f17663595d3bd543fc28"
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
 "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
 "checksum audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)" = "197b2d259505d11c92d266e1784f01cc935eb764d2f54e16aedf4e5085197871"
 "checksum authenticator 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ec149e5d5d4caa2c9ead53a8ce1ea9c4204c388c65bf3b96c2d1dc0fcf4aeb66"
 "checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"
-"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
+"checksum backtrace 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)" = "690a62be8920ccf773ee00ef0968649b0e724cda8bd5b12286302b4ae955fdf5"
 "checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
 "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ab639324e3ee8774d296864fbc0dbbb256cf1a41c490b94cba90c082915f92"
 "checksum bindgen 0.51.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebd71393f1ec0509b553aa012b9b58e81dadbdff7130bd3b8cba576e69b32f75"
 "checksum binjs_meta 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6c9a0da2208ceb785c1626fa8b7d250d2e5546ae230294b4a998e4f818c1768e"
 "checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb"
 "checksum bit_reverse 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5e97e02db5a2899c0377f3d6031d5da8296ca2b47abef6ed699de51b9e40a28c"
 "checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
-"checksum blake2b_simd 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5850aeee1552f495dd0250014cf64b82b7c8879a89d83b33bbdace2cc4f63182"
+"checksum blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b83b7baab1e671718d78204225800d6b170e648188ac7dc992e9d6bddf87d0c0"
+"checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
 "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
 "checksum block-padding 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc4358306e344bf9775d0197fd00d2603e5afb0771bb353538630f022068ea3"
 "checksum boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8380105befe91099e6f69206164072c05bc92427ff6aa8a5171388317346dd75"
 "checksum byte-tools 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "980479e6fde23246dfb54d47580d66b4e99202e7579c5eaa9fe10ecb5ebd2182"
 "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
 "checksum bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e178b8e0e239e844b083d5a0d4a156b2654e67f9f80144d48398fcd736a24fb8"
 "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427"
-"checksum cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "30f813bf45048a18eda9190fd3c6b78644146056740c43172a5a3699118588fd"
+"checksum cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8"
 "checksum cexpr 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8fc0086be9ca82f7fc89fc873435531cb898b86e850005850de1f820e2db6e9b"
 "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
 "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
 "checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853"
 "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536"
 "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
 "checksum cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "56d741ea7a69e577f6d06b36b7dff4738f680593dc27a701ffa8506b73ce28bb"
+"checksum cocoa 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cd20045e880893b4a8286d5639e9ade85fb1f6a14c291f882cf8cf2149d37d9"
+"checksum colorful 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0bca1619ff57dd7a56b58a8e25ef4199f123e78e503fe1653410350a1b98ae65"
 "checksum comedy 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4f03fbb05a4df3523a44cda10340e6ae6bea03ee9d01240a1a2c1ef6c73e95"
 "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
 "checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+"checksum copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff9c56c9fb2a49c05ef0e431485a22400af20d33226dc0764d891d09e724127"
 "checksum core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2640d6d0bf22e82bed1b73c6aef8d5dd31e5abe6666c57e6d45e2649f4f887"
 "checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
-"checksum core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "62ceafe1622ffc9a332199096841d0ff9912ec8cf8f9cde01e254a7d5217cd10"
+"checksum core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9"
 "checksum core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3f46450d6f2397261af420b4ccce23807add2e45fa206410a03d66fb7f050ae"
 "checksum coreaudio-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e8f5954c1c7ccb55340443e8b29fca24013545a5e7d72c1ca7db4fc02b982ce"
 "checksum cose 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "72fa26cb151d3ae4b70f63d67d0fed57ce04220feafafbae7f503bef7aae590d"
 "checksum cose-c 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "49726015ab0ca765144fcca61e4a7a543a16b795a777fa53f554da2fffff9a94"
 "checksum cranelift-bforest 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum cranelift-codegen 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum cranelift-codegen-meta 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum cranelift-codegen-shared 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum cranelift-entity 0.41.0 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)" = "<none>"
 "checksum cranelift-entity 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum cranelift-frontend 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum cranelift-wasm 0.46.1 (git+https://github.com/CraneStation/Cranelift?rev=da179e4fd83d49b7ad6c9f286b1ea04d4f64907e)" = "<none>"
 "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
-"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71"
-"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9"
+"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
+"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
 "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
 "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c"
+"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
 "checksum cssparser 0.25.9 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe18ca4efb9ba3716c6da66cc3d7e673bf59fa576353011f48c4cfddbdd740e"
 "checksum cssparser-macros 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5bb1c84e87c717666564ec056105052331431803d606bd45529b28547b611eef"
 "checksum cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b6557bdb1dc9647eae1cf7f5601b14cd45fc3c7ccf2df618387416fe542da6ea"
 "checksum cstr-macros 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "cd670e5ff58768ef624207fb95709ce63b8d05573fb9a05165f0eef471ea6a3a"
 "checksum cubeb 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3cbcdfde9ea319160af6eff068ffaa96aad3532e1b5c0ebc134614cfacacae24"
 "checksum cubeb-backend 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a1e7add4e7642a8aebb24172922318482bed52389a12cb339f728bbd4c4ed9c"
 "checksum cubeb-core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfd9b2ea1cb6afed9419b0d18fc4093df552ccb2300eb57793629f8cd370b4c8"
 "checksum cubeb-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "309c5839c5fa03c08363bd308566cbe4654b25a9984342d7546a33d55b80a3d6"
+"checksum d3d12 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc7ed48e89905e5e146bcc1951cc3facb9e44aea9adf5dc01078cda1bd24b662"
 "checksum darling 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe629a532efad5526454efb0700f86d5ad7ff001acb37e431c8bf017a432a8e"
 "checksum darling_core 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ee54512bec54b41cf2337a22ddfadb53c7d4c738494dc2a186d7b037ad683b85"
 "checksum darling_macro 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cd3e432e52c0810b72898296a69d66b1d78d1517dff6cde7a130557a55a62c1"
 "checksum dbus 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e1b39f3f6aa3d4a1522c4f0f9f1e9e9167bd93740a8690874caa7cf8ce47d7"
 "checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86"
 "checksum derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f57d78cf3bd45270dad4e70c21ec77a960b36c7a841ff9db76aaa775a8fb871"
 "checksum devd-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d009f166c0d9e9f9909dc751630b3a6411ab7f85a153d32d01deb364ffe52a7"
 "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c"
@@ -4218,25 +4565,33 @@ dependencies = [
 "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
 "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
 "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
 "checksum futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "884dbe32a6ae4cd7da5c6db9b78114449df9953b8d490c9d7e1b51720b922c62"
 "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
 "checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
 "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592"
 "checksum getrandom 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8d1dffef07351aafe6ef177e4dd2b8dcf503e6bc765dea3b0de9ed149a3db1ec"
+"checksum gfx-auxil 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572eee952a9a23c99cfe3e4fd95d277784058a89ac3c77ff6fa3d80a4e321919"
+"checksum gfx-backend-dx11 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c66c77836ff26cf9916e5c8745715a22eae1fc61d994ffa0bea8a7dbd708ece2"
+"checksum gfx-backend-dx12 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6e913cc800fb12eaba2c420091a02aca9aafbefd672600dfc5b52654343d341"
+"checksum gfx-backend-empty 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d383e6bc48867cb37d298a20139fd1eec298f8f6d594690cd1c50ef25470cc7"
+"checksum gfx-backend-metal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8de5c71f18ba805c95b84d6c78c472ef44485a6fc46e3b49fe1e6739c8d7b0c0"
+"checksum gfx-backend-vulkan 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62538fedd66a78968a162e8e1a29d085ffbc97f8782634684b2f7da7aea59207"
+"checksum gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "977716fea7800ab5bc9a1e048dd2f72b23af166d8c2f48c6fb6d1ce37d77ca7e"
 "checksum gl_generator 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39a23d5e872a275135d66895d954269cf5e8661d234eb1c2480f4ce0d586acbd"
 "checksum gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7f46fd8874e043ffac0d638ed1567a2584f7814f6d72b4db37ab1689004a26c4"
 "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
 "checksum goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "e3fa261d919c1ae9d1e4533c4a2f99e10938603c4208d56c05bec7a872b661b0"
 "checksum guid_win 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87261686cc5e35b6584f4c2a430c2b153d8a92ab1ef820c16be34c1df8f5f58b"
 "checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c"
 "checksum headers 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6e2e51d356081258ef05ff4c648138b5d3fe64b7300aaad3b820554a2b7fb6"
 "checksum headers-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "967131279aaa9f7c20c7205b45a391638a83ab118e6509b2d0ccbe08de044237"
 "checksum headers-derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f33cf300c485e3cbcba0235013fcc768723451c9b84d1b31aa7fec0491ac9a11"
+"checksum hibitset 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47e7292fd9f7fe89fa35c98048f2d0a69b79ed243604234d18f6f8a1aa6f408d"
 "checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a"
 "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83"
 "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
 "checksum hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)" = "f1ebec079129e43af5e234ef36ee3d7e6085687d145b7ea653b262d16c6b65f1"
 "checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa"
 "checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
 "checksum image 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)" = "663a975007e0b49903e2e8ac0db2c432c465855f2d65f17883ba1476e85f0b42"
 "checksum indexmap 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4d6d89e0948bf10c08b9ecc8ac5b83f07f857ebe2c0cbe38de15b4e4f510356"
@@ -4261,22 +4616,24 @@ dependencies = [
 "checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc"
 "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
 "checksum lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)" = "<none>"
 "checksum lucet-runtime 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)" = "<none>"
 "checksum lucet-runtime-internals 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)" = "<none>"
 "checksum lucet-wasi 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)" = "<none>"
 "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
 "checksum mach 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
+"checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
 "checksum malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35adee9ed962cf7d07d62cb58bc45029f3227f5b5b86246caa8632f06c187bc3"
 "checksum mapped_hyph 0.3.0 (git+https://github.com/jfkthame/mapped_hyph.git?tag=v0.3.0)" = "<none>"
 "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
 "checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"
 "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
 "checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
+"checksum metal 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddf8052f20601c7af6293d3f7bf7b9159aee5974804fe65d871d437f933ec1eb"
 "checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425"
 "checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
 "checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202"
 "checksum miniz_oxide 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7108aff85b876d06f22503dcce091e29f76733b2bfdd91eebce81f5e68203a10"
 "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23"
 "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40"
 "checksum mio-named-pipes 0.1.6 (git+https://github.com/alexcrichton/mio-named-pipes)" = "<none>"
 "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
@@ -4299,16 +4656,18 @@ dependencies = [
 "checksum num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1"
 "checksum num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2"
 "checksum num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c8b15b261814f992e33760b1fca9fe8b693d8a65299f20c9901688636cfb746"
 "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
 "checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
 "checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10"
 "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
 "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
+"checksum objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "31d20fd2b37e07cf5125be68357b588672e8cefe9a96f8c17a9d46053b3e590d"
+"checksum objc_exception 0.1.2 (git+https://github.com/kvark/rust-objc-exception?branch=cc)" = "<none>"
 "checksum object 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81afbc5773e99efe9533d8a539dfac37e531dcd0f4eeb41584bae03ccf76d4c2"
 "checksum once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "891f486f630e5c5a4916c7e16c4b24a53e78c860b646e9f8e005e4f16847bfed"
 "checksum opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "51ecbcb821e1bd256d456fe858aaa7f380b63863eab2eb86eee1bd9f33dd6682"
 "checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2"
 "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13"
 "checksum packed_simd 0.3.3 (git+https://github.com/hsivonen/packed_simd?branch=rust_1_32)" = "<none>"
 "checksum parity-wasm 0.40.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1e39faaa292a687ea15120b1ac31899b13586446521df6c149e46f1584671e0f"
 "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
@@ -4339,25 +4698,30 @@ dependencies = [
 "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
 "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
 "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4"
 "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08"
 "checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b"
 "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
 "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
 "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+"checksum range-alloc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd5927936723a9e8b715d37d7e4b390455087c4bdf25b9f702309460577b14f9"
+"checksum raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e815b85b31e4d397ca9dd8eb1d692e9cb458b9f6ae8ac2232c995dca8236f87"
 "checksum rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123"
 "checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b"
 "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
 "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
 "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
 "checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d"
 "checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad"
 "checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
+"checksum relevant 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bbc232e13d37f4547f5b9b42a5efc380cabe5dbc1807f8b893580640b2ab0308"
 "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
+"checksum rendy-descriptor 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f475bcc0505946e998590f1f0545c52ef4b559174a1b353a7ce6638def8b621e"
+"checksum rendy-memory 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08f99de535d9e48d9cfab780b521702cc0d7183d354872d223967b75abae1199"
 "checksum ringbuf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "588456c74d5ff0a5806bc084818e043e767533f743c11ee6f3ccf298599c6847"
 "checksum rkv 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9aab7c645d32e977e186448b0a5c2c3139a91a7f630cfd8a8c314d1d145e78bf"
 "checksum rlbox_lucet_sandbox 0.1.0 (git+https://github.com/PLSysSec/rlbox_lucet_sandbox/?rev=997c648eb0eaeaaa7a00a9eee20431f750b4e190)" = "<none>"
 "checksum ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "da06feaa07f69125ab9ddc769b11de29090122170b402547f64b86fe16ebc399"
 "checksum runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d79b4b604167921892e84afbbaad9d5ad74e091bf6c511d9dbfb0593f09fabd"
 "checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf"
 "checksum rust-ini 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8a654c5bda722c699be6b0fe4c0d90de218928da5b724c3e467fc48865c37263"
 "checksum rust_cascade 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f3fe4900d38dab1ad21a515e44687dd0711e6b0ec5b214a3b1aa8857343bcf3a"
@@ -4380,26 +4744,29 @@ dependencies = [
 "checksum serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "45af0182ff64abaeea290235eb67da3825a576c5d53e642c4d5b652e12e6effc"
 "checksum serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)" = "beed18e6f5175aef3ba670e57c60ef3b1b74d250d962a26604bff4c80e970dd4"
 "checksum serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "44dd2cfde475037451fa99b7e5df77aa3cfd1536575fa8e7a538ab36dcde49ae"
 "checksum serde_repr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "29a734c298df0346c4cd5919595981c266dabbf12dc747c85e1a95e96077a52b"
 "checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97"
 "checksum serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)" = "38b08a9a90e5260fe01c6480ec7c811606df6d3a660415808c3c3fa8ed95b582"
 "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68"
 "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d"
+"checksum shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11"
 "checksum shift_or_euc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f930dea4685b9803954b9d74cdc175c6d946a22f2eafe5aa2e9a58cdcae7da8c"
 "checksum shift_or_euc_c 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c81ec08c8a68c45c48d8ef58b80ce038cc9945891c4a4996761e2ec5cba05abc"
 "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
 "checksum siphasher 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2ffc669b726f2bc9a3bcff66e5e23b56ba6bf70e22a34c3d7b6d0b3450b65b84"
 "checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d"
 "checksum slice-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31ef6ee280cdefba6d2d0b4b78a84a1c1a3f3a4cec98c2d4231c8bc225de0f25"
 "checksum smallbitvec 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1764fe2b30ee783bfe3b9b37b2649d8d590b3148bb12e0079715d4d5c673562e"
 "checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7"
 "checksum socket2 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df028e0e632c2a1823d920ad74895e7f9128e6438cbc4bc6fd1f180e644767b9"
+"checksum spirv_cross 0.16.0 (git+https://github.com/kvark/spirv_cross?branch=wgpu)" = "<none>"
 "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b"
+"checksum storage-map 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0a4829a5c591dc24a944a736d6b1e4053e51339a79fd5d4702c4c999a9c45e"
 "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970"
 "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
 "checksum svg_fmt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c666f0fed8e1e20e057af770af9077d72f3d5a33157b8537c1475dd8ffd6d32b"
 "checksum syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)" = "66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2"
 "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
 "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
 "checksum synstructure 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f085a5855930c0441ca1288cf044ea4aecf4f43a91668abdb870b4ba546a203"
 "checksum target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7975cb2c6f37d77b190bc5004a2bb015971464756fde9514651a525ada2a741a"
@@ -4425,17 +4792,17 @@ dependencies = [
 "checksum tokio-tcp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5b4c329b47f071eb8a746040465fa751bd95e4716e98daef6a9b4e434c17d565"
 "checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2"
 "checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e"
 "checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0"
 "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445"
 "checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
 "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
 "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169"
-"checksum uluru 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2606e9192f308ddc4f0b3c5d1bf3400e28a70fff956e9d9f46d23b094746d9f"
+"checksum uluru 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d7b39d0c32eba57d52d334e4bdd150df6e755264eefaa1ae2e7cd125f35e1ca"
 "checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6"
 "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
 "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
 "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
 "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
 "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
 "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
 "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
@@ -4456,14 +4823,16 @@ dependencies = [
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
 "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 "checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9"
 "checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a"
+"checksum wio 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
 "checksum ws 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6f5bb86663ff4d1639408410f50bf6050367a8525d644d49a6894cd618a631"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+"checksum x11 2.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39697e3123f715483d311b5826e254b6f3cfebdd83cf7ef3358f579c3d68e235"
 "checksum xfailure 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da90eac47bf1d7871b75004b9b631d107df15f37669383b23f0b5297bc7516b6"
 "checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"
 "checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e"
 "checksum zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "36b9e08fb518a65cf7e08a1e482573eb87a2f4f8c6619316612a3c1f162fe822"
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -58,16 +58,18 @@ debug-assertions = false
 panic = "abort"
 codegen-units = 1
 
 [patch.crates-io]
 libudev-sys = { path = "dom/webauthn/libudev-sys" }
 packed_simd = { git = "https://github.com/hsivonen/packed_simd", branch = "rust_1_32" }
 rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/", rev="997c648eb0eaeaaa7a00a9eee20431f750b4e190" }
 nix = { git = "https://github.com/shravanrn/nix/", branch = "r0.13.1", rev="4af6c367603869a30fddb5ffb0aba2b9477ba92e" }
+spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu" }
+objc_exception = { git = "https://github.com/kvark/rust-objc-exception", branch = "cc" }
 
 [patch.crates-io.cranelift-codegen]
 git = "https://github.com/CraneStation/Cranelift"
 rev = "da179e4fd83d49b7ad6c9f286b1ea04d4f64907e"
 
 [patch.crates-io.cranelift-wasm]
 git = "https://github.com/CraneStation/Cranelift"
 rev = "da179e4fd83d49b7ad6c9f286b1ea04d4f64907e"
--- a/dom/base/nsGlobalWindowInner.cpp
+++ b/dom/base/nsGlobalWindowInner.cpp
@@ -835,17 +835,16 @@ class PromiseDocumentFlushedResolver fin
 
 //*****************************************************************************
 //***    nsGlobalWindowInner: Object Management
 //*****************************************************************************
 
 nsGlobalWindowInner::nsGlobalWindowInner(nsGlobalWindowOuter* aOuterWindow,
                                          WindowGlobalChild* aActor)
     : nsPIDOMWindowInner(aOuterWindow, aActor),
-      mozilla::webgpu::InstanceProvider(this),
       mWasOffline(false),
       mHasHadSlowScript(false),
       mIsChrome(false),
       mCleanMessageManager(false),
       mNeedsFocus(true),
       mHasFocus(false),
       mShowFocusRingForContent(false),
       mFocusByKeyOccurred(false),
@@ -1392,18 +1391,16 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_
 
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPendingPromises)
 
   for (size_t i = 0; i < tmp->mDocumentFlushedResolvers.Length(); i++) {
     NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocumentFlushedResolvers[i]->mPromise);
     NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocumentFlushedResolvers[i]->mCallback);
   }
 
-  static_cast<mozilla::webgpu::InstanceProvider*>(tmp)->CcTraverse(cb);
-
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindowInner)
   JSObject* wrapper = tmp->GetWrapperPreserveColor();
   if (wrapper) {
     // Mark our realm as dead, so the JS engine won't hand out our
     // global after this point.
     JS::RealmBehaviorsRef(js::GetNonCCWObjectRealm(wrapper)).setNonLive();
@@ -1508,18 +1505,16 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ns
 
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mPendingPromises)
   for (size_t i = 0; i < tmp->mDocumentFlushedResolvers.Length(); i++) {
     NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocumentFlushedResolvers[i]->mPromise);
     NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocumentFlushedResolvers[i]->mCallback);
   }
   tmp->mDocumentFlushedResolvers.Clear();
 
-  static_cast<mozilla::webgpu::InstanceProvider*>(tmp)->CcUnlink();
-
   NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 #ifdef DEBUG
 void nsGlobalWindowInner::RiskyUnlink() {
   NS_CYCLE_COLLECTION_INNERNAME.Unlink(this);
 }
 #endif
--- a/dom/base/nsGlobalWindowInner.h
+++ b/dom/base/nsGlobalWindowInner.h
@@ -42,17 +42,16 @@
 #include "mozilla/dom/StorageEventBinding.h"
 #include "mozilla/dom/UnionTypes.h"
 #include "mozilla/ErrorResult.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/GuardObjects.h"
 #include "mozilla/LinkedList.h"
 #include "mozilla/OwningNonNull.h"
 #include "mozilla/TimeStamp.h"
-#include "mozilla/webgpu/InstanceProvider.h"
 #include "nsWrapperCacheInlines.h"
 #include "mozilla/dom/Document.h"
 #include "mozilla/dom/EventTarget.h"
 #include "mozilla/dom/WindowBinding.h"
 #include "mozilla/dom/WindowProxyHolder.h"
 #include "Units.h"
 #include "nsComponentManagerUtils.h"
 #include "nsSize.h"
@@ -176,18 +175,17 @@ class nsGlobalWindowInner final : public
     // implemented on chrome windows.
     ,
                                   private nsIDOMChromeWindow,
                                   public nsIScriptGlobalObject,
                                   public nsIScriptObjectPrincipal,
                                   public nsSupportsWeakReference,
                                   public nsIInterfaceRequestor,
                                   public PRCListStr,
-                                  public nsAPostRefreshObserver,
-                                  public mozilla::webgpu::InstanceProvider {
+                                  public nsAPostRefreshObserver {
  public:
   typedef mozilla::dom::BrowsingContext RemoteProxy;
 
   typedef mozilla::TimeStamp TimeStamp;
   typedef mozilla::TimeDuration TimeDuration;
 
   typedef nsDataHashtable<nsUint64HashKey, nsGlobalWindowInner*>
       InnerWindowByIdTable;
--- a/dom/webgpu/Adapter.cpp
+++ b/dom/webgpu/Adapter.cpp
@@ -1,20 +1,46 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/dom/WebGPUBinding.h"
 #include "Adapter.h"
 
+#include "Device.h"
 #include "Instance.h"
+#include "ipc/WebGPUChild.h"
+#include "mozilla/dom/Promise.h"
 
 namespace mozilla {
 namespace webgpu {
 
-GPU_IMPL_CYCLE_COLLECTION(Adapter, mParent)
+GPU_IMPL_CYCLE_COLLECTION(Adapter, mBridge, mParent)
 GPU_IMPL_JS_WRAP(Adapter)
 
+Adapter::Adapter(Instance* const aParent, RawId aId)
+    : ChildOf(aParent), mBridge(aParent->GetBridge()), mId(aId) {}
 Adapter::~Adapter() = default;
 
+WebGPUChild* Adapter::GetBridge() const { return mBridge; }
+
+already_AddRefed<dom::Promise> Adapter::RequestDevice(
+    const dom::GPUDeviceDescriptor& aDesc, ErrorResult& aRv) {
+  RefPtr<dom::Promise> promise = dom::Promise::Create(GetParentObject(), aRv);
+  if (NS_WARN_IF(aRv.Failed())) {
+    return nullptr;
+  }
+
+  Maybe<RawId> id = mBridge->AdapterRequestDevice(mId, aDesc);
+  if (id.isSome()) {
+    RefPtr<Device> device = new Device(this, id.value());
+    promise->MaybeResolve(device);
+  } else {
+    promise->MaybeRejectWithDOMException(NS_ERROR_DOM_NOT_SUPPORTED_ERR,
+                                         "Unable to instanciate a Device");
+  }
+
+  return promise.forget();
+}
+
 }  // namespace webgpu
 }  // namespace mozilla
--- a/dom/webgpu/Adapter.h
+++ b/dom/webgpu/Adapter.h
@@ -2,42 +2,51 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef GPU_Adapter_H_
 #define GPU_Adapter_H_
 
 #include "mozilla/AlreadyAddRefed.h"
+#include "mozilla/webgpu/WebGPUTypes.h"
 #include "nsString.h"
 #include "ObjectModel.h"
 
 namespace mozilla {
 namespace dom {
 class Promise;
 struct GPUDeviceDescriptor;
 struct GPUExtensions;
 struct GPUFeatures;
 }  // namespace dom
 
 namespace webgpu {
 class Device;
 class Instance;
+class WebGPUChild;
 
 class Adapter final : public ObjectBase, public ChildOf<Instance> {
  public:
   GPU_DECL_CYCLE_COLLECTION(Adapter)
   GPU_DECL_JS_WRAP(Adapter)
 
-  const nsString mName;
-
  private:
   Adapter() = delete;
   virtual ~Adapter();
 
+  const RefPtr<WebGPUChild> mBridge;
+  const RawId mId;
+  const nsString mName;
+
  public:
+  explicit Adapter(Instance* const aParent, RawId aId);
   void GetName(nsString& out) const { out = mName; }
+  WebGPUChild* GetBridge() const;
+
+  already_AddRefed<dom::Promise> RequestDevice(
+      const dom::GPUDeviceDescriptor& aDesc, ErrorResult& aRv);
 };
 
 }  // namespace webgpu
 }  // namespace mozilla
 
 #endif  // GPU_Adapter_H_
--- a/dom/webgpu/Device.cpp
+++ b/dom/webgpu/Device.cpp
@@ -2,25 +2,35 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/dom/WebGPUBinding.h"
 #include "Device.h"
 
 #include "Adapter.h"
+#include "ipc/WebGPUChild.h"
 
 namespace mozilla {
 namespace webgpu {
 
-NS_IMPL_CYCLE_COLLECTION_INHERITED(Device, DOMEventTargetHelper)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(Device, DOMEventTargetHelper, mBridge)
 NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(Device, DOMEventTargetHelper)
 GPU_IMPL_JS_WRAP(Device)
 
-Device::Device(nsIGlobalObject* aGlobal) : DOMEventTargetHelper(aGlobal) {}
+Device::Device(Adapter* const aParent, RawId aId)
+    : DOMEventTargetHelper(aParent->GetParentObject()),
+      mBridge(aParent->GetBridge()),
+      mId(aId) {
+  Unused << mId;  // TODO: remove
+}
 
-Device::~Device() = default;
+Device::~Device() {
+  if (mBridge->IsOpen()) {
+    mBridge->SendDeviceDestroy(mId);
+  }
+}
 
 void Device::GetLabel(nsAString& aValue) const { aValue = mLabel; }
 void Device::SetLabel(const nsAString& aLabel) { mLabel = aLabel; }
 
 }  // namespace webgpu
 }  // namespace mozilla
--- a/dom/webgpu/Device.h
+++ b/dom/webgpu/Device.h
@@ -2,17 +2,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef GPU_DEVICE_H_
 #define GPU_DEVICE_H_
 
 #include "mozilla/RefPtr.h"
-
+#include "mozilla/webgpu/WebGPUTypes.h"
 #include "mozilla/DOMEventTargetHelper.h"
 
 namespace mozilla {
 namespace dom {
 struct GPUExtensions;
 struct GPUFeatures;
 struct GPULimits;
 
@@ -50,32 +50,34 @@ class Fence;
 class InputState;
 class PipelineLayout;
 class Queue;
 class RenderBundleEncoder;
 class RenderPipeline;
 class Sampler;
 class ShaderModule;
 class Texture;
+class WebGPUChild;
 
 class Device final : public DOMEventTargetHelper {
  public:
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Device, DOMEventTargetHelper)
   GPU_DECL_JS_WRAP(Device)
 
-  explicit Device(nsIGlobalObject* aGlobal);
-
  private:
   Device() = delete;
   virtual ~Device();
 
+  const RefPtr<WebGPUChild> mBridge;
+  const RawId mId;
   nsString mLabel;
 
  public:
+  explicit Device(Adapter* const aParent, RawId aId);
   void GetLabel(nsAString& aValue) const;
   void SetLabel(const nsAString& aLabel);
 
   // IMPL_EVENT_HANDLER(uncapturederror)
 };
 
 }  // namespace webgpu
 }  // namespace mozilla
--- a/dom/webgpu/Instance.cpp
+++ b/dom/webgpu/Instance.cpp
@@ -1,32 +1,78 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "Instance.h"
 
 #include "Adapter.h"
-#include "InstanceProvider.h"
+#include "gfxConfig.h"
 #include "nsIGlobalObject.h"
+#include "ipc/WebGPUChild.h"
+#include "ipc/WebGPUTypes.h"
+#include "mozilla/layers/CompositorBridgeChild.h"
 
 namespace mozilla {
 namespace webgpu {
 
-GPU_IMPL_CYCLE_COLLECTION(Instance, mParent)
+GPU_IMPL_CYCLE_COLLECTION(Instance, mBridge, mOwner)
 
 /*static*/
-RefPtr<Instance> Instance::Create(nsIGlobalObject* parent) {
-  return new Instance(parent);
+already_AddRefed<Instance> Instance::Create(nsIGlobalObject* aOwner) {
+  if (!gfx::gfxConfig::IsEnabled(gfx::Feature::WEBGPU)) {
+    return nullptr;
+  }
+
+  RefPtr<WebGPUChild> bridge =
+      layers::CompositorBridgeChild::Get()->GetWebGPUChild();
+  if (NS_WARN_IF(!bridge)) {
+    MOZ_CRASH("Failed to create an IPDL bridge for WebGPU!");
+  }
+
+  RefPtr<Instance> result = new Instance(aOwner, bridge);
+  return result.forget();
 }
 
-Instance::Instance(nsIGlobalObject* parent) : mParent(parent) {}
+Instance::Instance(nsIGlobalObject* aOwner, WebGPUChild* aBridge)
+    : mOwner(aOwner), mBridge(aBridge) {}
 
 Instance::~Instance() = default;
 
 JSObject* Instance::WrapObject(JSContext* cx,
                                JS::Handle<JSObject*> givenProto) {
   return dom::GPU_Binding::Wrap(cx, this, givenProto);
 }
 
+WebGPUChild* Instance::GetBridge() const { return mBridge; }
+
+already_AddRefed<dom::Promise> Instance::RequestAdapter(
+    const dom::GPURequestAdapterOptions& aOptions, ErrorResult& aRv) {
+  RefPtr<dom::Promise> promise = dom::Promise::Create(mOwner, aRv);
+  if (NS_WARN_IF(aRv.Failed())) {
+    return nullptr;
+  }
+
+  RefPtr<Instance> instance = this;
+
+  mBridge->InstanceRequestAdapter(aOptions)->Then(
+      GetMainThreadSerialEventTarget(), __func__,
+      [promise, instance](RawId id) {
+        MOZ_ASSERT(id != 0);
+        RefPtr<Adapter> adapter = new Adapter(instance, id);
+        promise->MaybeResolve(adapter);
+      },
+      [promise](const Maybe<ipc::ResponseRejectReason>& aRv) {
+        if (aRv.isSome()) {
+          promise->MaybeRejectWithDOMException(NS_ERROR_DOM_ABORT_ERR,
+                                               "Internal communication error!");
+        } else {
+          promise->MaybeRejectWithDOMException(NS_ERROR_DOM_INVALID_STATE_ERR,
+                                               "No matching adapter found!");
+        }
+      });
+
+  return promise.forget();
+}
+
 }  // namespace webgpu
 }  // namespace mozilla
--- a/dom/webgpu/Instance.h
+++ b/dom/webgpu/Instance.h
@@ -14,31 +14,37 @@
 namespace mozilla {
 namespace dom {
 class Promise;
 struct GPURequestAdapterOptions;
 }  // namespace dom
 
 namespace webgpu {
 class Adapter;
-class InstanceProvider;
+class GPUAdapter;
+class WebGPUChild;
 
 class Instance final : public nsWrapperCache {
  public:
   GPU_DECL_CYCLE_COLLECTION(Instance)
   GPU_DECL_JS_WRAP(Instance)
 
-  nsCOMPtr<nsIGlobalObject> mParent;
+  static already_AddRefed<Instance> Create(nsIGlobalObject* aOwner);
 
-  static RefPtr<Instance> Create(nsIGlobalObject* parent);
+  already_AddRefed<dom::Promise> RequestAdapter(
+      const dom::GPURequestAdapterOptions& aOptions, ErrorResult& aRv);
 
  private:
-  explicit Instance(nsIGlobalObject* parent);
+  explicit Instance(nsIGlobalObject* aOwner, WebGPUChild* aBridge);
   virtual ~Instance();
 
+  nsCOMPtr<nsIGlobalObject> mOwner;
+  const RefPtr<WebGPUChild> mBridge;
+
  public:
-  nsIGlobalObject* GetParentObject() const { return mParent.get(); }
+  nsIGlobalObject* GetParentObject() const { return mOwner; }
+  WebGPUChild* GetBridge() const;
 };
 
 }  // namespace webgpu
 }  // namespace mozilla
 
 #endif  // GPU_INSTANCE_H_
deleted file mode 100644
--- a/dom/webgpu/InstanceProvider.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "InstanceProvider.h"
-
-#include "Instance.h"
-
-namespace mozilla {
-namespace webgpu {
-
-InstanceProvider::InstanceProvider(nsIGlobalObject* const global)
-    : mGlobal(global) {}
-
-InstanceProvider::~InstanceProvider() = default;
-
-already_AddRefed<Instance> InstanceProvider::Webgpu() const {
-  if (!mInstance) {
-    const auto inst = Instance::Create(mGlobal);
-    mInstance = Some(inst);
-  }
-  auto ret = mInstance.value();
-  return ret.forget();
-}
-
-void InstanceProvider::CcTraverse(
-    nsCycleCollectionTraversalCallback& callback) const {
-  if (mInstance) {
-    CycleCollectionNoteChild(callback, mInstance.ref().get(),
-                             "webgpu::InstanceProvider::mInstance", 0);
-  }
-}
-
-void InstanceProvider::CcUnlink() { mInstance = Some(nullptr); }
-
-}  // namespace webgpu
-}  // namespace mozilla
deleted file mode 100644
--- a/dom/webgpu/InstanceProvider.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef GPU_INSTANCE_PROVIDER_H_
-#define GPU_INSTANCE_PROVIDER_H_
-
-#include "mozilla/AlreadyAddRefed.h"
-#include "mozilla/Maybe.h"
-#include "mozilla/RefPtr.h"
-
-class nsCycleCollectionTraversalCallback;
-class nsIGlobalObject;
-
-namespace mozilla {
-namespace webgpu {
-class Instance;
-
-class InstanceProvider {
- private:
-  nsIGlobalObject* const mGlobal;
-  mutable Maybe<RefPtr<Instance>> mInstance;
-
- protected:
-  explicit InstanceProvider(nsIGlobalObject* global);
-  virtual ~InstanceProvider();
-
- public:
-  already_AddRefed<Instance> Webgpu() const;
-
-  nsIGlobalObject* GetParentObject() const { return mGlobal; }
-
-  void CcTraverse(nsCycleCollectionTraversalCallback&) const;
-  void CcUnlink();
-};
-
-template <typename T>
-void ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& callback,
-                                 const Maybe<T>& field, const char* name,
-                                 uint32_t flags) {
-  if (field) {
-    CycleCollectionNoteChild(callback, field.value(), name, flags);
-  }
-}
-
-template <typename T>
-void ImplCycleCollectionUnlink(Maybe<T>& field) {
-  field = Nothing();
-}
-
-}  // namespace webgpu
-}  // namespace mozilla
-
-#endif  // GPU_INSTANCE_PROVIDER_H_
--- a/dom/webgpu/ObjectModel.h
+++ b/dom/webgpu/ObjectModel.h
@@ -14,18 +14,18 @@ class nsIGlobalObject;
 namespace mozilla {
 namespace webgpu {
 
 template <typename T>
 class ChildOf {
  public:
   const RefPtr<T> mParent;
 
-  explicit ChildOf(
-      T* parent = nullptr);  // TODO: This can't be nullptr eventually.
+  explicit ChildOf(T* const parent);
+
  protected:
   virtual ~ChildOf();
 
  public:
   nsIGlobalObject* GetParentObject() const;
 };
 
 class ObjectBase : public nsWrapperCache {
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ffi/moz.build
@@ -0,0 +1,32 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXPORTS.mozilla.webgpu.ffi += [
+    'wgpu.h',
+]
+
+UNIFIED_SOURCES += [
+]
+
+if CONFIG['COMPILE_ENVIRONMENT']:
+    GENERATED_FILES += [
+        'wgpu_ffi_generated.h',
+    ]
+
+    EXPORTS.mozilla.webgpu.ffi += [
+        '!wgpu_ffi_generated.h',
+    ]
+
+    ffi_generated = GENERATED_FILES['wgpu_ffi_generated.h']
+    ffi_generated.script = '/layout/style/RunCbindgen.py:generate'
+    ffi_generated.inputs = [
+        '/dom/webgpu/wgpu-remote',
+    ]
+
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
+FINAL_LIBRARY = 'xul'
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ffi/wgpu.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WGPU_h
+#define WGPU_h
+
+// Prelude of types necessary before including wgpu_ffi_generated.h
+namespace mozilla {
+namespace webgpu {
+namespace ffi {
+
+#define WGPU_INLINE
+#define WGPU_FUNC
+#define WGPU_DESTRUCTOR_SAFE_FUNC
+
+extern "C" {
+#include "wgpu_ffi_generated.h"
+}
+
+#undef WGPU_INLINE
+#undef WGPU_FUNC
+#undef WGPU_DESTRUCTOR_SAFE_FUNC
+
+}  // namespace ffi
+}  // namespace webgpu
+}  // namespace mozilla
+
+#endif  // WGPU_h
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ipc/PWebGPU.ipdl
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: sw=2 ts=8 et :
+ */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+using RawId from "mozilla/webgpu/WebGPUTypes.h";
+using dom::GPURequestAdapterOptions from "mozilla/dom/WebGPUBinding.h";
+using dom::GPUDeviceDescriptor from "mozilla/dom/WebGPUBinding.h";
+
+include "mozilla/webgpu/WebGPUSerialize.h";
+include protocol PCompositorBridge;
+
+namespace mozilla {
+namespace webgpu {
+
+/**
+ * Represents the connection between a WebGPUChild actor that issues WebGPU
+ * command from the content process, and a WebGPUParent in the compositor
+ * process that runs the commands.
+ */
+async protocol PWebGPU
+{
+  manager PCompositorBridge;
+
+parent:
+  async InstanceRequestAdapter(GPURequestAdapterOptions options, RawId[] ids) returns (RawId adapterId);
+  async AdapterRequestDevice(RawId selfId, GPUDeviceDescriptor desc, RawId newId);
+  async DeviceDestroy(RawId selfId);
+  async Shutdown();
+
+child:
+  async __delete__();
+};
+
+} // webgpu
+} // mozilla
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ipc/WebGPUChild.cpp
@@ -0,0 +1,84 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WebGPUChild.h"
+#include "mozilla/dom/WebGPUBinding.h"
+#include "mozilla/webgpu/ffi/wgpu.h"
+
+namespace mozilla {
+namespace webgpu {
+
+NS_IMPL_CYCLE_COLLECTION(WebGPUChild)
+NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(WebGPUChild, AddRef)
+NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(WebGPUChild, Release)
+
+static ffi::WGPUClient* initialize() {
+  ffi::WGPUInfrastructure infra = ffi::wgpu_client_new();
+  return infra.client;
+}
+
+WebGPUChild::WebGPUChild() : mClient(initialize()), mIPCOpen(false) {}
+
+WebGPUChild::~WebGPUChild() {
+  if (mClient) {
+    ffi::wgpu_client_delete(mClient);
+  }
+}
+
+RefPtr<RawIdPromise> WebGPUChild::InstanceRequestAdapter(
+    const dom::GPURequestAdapterOptions& aOptions) {
+  const int max_ids = 10;
+  RawId ids[max_ids] = {0};
+  unsigned long count =
+      ffi::wgpu_client_make_adapter_ids(mClient, ids, max_ids);
+
+  auto client = mClient;
+  nsTArray<RawId> sharedIds;
+  for (unsigned long i = 0; i != count; ++i) {
+    sharedIds.AppendElement(ids[i]);
+  }
+
+  return SendInstanceRequestAdapter(aOptions, sharedIds)
+      ->Then(
+          GetCurrentThreadSerialEventTarget(), __func__,
+          [client, ids, count](const RawId& aId) {
+            if (aId == 0) {
+              ffi::wgpu_client_kill_adapter_ids(client, ids, count);
+              return RawIdPromise::CreateAndReject(Nothing(), __func__);
+            } else {
+              // find the position in the list
+              unsigned int i = 0;
+              while (ids[i] != aId) {
+                i++;
+              }
+              if (i > 0) {
+                ffi::wgpu_client_kill_adapter_ids(client, ids, i);
+              }
+              if (i + 1 < count) {
+                ffi::wgpu_client_kill_adapter_ids(client, ids + i + 1,
+                                                  count - i - 1);
+              }
+              return RawIdPromise::CreateAndResolve(aId, __func__);
+            }
+          },
+          [client, ids, count](const ipc::ResponseRejectReason& aReason) {
+            ffi::wgpu_client_kill_adapter_ids(client, ids, count);
+            return RawIdPromise::CreateAndReject(Some(aReason), __func__);
+          });
+}
+
+Maybe<RawId> WebGPUChild::AdapterRequestDevice(
+    RawId aSelfId, const dom::GPUDeviceDescriptor& aDesc) {
+  RawId id = ffi::wgpu_client_make_device_id(mClient, aSelfId);
+  if (SendAdapterRequestDevice(aSelfId, aDesc, id)) {
+    return Some(id);
+  } else {
+    ffi::wgpu_client_kill_device_id(mClient, id);
+    return Nothing();
+  }
+}
+
+}  // namespace webgpu
+}  // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ipc/WebGPUChild.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WEBGPU_CHILD_H_
+#define WEBGPU_CHILD_H_
+
+#include "mozilla/webgpu/PWebGPUChild.h"
+#include "mozilla/MozPromise.h"
+
+namespace mozilla {
+namespace dom {
+struct GPURequestAdapterOptions;
+}  // namespace dom
+namespace layers {
+class CompositorBridgeChild;
+}  // namespace layers
+namespace webgpu {
+namespace ffi {
+struct WGPUClient;
+}  // namespace ffi
+
+typedef MozPromise<RawId, Maybe<ipc::ResponseRejectReason>, true> RawIdPromise;
+
+class WebGPUChild final : public PWebGPUChild {
+ public:
+  friend class layers::CompositorBridgeChild;
+
+  NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(WebGPUChild)
+  NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebGPUChild)
+
+ public:
+  explicit WebGPUChild();
+
+  bool IsOpen() const { return mIPCOpen; }
+  RefPtr<RawIdPromise> InstanceRequestAdapter(
+      const dom::GPURequestAdapterOptions& aOptions);
+  Maybe<RawId> AdapterRequestDevice(RawId aSelfId,
+                                    const dom::GPUDeviceDescriptor& aDesc);
+
+ private:
+  virtual ~WebGPUChild();
+
+  // AddIPDLReference and ReleaseIPDLReference are only to be called by
+  // CompositorBridgeChild's AllocPWebGPUChild and DeallocPWebGPUChild methods
+  // respectively. We intentionally make them private to prevent misuse.
+  // The purpose of these methods is to be aware of when the IPC system around
+  // this actor goes down: mIPCOpen is then set to false.
+  void AddIPDLReference() {
+    MOZ_ASSERT(!mIPCOpen);
+    mIPCOpen = true;
+    AddRef();
+  }
+  void ReleaseIPDLReference() {
+    MOZ_ASSERT(mIPCOpen);
+    mIPCOpen = false;
+    Release();
+  }
+
+  ffi::WGPUClient* const mClient;
+  bool mIPCOpen;
+};
+
+}  // namespace webgpu
+}  // namespace mozilla
+
+#endif  // WEBGPU_CHILD_H_
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ipc/WebGPUParent.cpp
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WebGPUParent.h"
+#include "mozilla/webgpu/ffi/wgpu.h"
+
+namespace mozilla {
+namespace webgpu {
+
+WebGPUParent::WebGPUParent() : mContext(ffi::wgpu_server_new()) {}
+
+WebGPUParent::~WebGPUParent() = default;
+
+ipc::IPCResult WebGPUParent::RecvInstanceRequestAdapter(
+    const dom::GPURequestAdapterOptions& aOptions,
+    const nsTArray<RawId>& aTargetIds,
+    InstanceRequestAdapterResolver&& resolver) {
+  ffi::WGPURequestAdapterOptions options = {};
+  if (aOptions.mPowerPreference.WasPassed()) {
+    options.power_preference = static_cast<ffi::WGPUPowerPreference>(
+        aOptions.mPowerPreference.Value());
+  }
+  // TODO: make available backends configurable by prefs
+
+  int8_t index = ffi::wgpu_server_instance_request_adapter(
+      mContext, &options, aTargetIds.Elements(), aTargetIds.Length());
+  if (index >= 0) {
+    resolver(aTargetIds[index]);
+  } else {
+    resolver(0);
+  }
+  return IPC_OK();
+}
+
+ipc::IPCResult WebGPUParent::RecvAdapterRequestDevice(
+    RawId aSelfId, const dom::GPUDeviceDescriptor& aOptions, RawId aNewId) {
+  ffi::WGPUDeviceDescriptor desc = {};
+  // TODO: fill up the descriptor
+
+  ffi::wgpu_server_adapter_request_device(mContext, aSelfId, &desc, aNewId);
+  return IPC_OK();
+}
+
+ipc::IPCResult WebGPUParent::RecvDeviceDestroy(RawId aSelfId) {
+  ffi::wgpu_server_device_destroy(mContext, aSelfId);
+  return IPC_OK();
+}
+
+ipc::IPCResult WebGPUParent::RecvShutdown() {
+  ffi::wgpu_server_delete(const_cast<ffi::WGPUGlobal*>(mContext));
+  return IPC_OK();
+}
+
+}  // namespace webgpu
+}  // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ipc/WebGPUParent.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WEBGPU_PARENT_H_
+#define WEBGPU_PARENT_H_
+
+#include "mozilla/webgpu/PWebGPUParent.h"
+#include "WebGPUTypes.h"
+
+namespace mozilla {
+namespace webgpu {
+namespace ffi {
+struct WGPUGlobal;
+}  // namespace ffi
+
+class WebGPUParent final : public PWebGPUParent {
+  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebGPUParent)
+
+ public:
+  explicit WebGPUParent();
+
+  ipc::IPCResult RecvInstanceRequestAdapter(
+      const dom::GPURequestAdapterOptions& aOptions,
+      const nsTArray<RawId>& aTargetIds,
+      InstanceRequestAdapterResolver&& resolver);
+  ipc::IPCResult RecvAdapterRequestDevice(RawId aSelfId,
+                                          const dom::GPUDeviceDescriptor& aDesc,
+                                          RawId aNewId);
+  ipc::IPCResult RecvDeviceDestroy(RawId aSelfId);
+  ipc::IPCResult RecvShutdown();
+
+ private:
+  virtual ~WebGPUParent();
+
+  const ffi::WGPUGlobal* const mContext;
+};
+
+}  // namespace webgpu
+}  // namespace mozilla
+
+#endif  // WEBGPU_PARENT_H_
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/ipc/WebGPUSerialize.h
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WEBGPU_SERIALIZE_H_
+#define WEBGPU_SERIALIZE_H_
+
+#include "WebGPUTypes.h"
+#include "ipc/IPCMessageUtils.h"
+#include "mozilla/dom/WebGPUBinding.h"
+
+namespace IPC {
+
+#define DEFINE_IPC_SERIALIZER_ENUM(something)                    \
+  template <>                                                    \
+  struct ParamTraits<something>                                  \
+      : public ContiguousEnumSerializer<something, something(0), \
+                                        something::EndGuard_> {}
+
+DEFINE_IPC_SERIALIZER_ENUM(mozilla::dom::GPUPowerPreference);
+
+DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::GPURequestAdapterOptions,
+                                  mPowerPreference);
+DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::GPUExtensions,
+                                  mAnisotropicFiltering);
+DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::GPULimits, mMaxBindGroups);
+DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::GPUDeviceDescriptor,
+                                  mExtensions, mLimits);
+
+#undef DEFINE_IPC_SERIALIZER_ENUM
+
+}  // namespace IPC
+#endif  // WEBGPU_SERIALIZE_H_
copy from dom/webgpu/Adapter.cpp
copy to dom/webgpu/ipc/WebGPUTypes.h
--- a/dom/webgpu/Adapter.cpp
+++ b/dom/webgpu/ipc/WebGPUTypes.h
@@ -1,20 +1,18 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-#include "mozilla/dom/WebGPUBinding.h"
-#include "Adapter.h"
-
-#include "Instance.h"
+#ifndef WEBGPU_TYPES_H_
+#define WEBGPU_TYPES_H_
 
 namespace mozilla {
 namespace webgpu {
 
-GPU_IMPL_CYCLE_COLLECTION(Adapter, mParent)
-GPU_IMPL_JS_WRAP(Adapter)
-
-Adapter::~Adapter() = default;
+typedef uint64_t RawId;
 
 }  // namespace webgpu
+
 }  // namespace mozilla
+
+#endif  // WEBGPU_TYPES_H_
--- a/dom/webgpu/mochitest/mochitest.ini
+++ b/dom/webgpu/mochitest/mochitest.ini
@@ -1,6 +1,6 @@
 [DEFAULT]
 subsuite = webgl1-core
 prefs = dom.webgpu.enable=true
 
 [test_enabled.html]
-
+[test_device_creation.html]
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/mochitest/test_device_creation.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset='utf-8'>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<script>
+
+ok(SpecialPowers.getBoolPref('dom.webgpu.enable'), 'Pref should be enabled.');
+
+const func = async function() {
+  const adapter = await navigator.gpu.requestAdapter();
+  const device = await adapter.requestDevice();
+  ok(device !== undefined, 'device !== undefined');
+};
+
+SimpleTest.waitForExplicitFinish();
+func().finally(() => SimpleTest.finish());
+
+</script>
+</body>
+</html>
+
--- a/dom/webgpu/moz.build
+++ b/dom/webgpu/moz.build
@@ -8,34 +8,33 @@ with Files('**'):
     BUG_COMPONENT = ('Core', 'Graphics: WebGPU')
 
 MOCHITEST_MANIFESTS += [
     'mochitest/mochitest-no-pref.ini',
     'mochitest/mochitest.ini',
 ]
 
 DIRS += [
-    'thread',
+    'ffi',
 ]
 
 h_and_cpp = [
     'Adapter',
     'BindGroup',
     'BindGroupLayout',
     'Buffer',
     'CanvasContext',
     'CommandBuffer',
     'CommandEncoder',
     'ComputePassEncoder',
     'ComputePipeline',
     'Device',
     'DeviceLostInfo',
     'Fence',
     'Instance',
-    'InstanceProvider',
     'ObjectModel',
     'OutOfMemoryError',
     'PipelineLayout',
     'ProgrammablePassEncoder',
     'Queue',
     'RenderBundle',
     'RenderBundleEncoder',
     'RenderEncoderBase',
@@ -46,9 +45,27 @@ h_and_cpp = [
     'SwapChain',
     'Texture',
     'TextureView',
     'ValidationError',
 ]
 EXPORTS.mozilla.webgpu += [x + '.h' for x in h_and_cpp]
 UNIFIED_SOURCES += [x + '.cpp' for x in h_and_cpp]
 
+IPDL_SOURCES += [
+    'ipc/PWebGPU.ipdl',
+]
+
+EXPORTS.mozilla.webgpu += [
+    'ipc/WebGPUChild.h',
+    'ipc/WebGPUParent.h',
+    'ipc/WebGPUSerialize.h',
+    'ipc/WebGPUTypes.h',
+]
+
+UNIFIED_SOURCES += [
+    'ipc/WebGPUChild.cpp',
+    'ipc/WebGPUParent.cpp',
+]
+
+include('/ipc/chromium/chromium-config.mozbuild')
+
 FINAL_LIBRARY = 'xul'
deleted file mode 100644
--- a/dom/webgpu/thread/WebGPUThreading.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "WebGPUThreading.h"
-#include "mtransport/runnable_utils.h"
-
-namespace mozilla {
-namespace webgpu {
-
-static StaticRefPtr<WebGPUThreading> sWebGPUThread;
-
-WebGPUThreading::WebGPUThreading(base::Thread* aThread) : mThread(aThread) {}
-
-WebGPUThreading::~WebGPUThreading() { delete mThread; }
-
-// static
-void WebGPUThreading::Start() {
-  MOZ_ASSERT(NS_IsMainThread());
-  MOZ_ASSERT(!sWebGPUThread);
-
-  base::Thread* thread = new base::Thread("WebGPU");
-
-  base::Thread::Options options;
-  if (!thread->StartWithOptions(options)) {
-    delete thread;
-    return;
-  }
-
-  sWebGPUThread = new WebGPUThreading(thread);
-  const auto fnInit = []() {};
-
-  RefPtr<Runnable> runnable =
-      NS_NewRunnableFunction("WebGPUThreading fnInit", fnInit);
-  sWebGPUThread->GetLoop()->PostTask(runnable.forget());
-}
-
-// static
-void WebGPUThreading::ShutDown() {
-  MOZ_ASSERT(NS_IsMainThread());
-  MOZ_ASSERT(sWebGPUThread);
-
-  const auto fnExit = []() {};
-
-  RefPtr<Runnable> runnable =
-      NS_NewRunnableFunction("WebGPUThreading fnExit", fnExit);
-  sWebGPUThread->GetLoop()->PostTask(runnable.forget());
-
-  sWebGPUThread = nullptr;
-}
-
-// static
-MessageLoop* WebGPUThreading::GetLoop() {
-  MOZ_ASSERT(NS_IsMainThread());
-  return sWebGPUThread ? sWebGPUThread->mThread->message_loop() : nullptr;
-}
-
-}  // namespace webgpu
-}  // namespace mozilla
deleted file mode 100644
--- a/dom/webgpu/thread/WebGPUThreading.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef MOZILLA_WEBGPU_THREADING_H
-#define MOZILLA_WEBGPU_THREADING_H
-
-#include "ThreadSafeRefcountingWithMainThreadDestruction.h"
-#include "base/thread.h"  // for Thread
-#include "mozilla/layers/SynchronousTask.h"
-
-namespace mozilla {
-namespace webgpu {
-
-class WebGPUThreading final {
-  NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_MAIN_THREAD_DESTRUCTION(
-      WebGPUThreading)
-
- public:
-  /// Can only be called from the main thread.
-  static void Start();
-
-  /// Can only be called from the main thread.
-  static void ShutDown();
-
-  /// Can be called from any thread. Returns `nullptr` if
-  /// the threading is not initialized.
-  static MessageLoop* GetLoop();
-
- private:
-  explicit WebGPUThreading(base::Thread* aThread);
-  ~WebGPUThreading();
-
-  base::Thread* const mThread;
-};
-
-}  // namespace webgpu
-}  // namespace mozilla
-
-#endif  // MOZILLA_WEBGPU_THREADING_H
deleted file mode 100644
--- a/dom/webgpu/thread/moz.build
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-h_and_cpp = [
-    'WebGPUThreading',
-]
-EXPORTS.mozilla.webgpu += [x + '.h' for x in h_and_cpp]
-UNIFIED_SOURCES += [x + '.cpp' for x in h_and_cpp]
-
-
-LOCAL_INCLUDES += [
-    '/ipc/chromium/src',
-]
-
-FINAL_LIBRARY = 'xul'
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/wgpu-native/Cargo.toml
@@ -0,0 +1,53 @@
+[package]
+name = "wgpu-native"
+version = "0.4.0"
+authors = [
+	"Dzmitry Malyshau <kvark@mozilla.com>",
+	"Joshua Groves <josh@joshgroves.com>",
+]
+edition = "2018"
+description = "WebGPU native implementation on gfx-hal"
+homepage = "https://github.com/gfx-rs/wgpu"
+repository = "https://github.com/gfx-rs/wgpu"
+keywords = ["graphics"]
+license = "MPL-2.0"
+
+[lib]
+#crate-type = ["lib", "cdylib", "staticlib"]
+crate-type = ["lib"]
+
+[features]
+default = []
+local = ["lazy_static", "raw-window-handle"]
+metal-auto-capture = ["gfx-backend-metal/auto-capture"]
+#NOTE: glutin feature is not stable, use at your own risk
+#glutin = ["gfx-backend-gl/glutin"]
+
+[dependencies]
+arrayvec = "0.5"
+bitflags = "1.0"
+copyless = "0.1"
+fxhash = "0.2"
+lazy_static = { version = "1.1.0", optional = true }
+log = "0.4"
+hal = { package = "gfx-hal", version = "0.4" }
+gfx-backend-empty = { version = "0.4" }
+parking_lot = "0.9"
+raw-window-handle = { version = "0.3", optional = true }
+rendy-memory = "0.5"
+rendy-descriptor = "0.5"