Backed out changeset cbec8a55a1bb (bug 1575008) for build bustages (Bof). CLOSED TREE
authorNarcis Beleuzu <nbeleuzu@mozilla.com>
Tue, 05 Nov 2019 23:22:40 +0200
changeset 500724 a4a011ef0e055aaccb0ed528adae13a9b81c2e80
parent 500723 af59b0e5851cfa43f709449bd2b0cb4950424640
child 500725 1548ffd8f48ca29f49d1e8f2a92e2cc314c1e12e
push id114166
push userapavel@mozilla.com
push dateThu, 07 Nov 2019 10:04:01 +0000
treeherdermozilla-inbound@d271c572a9bc [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1575008
milestone72.0a1
backs outcbec8a55a1bbad484ea0628b527de6f0cc7dc5f7
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
Backed out changeset cbec8a55a1bb (bug 1575008) for build bustages (Bof). CLOSED TREE
.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
third_party/rust/arrayvec-0.4.11/.cargo-checksum.json
third_party/rust/arrayvec-0.4.11/Cargo.toml
third_party/rust/arrayvec-0.4.11/LICENSE-APACHE
third_party/rust/arrayvec-0.4.11/LICENSE-MIT
third_party/rust/arrayvec-0.4.11/README.rst
third_party/rust/arrayvec-0.4.11/benches/arraystring.rs
third_party/rust/arrayvec-0.4.11/benches/extend.rs
third_party/rust/arrayvec-0.4.11/build.rs
third_party/rust/arrayvec-0.4.11/custom.css
third_party/rust/arrayvec-0.4.11/src/array.rs
third_party/rust/arrayvec-0.4.11/src/array_string.rs
third_party/rust/arrayvec-0.4.11/src/char.rs
third_party/rust/arrayvec-0.4.11/src/errors.rs
third_party/rust/arrayvec-0.4.11/src/lib.rs
third_party/rust/arrayvec-0.4.11/src/maybe_uninit.rs
third_party/rust/arrayvec-0.4.11/src/maybe_uninit_nodrop.rs
third_party/rust/arrayvec-0.4.11/src/maybe_uninit_stable.rs
third_party/rust/arrayvec-0.4.11/src/range.rs
third_party/rust/arrayvec-0.4.11/tests/serde.rs
third_party/rust/arrayvec-0.4.11/tests/tests.rs
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/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/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/Cargo.toml
third_party/rust/neqo-crypto/.cargo-checksum.json
third_party/rust/neqo-crypto/Cargo.toml
third_party/rust/neqo-crypto/src/agent.rs
third_party/rust/neqo-http3/.cargo-checksum.json
third_party/rust/neqo-http3/Cargo.toml
third_party/rust/neqo-http3/src/client_events.rs
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/lib.rs
third_party/rust/neqo-http3/src/server_events.rs
third_party/rust/neqo-http3/src/transaction_client.rs
third_party/rust/neqo-http3/src/transaction_server.rs
third_party/rust/neqo-http3/tests/httpconn.rs
third_party/rust/neqo-qpack/.cargo-checksum.json
third_party/rust/neqo-qpack/Cargo.toml
third_party/rust/neqo-transport/.cargo-checksum.json
third_party/rust/neqo-transport/Cargo.toml
third_party/rust/neqo-transport/src/connection.rs
third_party/rust/neqo-transport/src/crypto.rs
third_party/rust/neqo-transport/src/flow_mgr.rs
third_party/rust/neqo-transport/src/recovery.rs
third_party/rust/neqo-transport/src/send_stream.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/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
@@ -2,26 +2,16 @@
 # It was generated by `mach vendor rust`.
 # Please do not edit.
 
 [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-test"
-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/hsivonen/packed_simd"]
 branch = "rust_1_32"
 git = "https://github.com/hsivonen/packed_simd"
 replace-with = "vendored-sources"
 
 [source."https://github.com/alexcrichton/mio-named-pipes"]
 branch = "master"
 git = "https://github.com/alexcrichton/mio-named-pipes"
--- a/.clang-format-ignore
+++ b/.clang-format-ignore
@@ -33,17 +33,16 @@ 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
@@ -48,34 +48,16 @@ source = "registry+https://github.com/ru
 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)",
 ]
 
 [[package]]
-name = "arrayvec"
-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"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -105,17 +87,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.0.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.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.34 (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.60 (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)",
@@ -178,31 +160,32 @@ dependencies = [
 
 [[package]]
 name = "autocfg"
 version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "backtrace"
-version = "0.3.38"
+version = "0.3.9"
 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.60 (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.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.60 (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)",
@@ -355,21 +338,16 @@ version = "0.5.8"
 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)",
  "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)",
@@ -422,17 +400,17 @@ version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cc"
-version = "1.0.47"
+version = "1.0.34"
 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)",
@@ -508,37 +486,18 @@ 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.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.60 (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"
+ "cc 1.0.34 (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)",
@@ -554,52 +513,47 @@ 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.60 (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.3"
+version = "0.17.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)",
  "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.60 (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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.1 (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.60 (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"
@@ -849,26 +803,16 @@ 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)",
 ]
 
@@ -1076,17 +1020,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.38 (registry+https://github.com/rust-lang/crates.io-index)",
+ "backtrace 0.3.9 (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 = [
@@ -1247,126 +1191,16 @@ dependencies = [
 name = "generic-array"
 version = "0.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "typenum 1.10.0 (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-test)",
-]
-
-[[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-test)",
- "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-test)",
- "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-test)",
- "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",
 ]
 
@@ -1416,17 +1250,16 @@ dependencies = [
  "prefs_parser 0.0.1",
  "profiler_helper 0.1.0",
  "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 = [
@@ -1531,24 +1364,16 @@ 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)",
 ]
@@ -1755,17 +1580,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.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.34 (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 = [
@@ -1781,17 +1606,17 @@ dependencies = [
  "libc 0.2.60 (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.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.60 (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"
@@ -1817,17 +1642,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.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.60 (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"
@@ -1852,24 +1677,16 @@ 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.60 (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.60 (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",
@@ -1933,30 +1750,16 @@ 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]]
@@ -2175,66 +1978,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#fa4b17afd26be8bf2c78cbc7247a31223b9cd2ca"
+source = "git+https://github.com/mozilla/neqo#a3230a21d75066a117bab10a38d9a831c3d707d5"
 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#fa4b17afd26be8bf2c78cbc7247a31223b9cd2ca"
+source = "git+https://github.com/mozilla/neqo#a3230a21d75066a117bab10a38d9a831c3d707d5"
 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#fa4b17afd26be8bf2c78cbc7247a31223b9cd2ca"
+source = "git+https://github.com/mozilla/neqo#a3230a21d75066a117bab10a38d9a831c3d707d5"
 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#fa4b17afd26be8bf2c78cbc7247a31223b9cd2ca"
+source = "git+https://github.com/mozilla/neqo#a3230a21d75066a117bab10a38d9a831c3d707d5"
 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#fa4b17afd26be8bf2c78cbc7247a31223b9cd2ca"
+source = "git+https://github.com/mozilla/neqo#a3230a21d75066a117bab10a38d9a831c3d707d5"
 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)",
@@ -2372,33 +2175,16 @@ 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.60 (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 = [
  "goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2780,29 +2566,16 @@ 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.60 (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)",
  "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)",
 ]
@@ -2864,58 +2637,24 @@ 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]]
@@ -3204,25 +2943,16 @@ 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.60 (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)",
 ]
 
@@ -3284,24 +3014,16 @@ source = "registry+https://github.com/ru
 dependencies = [
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.60 (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-test#0e7c3cf62813c1cd3c224f9f23a60a358e1338f2"
-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"
 
@@ -3312,24 +3034,16 @@ dependencies = [
  "libc 0.2.60 (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.60 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
  "xpcom 0.1.0",
 ]
@@ -3980,17 +3694,17 @@ name = "webrender"
 version = "0.60.0"
 dependencies = [
  "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.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.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-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)",
@@ -4018,17 +3732,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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.1 (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)",
@@ -4037,17 +3751,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.0.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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.1 (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)",
@@ -4078,50 +3792,16 @@ 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"
@@ -4166,24 +3846,16 @@ 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]]
@@ -4208,25 +3880,16 @@ 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.60 (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 = "xml-rs"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "xpcom"
 version = "0.1.0"
 dependencies = [
@@ -4299,61 +3962,54 @@ 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.38 (registry+https://github.com/rust-lang/crates.io-index)" = "690a62be8920ccf773ee00ef0968649b0e724cda8bd5b12286302b4ae955fdf5"
+"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
 "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.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bda13183df33055cbb84b847becce220d392df502ebe7a4a78d7021771ed94d0"
 "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 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 cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8"
+"checksum cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "30f813bf45048a18eda9190fd3c6b78644146056740c43172a5a3699118588fd"
 "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9"
+"checksum core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "62ceafe1622ffc9a332199096841d0ff9912ec8cf8f9cde01e254a7d5217cd10"
 "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>"
@@ -4368,17 +4024,16 @@ dependencies = [
 "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"
@@ -4405,33 +4060,25 @@ dependencies = [
 "checksum freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b659e75b7a7338fe75afd7f909fc2b71937845cffb6ebe54ba2e50f13d8e903d"
 "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 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"
@@ -4452,23 +4099,21 @@ dependencies = [
 "checksum line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
 "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e"
 "checksum lmdb-rkv 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "605061e5465304475be2041f19967a900175ea1b6d8f47fbab84a84fb8c48452"
 "checksum lmdb-rkv-sys 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e4b19a1fdf5b74bc802cc9aa7c0c86a775e8b872ba9d5a4e606ffc5d076953"
 "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 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 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_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"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
@@ -4488,18 +4133,16 @@ dependencies = [
 "checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a"
 "checksum num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1"
 "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 parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
 "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b"
@@ -4529,30 +4172,25 @@ 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 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"
 "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649"
@@ -4574,29 +4212,26 @@ 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-test)" = "<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"
@@ -4653,15 +4288,13 @@ 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 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
@@ -56,18 +56,16 @@ opt-level = 2
 rpath = false
 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" }
-spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu-test" }
-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
@@ -839,16 +839,17 @@ 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),
@@ -1395,16 +1396,18 @@ 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();
@@ -1509,16 +1512,18 @@ 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,16 +42,17 @@
 #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"
@@ -175,17 +176,18 @@ class nsGlobalWindowInner final : public
     // implemented on chrome windows.
     ,
                                   private nsIDOMChromeWindow,
                                   public nsIScriptGlobalObject,
                                   public nsIScriptObjectPrincipal,
                                   public nsSupportsWeakReference,
                                   public nsIInterfaceRequestor,
                                   public PRCListStr,
-                                  public nsAPostRefreshObserver {
+                                  public nsAPostRefreshObserver,
+                                  public mozilla::webgpu::InstanceProvider {
  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,45 +1,20 @@
 /* -*- 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_JS_WRAP(Adapter)
 
-Adapter::Adapter(RefPtr<Instance> aParent, RawId aId)
-    : ChildOf(aParent), mBridge(aParent->GetBridge()), mId(aId) {}
 Adapter::~Adapter() = default;
 
-RefPtr<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->MaybeReject(nsresult(0));
-  }
-
-  return promise.forget();
-}
-
 }  // namespace webgpu
 }  // namespace mozilla
--- a/dom/webgpu/Adapter.h
+++ b/dom/webgpu/Adapter.h
@@ -2,51 +2,42 @@
 /* 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(RefPtr<Instance> aParent, RawId aId);
   void GetName(nsString& out) const { out = mName; }
-  RefPtr<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,35 +2,25 @@
 /* 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_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(Device, DOMEventTargetHelper)
 GPU_IMPL_JS_WRAP(Device)
 
-Device::Device(RefPtr<Adapter> aParent, RawId aId)
-    : DOMEventTargetHelper(aParent->GetParentObject()),
-      mBridge(aParent->GetBridge()),
-      mId(aId) {
-  Unused << mId;  // TODO: remove
-}
+Device::Device(nsIGlobalObject* aGlobal) : DOMEventTargetHelper(aGlobal) {}
 
-Device::~Device() {
-  if (mBridge->IsOpen()) {
-    mBridge->SendDeviceDestroy(mId);
-  }
-}
+Device::~Device() = default;
 
 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,34 +50,32 @@ 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(RefPtr<Adapter> 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,72 +1,32 @@
 /* -*- 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 "gfxConfig.h"
+#include "InstanceProvider.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, mOwner)
+GPU_IMPL_CYCLE_COLLECTION(Instance, mParent)
 
 /*static*/
-RefPtr<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!");
-  }
-
-  return new Instance(aOwner, bridge);
+RefPtr<Instance> Instance::Create(nsIGlobalObject* parent) {
+  return new Instance(parent);
 }
 
-Instance::Instance(nsIGlobalObject* aOwner, WebGPUChild* aBridge)
-    : mOwner(aOwner), mBridge(aBridge) {}
+Instance::Instance(nsIGlobalObject* parent) : mParent(parent) {}
 
 Instance::~Instance() = default;
 
 JSObject* Instance::WrapObject(JSContext* cx,
                                JS::Handle<JSObject*> givenProto) {
   return dom::GPU_Binding::Wrap(cx, this, givenProto);
 }
 
-RefPtr<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) {
-        promise->MaybeReject(aRv.isSome() ? NS_ERROR_CONNECTION_REFUSED
-                                          : NS_ERROR_FAILURE);
-      });
-
-  return promise.forget();
-}
-
 }  // namespace webgpu
 }  // namespace mozilla
--- a/dom/webgpu/Instance.h
+++ b/dom/webgpu/Instance.h
@@ -14,37 +14,31 @@
 namespace mozilla {
 namespace dom {
 class Promise;
 struct GPURequestAdapterOptions;
 }  // namespace dom
 
 namespace webgpu {
 class Adapter;
-class GPUAdapter;
-class WebGPUChild;
+class InstanceProvider;
 
 class Instance final : public nsWrapperCache {
  public:
   GPU_DECL_CYCLE_COLLECTION(Instance)
   GPU_DECL_JS_WRAP(Instance)
 
-  static RefPtr<Instance> Create(nsIGlobalObject* aOwner);
+  nsCOMPtr<nsIGlobalObject> mParent;
 
-  already_AddRefed<dom::Promise> RequestAdapter(
-      const dom::GPURequestAdapterOptions& aOptions, ErrorResult& aRv);
+  static RefPtr<Instance> Create(nsIGlobalObject* parent);
 
  private:
-  explicit Instance(nsIGlobalObject* aOwner, WebGPUChild* aBridge);
+  explicit Instance(nsIGlobalObject* parent);
   virtual ~Instance();
 
-  nsCOMPtr<nsIGlobalObject> mOwner;
-  const RefPtr<WebGPUChild> mBridge;
-
  public:
-  nsIGlobalObject* GetParentObject() const { return mOwner.get(); }
-  RefPtr<WebGPUChild> GetBridge() const;
+  nsIGlobalObject* GetParentObject() const { return mParent.get(); }
 };
 
 }  // namespace webgpu
 }  // namespace mozilla
 
 #endif  // GPU_INSTANCE_H_
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/InstanceProvider.cpp
@@ -0,0 +1,38 @@
+/* -*- 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
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/InstanceProvider.h
@@ -0,0 +1,55 @@
+/* -*- 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* const parent);
-
+  explicit ChildOf(
+      T* parent = nullptr);  // TODO: This can't be nullptr eventually.
  protected:
   virtual ~ChildOf();
 
  public:
   nsIGlobalObject* GetParentObject() const;
 };
 
 class ObjectBase : public nsWrapperCache {
deleted file mode 100644
--- a/dom/webgpu/ffi/moz.build
+++ /dev/null
@@ -1,32 +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/.
-
-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'
deleted file mode 100644
--- a/dom/webgpu/ffi/wgpu.h
+++ /dev/null
@@ -1,31 +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 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
deleted file mode 100644
--- a/dom/webgpu/ipc/PWebGPU.ipdl
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- 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
deleted file mode 100644
--- a/dom/webgpu/ipc/WebGPUChild.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- 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 {
-
-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
deleted file mode 100644
--- a/dom/webgpu/ipc/WebGPUChild.h
+++ /dev/null
@@ -1,66 +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 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 {
-  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebGPUChild)
-
-  friend class layers::CompositorBridgeChild;
-
- 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_
deleted file mode 100644
--- a/dom/webgpu/ipc/WebGPUParent.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- 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
deleted file mode 100644
--- a/dom/webgpu/ipc/WebGPUParent.h
+++ /dev/null
@@ -1,43 +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 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_
deleted file mode 100644
--- a/dom/webgpu/ipc/WebGPUSerialize.h
+++ /dev/null
@@ -1,34 +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 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_
deleted file mode 100644
--- a/dom/webgpu/ipc/WebGPUTypes.h
+++ /dev/null
@@ -1,18 +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 WEBGPU_TYPES_H_
-#define WEBGPU_TYPES_H_
-
-namespace mozilla {
-namespace webgpu {
-
-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]
+
deleted file mode 100644
--- a/dom/webgpu/mochitest/test_device_creation.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!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,33 +8,34 @@ with Files('**'):
     BUG_COMPONENT = ('Core', 'Graphics: WebGPU')
 
 MOCHITEST_MANIFESTS += [
     'mochitest/mochitest-no-pref.ini',
     'mochitest/mochitest.ini',
 ]
 
 DIRS += [
-    'ffi',
+    'thread',
 ]
 
 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',
@@ -45,27 +46,9 @@ 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'
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/thread/WebGPUThreading.cpp
@@ -0,0 +1,61 @@
+/* -*- 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
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/thread/WebGPUThreading.h
@@ -0,0 +1,42 @@
+/* -*- 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
new file mode 100644
--- /dev/null
+++ b/dom/webgpu/thread/moz.build
@@ -0,0 +1,18 @@
+# -*- 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'
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/Cargo.toml
+++ /dev/null
@@ -1,53 +0,0 @@
-[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"
-serde = { version = "1.0", features = ["serde_derive"], optional = true }
-smallvec = "0.6"
-vec_map = "0.8"
-
-[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies]
-gfx-backend-metal = { version = "0.4" }
-gfx-backend-vulkan = { version = "0.4", optional = true }
-
-[target.'cfg(all(unix, not(target_os = "ios"), not(target_os = "macos")))'.dependencies]
-gfx-backend-vulkan = { version = "0.4", features = ["x11"] }
-
-[target.'cfg(windows)'.dependencies]
-gfx-backend-dx12 = { version = "0.4.1" }
-gfx-backend-dx11 = { version = "0.4" }
-gfx-backend-vulkan = { version = "0.4" }
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/cbindgen.toml
+++ /dev/null
@@ -1,37 +0,0 @@
-header = """
-#define WGPU_LOCAL
-"""
-include_version = true
-braces = "SameLine"
-line_length = 100
-tab_width = 2
-language = "C"
-
-[export]
-prefix = "WGPU"
-#TODO: figure out why cbindgen even tries to export a private type...
-exclude = ["BufferMapResult"]
-
-[parse]
-parse_deps = false
-
-[parse.expand]
-features = ["local"]
-
-[fn]
-
-[struct]
-derive_eq = true
-
-[enum]
-prefix_with_name = true
-derive_helper_methods = true
-
-[macro_expansion]
-bitflags = true
-
-[defines]
-"feature = local" = "WGPU_LOCAL"
-"feature = gfx-backend-gl" = "WGPU_BACKEND_GL"
-"feature = winit" = "WGPU_WINIT"
-"feature = glutin" = "WGPU_GLUTIN"
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/src/binding_model.rs
+++ /dev/null
@@ -1,132 +0,0 @@
-/* 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/. */
-
-use crate::{
-    resource::TextureViewDimension,
-    track::TrackerSet,
-    BindGroupLayoutId,
-    BufferAddress,
-    BufferId,
-    DeviceId,
-    LifeGuard,
-    RefCount,
-    SamplerId,
-    Stored,
-    TextureViewId,
-};
-
-use arrayvec::ArrayVec;
-use bitflags::bitflags;
-use rendy_descriptor::{DescriptorRanges, DescriptorSet};
-
-use std::borrow::Borrow;
-
-pub const MAX_BIND_GROUPS: usize = 4;
-
-bitflags! {
-    #[repr(transparent)]
-    pub struct ShaderStage: u32 {
-        const NONE = 0;
-        const VERTEX = 1;
-        const FRAGMENT = 2;
-        const COMPUTE = 4;
-    }
-}
-
-#[repr(C)]
-#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
-pub enum BindingType {
-    UniformBuffer = 0,
-    StorageBuffer = 1,
-    ReadonlyStorageBuffer = 2,
-    Sampler = 3,
-    SampledTexture = 4,
-    StorageTexture = 5,
-}
-
-#[repr(C)]
-#[derive(Clone, Debug, Hash)]
-pub struct BindGroupLayoutBinding {
-    pub binding: u32,
-    pub visibility: ShaderStage,
-    pub ty: BindingType,
-    pub texture_dimension: TextureViewDimension,
-    pub multisampled: bool,
-    pub dynamic: bool,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct BindGroupLayoutDescriptor {
-    pub bindings: *const BindGroupLayoutBinding,
-    pub bindings_length: usize,
-}
-
-#[derive(Debug)]
-pub struct BindGroupLayout<B: hal::Backend> {
-    pub(crate) raw: B::DescriptorSetLayout,
-    pub(crate) bindings: Vec<BindGroupLayoutBinding>,
-    pub(crate) desc_ranges: DescriptorRanges,
-    pub(crate) dynamic_count: usize,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct PipelineLayoutDescriptor {
-    pub bind_group_layouts: *const BindGroupLayoutId,
-    pub bind_group_layouts_length: usize,
-}
-
-#[derive(Debug)]
-pub struct PipelineLayout<B: hal::Backend> {
-    pub(crate) raw: B::PipelineLayout,
-    pub(crate) bind_group_layout_ids: ArrayVec<[BindGroupLayoutId; MAX_BIND_GROUPS]>,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct BufferBinding {
-    pub buffer: BufferId,
-    pub offset: BufferAddress,
-    pub size: BufferAddress,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub enum BindingResource {
-    Buffer(BufferBinding),
-    Sampler(SamplerId),
-    TextureView(TextureViewId),
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct BindGroupBinding {
-    pub binding: u32,
-    pub resource: BindingResource,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct BindGroupDescriptor {
-    pub layout: BindGroupLayoutId,
-    pub bindings: *const BindGroupBinding,
-    pub bindings_length: usize,
-}
-
-#[derive(Debug)]
-pub struct BindGroup<B: hal::Backend> {
-    pub(crate) raw: DescriptorSet<B>,
-    pub(crate) device_id: Stored<DeviceId>,
-    pub(crate) layout_id: BindGroupLayoutId,
-    pub(crate) life_guard: LifeGuard,
-    pub(crate) used: TrackerSet,
-    pub(crate) dynamic_count: usize,
-}
-
-impl<B: hal::Backend> Borrow<RefCount> for BindGroup<B> {
-    fn borrow(&self) -> &RefCount {
-        &self.life_guard.ref_count
-    }
-}
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/src/command/allocator.rs
+++ /dev/null
@@ -1,165 +0,0 @@
-/* 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/. */
-
-use super::CommandBuffer;
-use crate::{
-    hub::GfxBackend,
-    track::TrackerSet,
-    DeviceId,
-    Features,
-    LifeGuard,
-    Stored,
-    SubmissionIndex,
-};
-
-use hal::{command::CommandBuffer as _, device::Device as _, pool::CommandPool as _};
-use parking_lot::Mutex;
-
-use std::{collections::HashMap, sync::atomic::Ordering, thread};
-
-#[derive(Debug)]
-struct CommandPool<B: hal::Backend> {
-    raw: B::CommandPool,
-    available: Vec<B::CommandBuffer>,
-}
-
-impl<B: hal::Backend> CommandPool<B> {
-    fn allocate(&mut self) -> B::CommandBuffer {
-        if self.available.is_empty() {
-            let extra = unsafe {
-                self.raw.allocate_vec(20, hal::command::Level::Primary)
-            };
-            self.available.extend(extra);
-        }
-
-        self.available.pop().unwrap()
-    }
-}
-
-#[derive(Debug)]
-struct Inner<B: hal::Backend> {
-    pools: HashMap<thread::ThreadId, CommandPool<B>>,
-    pending: Vec<CommandBuffer<B>>,
-}
-
-impl<B: hal::Backend> Inner<B> {
-    fn recycle(&mut self, cmd_buf: CommandBuffer<B>) {
-        let pool = self.pools.get_mut(&cmd_buf.recorded_thread_id).unwrap();
-        for mut raw in cmd_buf.raw {
-            unsafe {
-                raw.reset(false);
-            }
-            pool.available.push(raw);
-        }
-    }
-}
-
-#[derive(Debug)]
-pub struct CommandAllocator<B: hal::Backend> {
-    queue_family: hal::queue::QueueFamilyId,
-    inner: Mutex<Inner<B>>,
-}
-
-impl<B: GfxBackend> CommandAllocator<B> {
-    pub(crate) fn allocate(
-        &self,
-        device_id: Stored<DeviceId>,
-        device: &B::Device,
-        features: Features,
-    ) -> CommandBuffer<B> {
-        //debug_assert_eq!(device_id.backend(), B::VARIANT);
-        let thread_id = thread::current().id();
-        let mut inner = self.inner.lock();
-
-        let pool = inner.pools.entry(thread_id).or_insert_with(|| CommandPool {
-            raw: unsafe {
-                device.create_command_pool(
-                    self.queue_family,
-                    hal::pool::CommandPoolCreateFlags::RESET_INDIVIDUAL,
-                )
-            }
-            .unwrap(),
-            available: Vec::new(),
-        });
-        let init = pool.allocate();
-
-        CommandBuffer {
-            raw: vec![init],
-            is_recording: true,
-            recorded_thread_id: thread_id,
-            device_id,
-            life_guard: LifeGuard::new(),
-            trackers: TrackerSet::new(B::VARIANT),
-            used_swap_chain: None,
-            features,
-        }
-    }
-}
-
-impl<B: hal::Backend> CommandAllocator<B> {
-    pub fn new(queue_family: hal::queue::QueueFamilyId) -> Self {
-        CommandAllocator {
-            queue_family,
-            inner: Mutex::new(Inner {
-                pools: HashMap::new(),
-                pending: Vec::new(),
-            }),
-        }
-    }
-
-    pub fn extend(&self, cmd_buf: &CommandBuffer<B>) -> B::CommandBuffer {
-        let mut inner = self.inner.lock();
-        let pool = inner.pools.get_mut(&cmd_buf.recorded_thread_id).unwrap();
-
-        if pool.available.is_empty() {
-            let extra = unsafe {
-                pool.raw.allocate_vec(20, hal::command::Level::Primary)
-            };
-            pool.available.extend(extra);
-        }
-
-        pool.available.pop().unwrap()
-    }
-
-    pub fn after_submit(&self, mut cmd_buf: CommandBuffer<B>, submit_index: SubmissionIndex) {
-        cmd_buf.trackers.clear();
-        cmd_buf
-            .life_guard
-            .submission_index
-            .store(submit_index, Ordering::Release);
-        self.inner.lock().pending.push(cmd_buf);
-    }
-
-    pub fn maintain(&self, last_done: SubmissionIndex) {
-        let mut inner = self.inner.lock();
-        for i in (0 .. inner.pending.len()).rev() {
-            let index = inner.pending[i]
-                .life_guard
-                .submission_index
-                .load(Ordering::Acquire);
-            if index <= last_done {
-                let cmd_buf = inner.pending.swap_remove(i);
-                log::trace!(
-                    "recycling comb submitted in {} when {} is done",
-                    index,
-                    last_done
-                );
-                inner.recycle(cmd_buf);
-            }
-        }
-    }
-
-    pub fn destroy(self, device: &B::Device) {
-        let mut inner = self.inner.lock();
-        while let Some(cmd_buf) = inner.pending.pop() {
-            inner.recycle(cmd_buf);
-        }
-        for (_, mut pool) in inner.pools.drain() {
-            unsafe {
-                pool.raw.free(pool.available);
-                device.destroy_command_pool(pool.raw);
-            }
-        }
-    }
-}
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/src/command/bind.rs
+++ /dev/null
@@ -1,222 +0,0 @@
-/* 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/. */
-
-use crate::{
-    hub::GfxBackend,
-    BindGroup,
-    BindGroupId,
-    BindGroupLayoutId,
-    BufferAddress,
-    PipelineLayoutId,
-    Stored,
-};
-
-use smallvec::{smallvec, SmallVec};
-
-use std::convert::identity;
-
-pub const DEFAULT_BIND_GROUPS: usize = 4;
-type BindGroupMask = u8;
-
-#[derive(Clone, Debug)]
-pub struct BindGroupPair {
-    layout_id: BindGroupLayoutId,
-    group_id: Stored<BindGroupId>,
-}
-
-#[derive(Debug)]
-pub enum LayoutChange<'a> {
-    Unchanged,
-    Match(BindGroupId, &'a [BufferAddress]),
-    Mismatch,
-}
-
-#[derive(Debug)]
-pub enum Provision {
-    Unchanged,
-    Changed { was_compatible: bool },
-}
-
-struct TakeSome<I> {
-    iter: I,
-}
-impl<T, I> Iterator for TakeSome<I>
-where
-    I: Iterator<Item = Option<T>>,
-{
-    type Item = T;
-    fn next(&mut self) -> Option<T> {
-        self.iter.next().and_then(identity)
-    }
-}
-
-#[derive(Clone, Default, Debug)]
-pub struct BindGroupEntry {
-    expected_layout_id: Option<BindGroupLayoutId>,
-    provided: Option<BindGroupPair>,
-    dynamic_offsets: Vec<BufferAddress>,
-}
-
-impl BindGroupEntry {
-    fn provide<B: GfxBackend>(
-        &mut self,
-        bind_group_id: BindGroupId,
-        bind_group: &BindGroup<B>,
-        offsets: &[BufferAddress],
-    ) -> Provision {
-        debug_assert_eq!(B::VARIANT, bind_group_id.backend());
-
-        let was_compatible = match self.provided {
-            Some(BindGroupPair {
-                layout_id,
-                ref group_id,
-            }) => {
-                if group_id.value == bind_group_id && offsets == self.dynamic_offsets.as_slice() {
-                    assert_eq!(layout_id, bind_group.layout_id);
-                    return Provision::Unchanged;
-                }
-                self.expected_layout_id == Some(layout_id)
-            }
-            None => true,
-        };
-
-        self.provided = Some(BindGroupPair {
-            layout_id: bind_group.layout_id,
-            group_id: Stored {
-                value: bind_group_id,
-                ref_count: bind_group.life_guard.ref_count.clone(),
-            },
-        });
-        //TODO: validate the count of dynamic offsets to match the layout
-        self.dynamic_offsets.clear();
-        self.dynamic_offsets.extend_from_slice(offsets);
-
-        Provision::Changed { was_compatible }
-    }
-
-    pub fn expect_layout(&mut self, bind_group_layout_id: BindGroupLayoutId) -> LayoutChange {
-        let some = Some(bind_group_layout_id);
-        if self.expected_layout_id != some {
-            self.expected_layout_id = some;
-            match self.provided {
-                Some(BindGroupPair {
-                    layout_id,
-                    ref group_id,
-                }) if layout_id == bind_group_layout_id => {
-                    LayoutChange::Match(group_id.value, &self.dynamic_offsets)
-                }
-                Some(_) | None => LayoutChange::Mismatch,
-            }
-        } else {
-            LayoutChange::Unchanged
-        }
-    }
-
-    fn is_valid(&self) -> bool {
-        match (self.expected_layout_id, self.provided.as_ref()) {
-            (None, _) => true,
-            (Some(_), None) => false,
-            (Some(layout), Some(pair)) => layout == pair.layout_id,
-        }
-    }
-
-    fn actual_value(&self) -> Option<BindGroupId> {
-        self.expected_layout_id.and_then(|layout_id| {
-            self.provided.as_ref().and_then(|pair| {
-                if pair.layout_id == layout_id {
-                    Some(pair.group_id.value)
-                } else {
-                    None
-                }
-            })
-        })
-    }
-}
-
-#[derive(Debug)]
-pub struct Binder {
-    pub(crate) pipeline_layout_id: Option<PipelineLayoutId>, //TODO: strongly `Stored`
-    pub(crate) entries: SmallVec<[BindGroupEntry; DEFAULT_BIND_GROUPS]>,
-}
-
-impl Binder {
-    pub(crate) fn new(max_bind_groups: u32) -> Self {
-        Self {
-            pipeline_layout_id: None,
-            entries: smallvec![Default::default(); max_bind_groups as usize],
-        }
-    }
-
-    pub(crate) fn reset_expectations(&mut self, length: usize) {
-        for entry in self.entries[length ..].iter_mut() {
-            entry.expected_layout_id = None;
-        }
-    }
-
-    /// Attempt to set the value of the specified bind group index.
-    /// Returns Some() when the new bind group is ready to be actually bound
-    /// (i.e. compatible with current expectations). Also returns an iterator
-    /// of bind group IDs to be bound with it: those are compatible bind groups
-    /// that were previously blocked because the current one was incompatible.
-    pub(crate) fn provide_entry<'a, B: GfxBackend>(
-        &'a mut self,
-        index: usize,
-        bind_group_id: BindGroupId,
-        bind_group: &BindGroup<B>,
-        offsets: &[BufferAddress],
-    ) -> Option<(
-        PipelineLayoutId,
-        impl 'a + Iterator<Item = BindGroupId>,
-        impl 'a + Iterator<Item = &'a BufferAddress>,
-    )> {
-        log::trace!("\tBinding [{}] = group {:?}", index, bind_group_id);
-        debug_assert_eq!(B::VARIANT, bind_group_id.backend());
-
-        match self.entries[index].provide(bind_group_id, bind_group, offsets) {
-            Provision::Unchanged => None,
-            Provision::Changed { was_compatible, .. } => {
-                let compatible_count = self.compatible_count();
-                if index < compatible_count {
-                    let end = compatible_count.min(if was_compatible {
-                        index + 1
-                    } else {
-                        self.entries.len()
-                    });
-                    log::trace!("\t\tbinding up to {}", end);
-                    Some((
-                        self.pipeline_layout_id?,
-                        TakeSome {
-                            iter: self.entries[index + 1 .. end]
-                                .iter()
-                                .map(|entry| entry.actual_value()),
-                        },
-                        self.entries[index + 1 .. end]
-                            .iter()
-                            .flat_map(|entry| entry.dynamic_offsets.as_slice()),
-                    ))
-                } else {
-                    log::trace!("\t\tskipping above compatible {}", compatible_count);
-                    None
-                }
-            }
-        }
-    }
-
-    pub(crate) fn invalid_mask(&self) -> BindGroupMask {
-        self.entries.iter().enumerate().fold(0, |mask, (i, entry)| {
-            if entry.is_valid() {
-                mask
-            } else {
-                mask | 1u8 << i
-            }
-        })
-    }
-
-    fn compatible_count(&self) -> usize {
-        self.entries
-            .iter()
-            .position(|entry| !entry.is_valid())
-            .unwrap_or(self.entries.len())
-    }
-}
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/src/command/compute.rs
+++ /dev/null
@@ -1,316 +0,0 @@
-/* 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/. */
-
-use crate::{
-    command::bind::{Binder, LayoutChange},
-    device::all_buffer_stages,
-    hub::{GfxBackend, Global, Token},
-    track::{Stitch, TrackerSet},
-    BindGroupId,
-    BufferAddress,
-    BufferId,
-    BufferUsage,
-    CommandBuffer,
-    CommandBufferId,
-    ComputePassId,
-    ComputePipelineId,
-    RawString,
-    Stored,
-    BIND_BUFFER_ALIGNMENT,
-};
-#[cfg(feature = "local")]
-use crate::{gfx_select, hub::GLOBAL};
-
-use hal::{self, command::CommandBuffer as _};
-
-use std::iter;
-#[cfg(feature = "local")]
-use std::slice;
-
-#[derive(Debug)]
-pub struct ComputePass<B: hal::Backend> {
-    raw: B::CommandBuffer,
-    cmb_id: Stored<CommandBufferId>,
-    binder: Binder,
-    trackers: TrackerSet,
-}
-
-impl<B: hal::Backend> ComputePass<B> {
-    pub(crate) fn new(
-        raw: B::CommandBuffer,
-        cmb_id: Stored<CommandBufferId>,
-        trackers: TrackerSet,
-        max_bind_groups: u32,
-    ) -> Self {
-        ComputePass {
-            raw,
-            cmb_id,
-            binder: Binder::new(max_bind_groups),
-            trackers,
-        }
-    }
-}
-
-// Common routines between render/compute
-
-pub fn compute_pass_end_pass<B: GfxBackend>(global: &Global, pass_id: ComputePassId) {
-    let mut token = Token::root();
-    let hub = B::hub(global);
-    let (mut cmb_guard, mut token) = hub.command_buffers.write(&mut token);
-    let (pass, _) = hub.compute_passes.unregister(pass_id, &mut token);
-    let cmb = &mut cmb_guard[pass.cmb_id.value];
-
-    // There are no transitions to be made: we've already been inserting barriers
-    // into the parent command buffer while recording this compute pass.
-    cmb.trackers = pass.trackers;
-    cmb.raw.push(pass.raw);
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_end_pass(pass_id: ComputePassId) {
-    gfx_select!(pass_id => compute_pass_end_pass(&*GLOBAL, pass_id))
-}
-
-pub fn compute_pass_set_bind_group<B: GfxBackend>(
-    global: &Global,
-    pass_id: ComputePassId,
-    index: u32,
-    bind_group_id: BindGroupId,
-    offsets: &[BufferAddress],
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-
-    let (pipeline_layout_guard, mut token) = hub.pipeline_layouts.read(&mut token);
-    let (bind_group_guard, mut token) = hub.bind_groups.read(&mut token);
-    let (mut pass_guard, mut token) = hub.compute_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-
-    let bind_group = pass
-        .trackers
-        .bind_groups
-        .use_extend(&*bind_group_guard, bind_group_id, (), ())
-        .unwrap();
-
-    assert_eq!(bind_group.dynamic_count, offsets.len());
-
-    if cfg!(debug_assertions) {
-        for off in offsets {
-            assert_eq!(
-                *off % BIND_BUFFER_ALIGNMENT,
-                0,
-                "Misaligned dynamic buffer offset: {} does not align with {}",
-                off,
-                BIND_BUFFER_ALIGNMENT
-            );
-        }
-    }
-
-    //Note: currently, WebGPU compute passes have synchronization defined
-    // at a dispatch granularity, so we insert the necessary barriers here.
-    let (buffer_guard, mut token) = hub.buffers.read(&mut token);
-    let (texture_guard, _) = hub.textures.read(&mut token);
-
-    log::trace!(
-        "Encoding barriers on binding of {:?} in pass {:?}",
-        bind_group_id,
-        pass_id
-    );
-    CommandBuffer::insert_barriers(
-        &mut pass.raw,
-        &mut pass.trackers,
-        &bind_group.used,
-        Stitch::Last,
-        &*buffer_guard,
-        &*texture_guard,
-    );
-
-    if let Some((pipeline_layout_id, follow_up_sets, follow_up_offsets)) = pass
-        .binder
-        .provide_entry(index as usize, bind_group_id, bind_group, offsets)
-    {
-        let bind_groups = iter::once(bind_group.raw.raw())
-            .chain(follow_up_sets.map(|bg_id| bind_group_guard[bg_id].raw.raw()));
-        unsafe {
-            pass.raw.bind_compute_descriptor_sets(
-                &pipeline_layout_guard[pipeline_layout_id].raw,
-                index as usize,
-                bind_groups,
-                offsets
-                    .iter()
-                    .chain(follow_up_offsets)
-                    .map(|&off| off as hal::command::DescriptorSetOffset),
-            );
-        }
-    };
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_set_bind_group(
-    pass_id: ComputePassId,
-    index: u32,
-    bind_group_id: BindGroupId,
-    offsets: *const BufferAddress,
-    offsets_length: usize,
-) {
-    let offsets = if offsets_length != 0 {
-        unsafe { slice::from_raw_parts(offsets, offsets_length) }
-    } else {
-        &[]
-    };
-    gfx_select!(pass_id => compute_pass_set_bind_group(&*GLOBAL, pass_id, index, bind_group_id, offsets))
-}
-
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_push_debug_group(_pass_id: ComputePassId, _label: RawString) {
-    //TODO
-}
-
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_pop_debug_group(_pass_id: ComputePassId) {
-    //TODO
-}
-
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_insert_debug_marker(
-    _pass_id: ComputePassId,
-    _label: RawString,
-) {
-    //TODO
-}
-
-// Compute-specific routines
-
-pub fn compute_pass_dispatch<B: GfxBackend>(
-    global: &Global,
-    pass_id: ComputePassId,
-    x: u32,
-    y: u32,
-    z: u32,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut pass_guard, _) = hub.compute_passes.write(&mut token);
-    unsafe {
-        pass_guard[pass_id].raw.dispatch([x, y, z]);
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_dispatch(pass_id: ComputePassId, x: u32, y: u32, z: u32) {
-    gfx_select!(pass_id => compute_pass_dispatch(&*GLOBAL, pass_id, x, y, z))
-}
-
-pub fn compute_pass_dispatch_indirect<B: GfxBackend>(
-    global: &Global,
-    pass_id: ComputePassId,
-    indirect_buffer_id: BufferId,
-    indirect_offset: BufferAddress,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (buffer_guard, _) = hub.buffers.read(&mut token);
-    let (mut pass_guard, _) = hub.compute_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-
-    let (src_buffer, src_pending) = pass.trackers.buffers.use_replace(
-        &*buffer_guard,
-        indirect_buffer_id,
-        (),
-        BufferUsage::INDIRECT,
-    );
-    assert!(src_buffer.usage.contains(BufferUsage::INDIRECT));
-
-    let barriers = src_pending.map(|pending| hal::memory::Barrier::Buffer {
-        states: pending.to_states(),
-        target: &src_buffer.raw,
-        families: None,
-        range: None .. None,
-    });
-
-    unsafe {
-        pass.raw.pipeline_barrier(
-            all_buffer_stages() .. all_buffer_stages(),
-            hal::memory::Dependencies::empty(),
-            barriers,
-        );
-        pass.raw.dispatch_indirect(&src_buffer.raw, indirect_offset);
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_dispatch_indirect(
-    pass_id: ComputePassId,
-    indirect_buffer_id: BufferId,
-    indirect_offset: BufferAddress,
-) {
-    gfx_select!(pass_id => compute_pass_dispatch_indirect(&*GLOBAL, pass_id, indirect_buffer_id, indirect_offset))
-}
-
-pub fn compute_pass_set_pipeline<B: GfxBackend>(
-    global: &Global,
-    pass_id: ComputePassId,
-    pipeline_id: ComputePipelineId,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (pipeline_layout_guard, mut token) = hub.pipeline_layouts.read(&mut token);
-    let (bind_group_guard, mut token) = hub.bind_groups.read(&mut token);
-    let (mut pass_guard, mut token) = hub.compute_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-    let (pipeline_guard, _) = hub.compute_pipelines.read(&mut token);
-    let pipeline = &pipeline_guard[pipeline_id];
-
-    unsafe {
-        pass.raw.bind_compute_pipeline(&pipeline.raw);
-    }
-
-    // Rebind resources
-    if pass.binder.pipeline_layout_id != Some(pipeline.layout_id.clone()) {
-        let pipeline_layout = &pipeline_layout_guard[pipeline.layout_id];
-        pass.binder.pipeline_layout_id = Some(pipeline.layout_id.clone());
-        pass.binder
-            .reset_expectations(pipeline_layout.bind_group_layout_ids.len());
-        let mut is_compatible = true;
-
-        for (index, (entry, &bgl_id)) in pass
-            .binder
-            .entries
-            .iter_mut()
-            .zip(&pipeline_layout.bind_group_layout_ids)
-            .enumerate()
-        {
-            match entry.expect_layout(bgl_id) {
-                LayoutChange::Match(bg_id, offsets) if is_compatible => {
-                    let desc_set = bind_group_guard[bg_id].raw.raw();
-                    unsafe {
-                        pass.raw.bind_compute_descriptor_sets(
-                            &pipeline_layout.raw,
-                            index,
-                            iter::once(desc_set),
-                            offsets.iter().map(|offset| *offset as u32),
-                        );
-                    }
-                }
-                LayoutChange::Match(..) | LayoutChange::Unchanged => {}
-                LayoutChange::Mismatch => {
-                    is_compatible = false;
-                }
-            }
-        }
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_compute_pass_set_pipeline(
-    pass_id: ComputePassId,
-    pipeline_id: ComputePipelineId,
-) {
-    gfx_select!(pass_id => compute_pass_set_pipeline(&*GLOBAL, pass_id, pipeline_id))
-}
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/src/command/mod.rs
+++ /dev/null
@@ -1,769 +0,0 @@
-/* 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/. */
-
-mod allocator;
-mod bind;
-mod compute;
-mod render;
-mod transfer;
-
-pub(crate) use self::allocator::CommandAllocator;
-pub use self::compute::*;
-pub use self::render::*;
-pub use self::transfer::*;
-
-use crate::{
-    conv,
-    device::{
-        all_buffer_stages,
-        all_image_stages,
-        FramebufferKey,
-        RenderPassContext,
-        RenderPassKey,
-    },
-    hub::{GfxBackend, Global, Storage, Token},
-    id::{Input, Output},
-    resource::TextureViewInner,
-    track::{Stitch, TrackerSet},
-    Buffer,
-    BufferId,
-    Color,
-    CommandBufferId,
-    CommandEncoderId,
-    ComputePassId,
-    DeviceId,
-    Features,
-    LifeGuard,
-    RenderPassId,
-    Stored,
-    Texture,
-    TextureId,
-    TextureUsage,
-    TextureViewId,
-};
-#[cfg(feature = "local")]
-use crate::{gfx_select, hub::GLOBAL};
-
-use arrayvec::ArrayVec;
-use hal::{adapter::PhysicalDevice as _, command::CommandBuffer as _, device::Device as _};
-
-#[cfg(feature = "local")]
-use std::marker::PhantomData;
-use std::{borrow::Borrow, collections::hash_map::Entry, iter, mem, ptr, slice, thread::ThreadId};
-
-
-pub struct RenderBundle<B: hal::Backend> {
-    _raw: B::CommandBuffer,
-}
-
-#[repr(C)]
-#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
-pub enum LoadOp {
-    Clear = 0,
-    Load = 1,
-}
-
-#[repr(C)]
-#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
-pub enum StoreOp {
-    Clear = 0,
-    Store = 1,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct RenderPassColorAttachmentDescriptor {
-    pub attachment: TextureViewId,
-    pub resolve_target: *const TextureViewId,
-    pub load_op: LoadOp,
-    pub store_op: StoreOp,
-    pub clear_color: Color,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct RenderPassDepthStencilAttachmentDescriptor<T> {
-    pub attachment: T,
-    pub depth_load_op: LoadOp,
-    pub depth_store_op: StoreOp,
-    pub clear_depth: f32,
-    pub stencil_load_op: LoadOp,
-    pub stencil_store_op: StoreOp,
-    pub clear_stencil: u32,
-}
-
-#[repr(C)]
-#[derive(Debug)]
-pub struct RenderPassDescriptor {
-    pub color_attachments: *const RenderPassColorAttachmentDescriptor,
-    pub color_attachments_length: usize,
-    pub depth_stencil_attachment: *const RenderPassDepthStencilAttachmentDescriptor<TextureViewId>,
-}
-
-#[repr(C)]
-#[derive(Clone, Debug, Default)]
-pub struct ComputePassDescriptor {
-    pub todo: u32,
-}
-
-#[derive(Debug)]
-pub struct CommandBuffer<B: hal::Backend> {
-    pub(crate) raw: Vec<B::CommandBuffer>,
-    is_recording: bool,
-    recorded_thread_id: ThreadId,
-    pub(crate) device_id: Stored<DeviceId>,
-    pub(crate) life_guard: LifeGuard,
-    pub(crate) trackers: TrackerSet,
-    pub(crate) used_swap_chain: Option<(Stored<TextureViewId>, B::Framebuffer)>,
-    pub(crate) features: Features,
-}
-
-impl<B: GfxBackend> CommandBuffer<B> {
-    pub(crate) fn insert_barriers(
-        raw: &mut B::CommandBuffer,
-        base: &mut TrackerSet,
-        head: &TrackerSet,
-        stitch: Stitch,
-        buffer_guard: &Storage<Buffer<B>, BufferId>,
-        texture_guard: &Storage<Texture<B>, TextureId>,
-    ) {
-        log::trace!("\tstitch {:?}", stitch);
-        debug_assert_eq!(B::VARIANT, base.backend());
-        debug_assert_eq!(B::VARIANT, head.backend());
-
-        let buffer_barriers = base
-            .buffers
-            .merge_replace(&head.buffers, stitch)
-            .map(|pending| {
-                log::trace!("\tbuffer -> {:?}", pending);
-                hal::memory::Barrier::Buffer {
-                    states: pending.to_states(),
-                    target: &buffer_guard[pending.id].raw,
-                    range: None .. None,
-                    families: None,
-                }
-            });
-        let texture_barriers = base
-            .textures
-            .merge_replace(&head.textures, stitch)
-            .map(|pending| {
-                log::trace!("\ttexture -> {:?}", pending);
-                hal::memory::Barrier::Image {
-                    states: pending.to_states(),
-                    target: &texture_guard[pending.id].raw,
-                    range: pending.selector,
-                    families: None,
-                }
-            });
-        base.views.merge_extend(&head.views).unwrap();
-        base.bind_groups.merge_extend(&head.bind_groups).unwrap();
-        base.samplers.merge_extend(&head.samplers).unwrap();
-
-        let stages = all_buffer_stages() | all_image_stages();
-        unsafe {
-            raw.pipeline_barrier(
-                stages .. stages,
-                hal::memory::Dependencies::empty(),
-                buffer_barriers.chain(texture_barriers),
-            );
-        }
-    }
-}
-
-#[repr(C)]
-#[derive(Clone, Debug, Default)]
-pub struct CommandEncoderDescriptor {
-    // MSVC doesn't allow zero-sized structs
-    // We can remove this when we actually have a field
-    pub todo: u32,
-}
-
-#[repr(C)]
-#[derive(Clone, Debug, Default)]
-pub struct CommandBufferDescriptor {
-    pub todo: u32,
-}
-
-pub fn command_encoder_finish<B: GfxBackend>(
-    global: &Global,
-    encoder_id: CommandEncoderId,
-    _desc: &CommandBufferDescriptor,
-) -> CommandBufferId {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    //TODO: actually close the last recorded command buffer
-    let (mut comb_guard, _) = hub.command_buffers.write(&mut token);
-    let comb = &mut comb_guard[encoder_id];
-    assert!(comb.is_recording);
-    comb.is_recording = false;
-    // stop tracking the swapchain image, if used
-    if let Some((ref view_id, _)) = comb.used_swap_chain {
-        comb.trackers.views.remove(view_id.value);
-    }
-    encoder_id
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_command_encoder_finish(
-    encoder_id: CommandEncoderId,
-    desc: Option<&CommandBufferDescriptor>,
-) -> CommandBufferId {
-    let desc = &desc.cloned().unwrap_or_default();
-    gfx_select!(encoder_id => command_encoder_finish(&*GLOBAL, encoder_id, desc))
-}
-
-pub fn command_encoder_begin_render_pass<B: GfxBackend>(
-    global: &Global,
-    encoder_id: CommandEncoderId,
-    desc: &RenderPassDescriptor,
-    id_in: Input<RenderPassId>,
-) -> Output<RenderPassId> {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-
-    let (adapter_guard, mut token) = hub.adapters.read(&mut token);
-    let (device_guard, mut token) = hub.devices.read(&mut token);
-    let (mut cmb_guard, mut token) = hub.command_buffers.write(&mut token);
-    let cmb = &mut cmb_guard[encoder_id];
-    let device = &device_guard[cmb.device_id.value];
-
-    let limits = adapter_guard[device.adapter_id]
-        .raw
-        .physical_device
-        .limits();
-    let samples_count_limit = limits.framebuffer_color_sample_counts;
-
-    let mut current_comb = device.com_allocator.extend(cmb);
-    unsafe {
-        current_comb.begin(
-            hal::command::CommandBufferFlags::ONE_TIME_SUBMIT,
-            hal::command::CommandBufferInheritanceInfo::default(),
-        );
-    }
-
-    let pass = {
-        let (_, mut token) = hub.buffers.read(&mut token); //skip token
-        let (texture_guard, mut token) = hub.textures.read(&mut token);
-        let (view_guard, _) = hub.texture_views.read(&mut token);
-
-        let mut extent = None;
-        let mut barriers = Vec::new();
-        let mut used_swap_chain_image = None::<Stored<TextureViewId>>;
-
-        let color_attachments =
-            unsafe { slice::from_raw_parts(desc.color_attachments, desc.color_attachments_length) };
-        let depth_stencil_attachment = unsafe { desc.depth_stencil_attachment.as_ref() };
-
-        let sample_count = color_attachments
-            .get(0)
-            .map(|at| view_guard[at.attachment].samples)
-            .unwrap_or(1);
-        assert!(
-            sample_count & samples_count_limit != 0,
-            "Attachment sample_count must be supported by physical device limits"
-        );
-
-        log::trace!(
-            "Encoding render pass begin in command buffer {:?}",
-            encoder_id
-        );
-        let rp_key = {
-            let trackers = &mut cmb.trackers;
-
-            let depth_stencil = depth_stencil_attachment.map(|at| {
-                let view = trackers
-                    .views
-                    .use_extend(&*view_guard, at.attachment, (), ())
-                    .unwrap();
-                if let Some(ex) = extent {
-                    assert_eq!(ex, view.extent);
-                } else {
-                    extent = Some(view.extent);
-                }
-                let texture_id = match view.inner {
-                    TextureViewInner::Native { ref source_id, .. } => source_id.value,
-                    TextureViewInner::SwapChain { .. } => {
-                        panic!("Unexpected depth/stencil use of swapchain image!")
-                    }
-                };
-
-                let texture = &texture_guard[texture_id];
-                assert!(texture.usage.contains(TextureUsage::OUTPUT_ATTACHMENT));
-
-                let old_layout = match trackers.textures.query(texture_id, view.range.clone()) {
-                    Some(usage) => {
-                        conv::map_texture_state(
-                            usage,
-                            hal::format::Aspects::DEPTH | hal::format::Aspects::STENCIL,
-                        )
-                        .1
-                    }
-                    None => {
-                        // Required sub-resources have inconsistent states, we need to
-                        // issue individual barriers instead of relying on the render pass.
-                        let pending = trackers.textures.change_replace(
-                            texture_id,
-                            &texture.life_guard.ref_count,
-                            view.range.clone(),
-                            TextureUsage::OUTPUT_ATTACHMENT,
-                        );
-
-                        barriers.extend(pending.map(|pending| {
-                            log::trace!("\tdepth-stencil {:?}", pending);
-                            hal::memory::Barrier::Image {
-                                states: pending.to_states(),
-                                target: &texture.raw,
-                                families: None,
-                                range: pending.selector,
-                            }
-                        }));
-                        hal::image::Layout::DepthStencilAttachmentOptimal
-                    }
-                };
-                hal::pass::Attachment {
-                    format: Some(conv::map_texture_format(view.format, device.features)),
-                    samples: view.samples,
-                    ops: conv::map_load_store_ops(at.depth_load_op, at.depth_store_op),
-                    stencil_ops: conv::map_load_store_ops(at.stencil_load_op, at.stencil_store_op),
-                    layouts: old_layout .. hal::image::Layout::DepthStencilAttachmentOptimal,
-                }
-            });
-
-            let mut colors = ArrayVec::new();
-            let mut resolves = ArrayVec::new();
-
-            for at in color_attachments {
-                let view = &view_guard[at.attachment];
-                if let Some(ex) = extent {
-                    assert_eq!(ex, view.extent);
-                } else {
-                    extent = Some(view.extent);
-                }
-                assert_eq!(
-                    view.samples, sample_count,
-                    "All attachments must have the same sample_count"
-                );
-                let first_use =
-                    trackers
-                        .views
-                        .init(at.attachment, &view.life_guard.ref_count, (), ());
-
-                let layouts = match view.inner {
-                    TextureViewInner::Native { ref source_id, .. } => {
-                        let texture = &texture_guard[source_id.value];
-                        assert!(texture.usage.contains(TextureUsage::OUTPUT_ATTACHMENT));
-
-                        let old_layout =
-                            match trackers.textures.query(source_id.value, view.range.clone()) {
-                                Some(usage) => {
-                                    conv::map_texture_state(usage, hal::format::Aspects::COLOR).1
-                                }
-                                None => {
-                                    // Required sub-resources have inconsistent states, we need to
-                                    // issue individual barriers instead of relying on the render pass.
-                                    let pending = trackers.textures.change_replace(
-                                        source_id.value,
-                                        &texture.life_guard.ref_count,
-                                        view.range.clone(),
-                                        TextureUsage::OUTPUT_ATTACHMENT,
-                                    );
-                                    barriers.extend(pending.map(|pending| {
-                                        log::trace!("\tcolor {:?}", pending);
-                                        hal::memory::Barrier::Image {
-                                            states: pending.to_states(),
-                                            target: &texture.raw,
-                                            families: None,
-                                            range: pending.selector,
-                                        }
-                                    }));
-                                    hal::image::Layout::ColorAttachmentOptimal
-                                }
-                            };
-                        old_layout .. hal::image::Layout::ColorAttachmentOptimal
-                    }
-                    TextureViewInner::SwapChain { .. } => {
-                        if let Some((ref view_id, _)) = cmb.used_swap_chain {
-                            assert_eq!(view_id.value, at.attachment);
-                        } else {
-                            assert!(used_swap_chain_image.is_none());
-                            used_swap_chain_image = Some(Stored {
-                                value: at.attachment,
-                                ref_count: view.life_guard.ref_count.clone(),
-                            });
-                        }
-
-                        let end = hal::image::Layout::Present;
-                        let start = if first_use {
-                            hal::image::Layout::Undefined
-                        } else {
-                            end
-                        };
-                        start .. end
-                    }
-                };
-
-                colors.push(hal::pass::Attachment {
-                    format: Some(conv::map_texture_format(view.format, device.features)),
-                    samples: view.samples,
-                    ops: conv::map_load_store_ops(at.load_op, at.store_op),
-                    stencil_ops: hal::pass::AttachmentOps::DONT_CARE,
-                    layouts,
-                });
-            }
-
-            for &resolve_target in color_attachments
-                .iter()
-                .flat_map(|at| unsafe { at.resolve_target.as_ref() })
-            {
-                let view = &view_guard[resolve_target];
-                assert_eq!(extent, Some(view.extent));
-                assert_eq!(
-                    view.samples, 1,
-                    "All resolve_targets must have a sample_count of 1"
-                );
-                let first_use =
-                    trackers
-                        .views
-                        .init(resolve_target, &view.life_guard.ref_count, (), ());
-
-                let layouts = match view.inner {
-                    TextureViewInner::Native { ref source_id, .. } => {
-                        let texture = &texture_guard[source_id.value];
-                        assert!(texture.usage.contains(TextureUsage::OUTPUT_ATTACHMENT));
-
-                        let old_layout =
-                            match trackers.textures.query(source_id.value, view.range.clone()) {
-                                Some(usage) => {
-                                    conv::map_texture_state(usage, hal::format::Aspects::COLOR).1
-                                }
-                                None => {
-                                    // Required sub-resources have inconsistent states, we need to
-                                    // issue individual barriers instead of relying on the render pass.
-                                    let pending = trackers.textures.change_replace(
-                                        source_id.value,
-                                        &texture.life_guard.ref_count,
-                                        view.range.clone(),
-                                        TextureUsage::OUTPUT_ATTACHMENT,
-                                    );
-                                    barriers.extend(pending.map(|pending| {
-                                        log::trace!("\tresolve {:?}", pending);
-                                        hal::memory::Barrier::Image {
-                                            states: pending.to_states(),
-                                            target: &texture.raw,
-                                            families: None,
-                                            range: pending.selector,
-                                        }
-                                    }));
-                                    hal::image::Layout::ColorAttachmentOptimal
-                                }
-                            };
-                        old_layout .. hal::image::Layout::ColorAttachmentOptimal
-                    }
-                    TextureViewInner::SwapChain { .. } => {
-                        if let Some((ref view_id, _)) = cmb.used_swap_chain {
-                            assert_eq!(view_id.value, resolve_target);
-                        } else {
-                            assert!(used_swap_chain_image.is_none());
-                            used_swap_chain_image = Some(Stored {
-                                value: resolve_target,
-                                ref_count: view.life_guard.ref_count.clone(),
-                            });
-                        }
-
-                        let end = hal::image::Layout::Present;
-                        let start = if first_use {
-                            hal::image::Layout::Undefined
-                        } else {
-                            end
-                        };
-                        start .. end
-                    }
-                };
-
-                resolves.push(hal::pass::Attachment {
-                    format: Some(conv::map_texture_format(view.format, device.features)),
-                    samples: view.samples,
-                    ops: hal::pass::AttachmentOps::new(
-                        hal::pass::AttachmentLoadOp::DontCare,
-                        hal::pass::AttachmentStoreOp::Store,
-                    ),
-                    stencil_ops: hal::pass::AttachmentOps::DONT_CARE,
-                    layouts,
-                });
-            }
-
-            RenderPassKey {
-                colors,
-                resolves,
-                depth_stencil,
-            }
-        };
-
-        if !barriers.is_empty() {
-            unsafe {
-                current_comb.pipeline_barrier(
-                    all_image_stages() .. all_image_stages(),
-                    hal::memory::Dependencies::empty(),
-                    barriers,
-                );
-            }
-        }
-
-        let mut render_pass_cache = device.render_passes.lock();
-        let render_pass = match render_pass_cache.entry(rp_key.clone()) {
-            Entry::Occupied(e) => e.into_mut(),
-            Entry::Vacant(e) => {
-                let color_ids = [
-                    (0, hal::image::Layout::ColorAttachmentOptimal),
-                    (1, hal::image::Layout::ColorAttachmentOptimal),
-                    (2, hal::image::Layout::ColorAttachmentOptimal),
-                    (3, hal::image::Layout::ColorAttachmentOptimal),
-                ];
-
-                let mut resolve_ids = ArrayVec::<[_; crate::device::MAX_COLOR_TARGETS]>::new();
-                let mut attachment_index = color_attachments.len();
-                if color_attachments
-                    .iter()
-                    .any(|at| at.resolve_target != ptr::null())
-                {
-                    for (i, at) in color_attachments.iter().enumerate() {
-                        if at.resolve_target == ptr::null() {
-                            resolve_ids.push((
-                                hal::pass::ATTACHMENT_UNUSED,
-                                hal::image::Layout::ColorAttachmentOptimal,
-                            ));
-                        } else {
-                            let sample_count_check =
-                                view_guard[color_attachments[i].attachment].samples;
-                            assert!(sample_count_check > 1, "RenderPassColorAttachmentDescriptor with a resolve_target must have an attachment with sample_count > 1");
-                            resolve_ids.push((
-                                attachment_index,
-                                hal::image::Layout::ColorAttachmentOptimal,
-                            ));
-                            attachment_index += 1;
-                        }
-                    }
-                }
-
-                let depth_id = (
-                    attachment_index,
-                    hal::image::Layout::DepthStencilAttachmentOptimal,
-                );
-
-                let subpass = hal::pass::SubpassDesc {
-                    colors: &color_ids[.. color_attachments.len()],
-                    resolves: &resolve_ids,
-                    depth_stencil: depth_stencil_attachment.map(|_| &depth_id),
-                    inputs: &[],
-                    preserves: &[],
-                };
-
-                let pass = unsafe {
-                    device
-                        .raw
-                        .create_render_pass(e.key().all(), &[subpass], &[])
-                }
-                .unwrap();
-                e.insert(pass)
-            }
-        };
-
-        let mut framebuffer_cache;
-        let fb_key = FramebufferKey {
-            colors: color_attachments.iter().map(|at| at.attachment).collect(),
-            resolves: color_attachments
-                .iter()
-                .filter_map(|at| unsafe { at.resolve_target.as_ref() }.cloned())
-                .collect(),
-            depth_stencil: depth_stencil_attachment.map(|at| at.attachment),
-        };
-
-        let framebuffer = match used_swap_chain_image.take() {
-            Some(view_id) => {
-                assert!(cmb.used_swap_chain.is_none());
-                // Always create a new framebuffer and delete it after presentation.
-                let attachments = fb_key.all().map(|&id| match view_guard[id].inner {
-                    TextureViewInner::Native { ref raw, .. } => raw,
-                    TextureViewInner::SwapChain { ref image, .. } => Borrow::borrow(image),
-                });
-                let framebuffer = unsafe {
-                    device
-                        .raw
-                        .create_framebuffer(&render_pass, attachments, extent.unwrap())
-                        .unwrap()
-                };
-                cmb.used_swap_chain = Some((view_id, framebuffer));
-                &mut cmb.used_swap_chain.as_mut().unwrap().1
-            }
-            None => {
-                // Cache framebuffers by the device.
-                framebuffer_cache = device.framebuffers.lock();
-                match framebuffer_cache.entry(fb_key) {
-                    Entry::Occupied(e) => e.into_mut(),
-                    Entry::Vacant(e) => {
-                        let fb = {
-                            let attachments = e.key().all().map(|&id| match view_guard[id].inner {
-                                TextureViewInner::Native { ref raw, .. } => raw,
-                                TextureViewInner::SwapChain { ref image, .. } => {
-                                    Borrow::borrow(image)
-                                }
-                            });
-                            unsafe {
-                                device.raw.create_framebuffer(
-                                    &render_pass,
-                                    attachments,
-                                    extent.unwrap(),
-                                )
-                            }
-                            .unwrap()
-                        };
-                        e.insert(fb)
-                    }
-                }
-            }
-        };
-
-        let rect = {
-            let ex = extent.unwrap();
-            hal::pso::Rect {
-                x: 0,
-                y: 0,
-                w: ex.width as _,
-                h: ex.height as _,
-            }
-        };
-
-        let clear_values = color_attachments
-            .iter()
-            .zip(&rp_key.colors)
-            .flat_map(|(at, key)| {
-                match at.load_op {
-                    LoadOp::Load => None,
-                    LoadOp::Clear => {
-                        use hal::format::ChannelType;
-                        //TODO: validate sign/unsign and normalized ranges of the color values
-                        let value = match key.format.unwrap().base_format().1 {
-                            ChannelType::Unorm
-                            | ChannelType::Snorm
-                            | ChannelType::Ufloat
-                            | ChannelType::Sfloat
-                            | ChannelType::Uscaled
-                            | ChannelType::Sscaled
-                            | ChannelType::Srgb => hal::command::ClearColor {
-                                float32: conv::map_color_f32(&at.clear_color),
-                            },
-                            ChannelType::Sint => hal::command::ClearColor {
-                                sint32: conv::map_color_i32(&at.clear_color),
-                            },
-                            ChannelType::Uint => hal::command::ClearColor {
-                                uint32: conv::map_color_u32(&at.clear_color),
-                            },
-                        };
-                        Some(hal::command::ClearValue { color: value })
-                    }
-                }
-            })
-            .chain(depth_stencil_attachment.and_then(|at| {
-                match (at.depth_load_op, at.stencil_load_op) {
-                    (LoadOp::Load, LoadOp::Load) => None,
-                    (LoadOp::Clear, _) | (_, LoadOp::Clear) => {
-                        let value = hal::command::ClearDepthStencil {
-                            depth: at.clear_depth,
-                            stencil: at.clear_stencil,
-                        };
-                        Some(hal::command::ClearValue {
-                            depth_stencil: value,
-                        })
-                    }
-                }
-            }));
-
-        unsafe {
-            current_comb.begin_render_pass(
-                render_pass,
-                framebuffer,
-                rect,
-                clear_values,
-                hal::command::SubpassContents::Inline,
-            );
-            current_comb.set_scissors(0, iter::once(&rect));
-            current_comb.set_viewports(
-                0,
-                iter::once(hal::pso::Viewport {
-                    rect,
-                    depth: 0.0 .. 1.0,
-                }),
-            );
-        }
-
-        let context = RenderPassContext {
-            colors: color_attachments
-                .iter()
-                .map(|at| view_guard[at.attachment].format)
-                .collect(),
-            resolves: color_attachments
-                .iter()
-                .filter_map(|at| unsafe { at.resolve_target.as_ref() })
-                .map(|resolve| view_guard[*resolve].format)
-                .collect(),
-            depth_stencil: depth_stencil_attachment.map(|at| view_guard[at.attachment].format),
-        };
-
-        RenderPass::new(
-            current_comb,
-            Stored {
-                value: encoder_id,
-                ref_count: cmb.life_guard.ref_count.clone(),
-            },
-            context,
-            sample_count,
-            cmb.features.max_bind_groups,
-        )
-    };
-    hub.render_passes.register_identity(id_in, pass, &mut token)
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_command_encoder_begin_render_pass(
-    encoder_id: CommandEncoderId,
-    desc: &RenderPassDescriptor,
-) -> RenderPassId {
-    gfx_select!(encoder_id => command_encoder_begin_render_pass(&*GLOBAL, encoder_id, desc, PhantomData))
-}
-
-pub fn command_encoder_begin_compute_pass<B: GfxBackend>(
-    global: &Global,
-    encoder_id: CommandEncoderId,
-    _desc: &ComputePassDescriptor,
-    id_in: Input<ComputePassId>,
-) -> Output<ComputePassId> {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-
-    let (mut cmb_guard, mut token) = hub.command_buffers.write(&mut token);
-    let cmb = &mut cmb_guard[encoder_id];
-
-    let raw = cmb.raw.pop().unwrap();
-    let trackers = mem::replace(&mut cmb.trackers, TrackerSet::new(encoder_id.backend()));
-    let stored = Stored {
-        value: encoder_id,
-        ref_count: cmb.life_guard.ref_count.clone(),
-    };
-
-    let pass = ComputePass::new(raw, stored, trackers, cmb.features.max_bind_groups);
-    hub.compute_passes
-        .register_identity(id_in, pass, &mut token)
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_command_encoder_begin_compute_pass(
-    encoder_id: CommandEncoderId,
-    desc: Option<&ComputePassDescriptor>,
-) -> ComputePassId {
-    let desc = &desc.cloned().unwrap_or_default();
-    gfx_select!(encoder_id => command_encoder_begin_compute_pass(&*GLOBAL, encoder_id, desc, PhantomData))
-}
deleted file mode 100644
--- a/dom/webgpu/wgpu-native/src/command/render.rs
+++ /dev/null
@@ -1,848 +0,0 @@
-/* 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/. */
-
-use crate::{
-    command::bind::{Binder, LayoutChange},
-    conv,
-    device::{RenderPassContext, BIND_BUFFER_ALIGNMENT, MAX_VERTEX_BUFFERS},
-    hub::{GfxBackend, Global, Token},
-    pipeline::{IndexFormat, InputStepMode, PipelineFlags},
-    resource::BufferUsage,
-    track::{Stitch, TrackerSet},
-    BindGroupId,
-    BufferAddress,
-    BufferId,
-    Color,
-    CommandBuffer,
-    CommandBufferId,
-    RenderPassId,
-    RenderPipelineId,
-    Stored,
-};
-#[cfg(feature = "local")]
-use crate::{gfx_select, hub::GLOBAL, RawString, RenderBundleId};
-
-use hal::command::CommandBuffer as _;
-
-#[cfg(feature = "local")]
-use std::slice;
-use std::{iter, ops::Range};
-
-#[derive(Debug, PartialEq)]
-enum OptionalState {
-    Unused,
-    Required,
-    Set,
-}
-
-impl OptionalState {
-    fn require(&mut self, require: bool) {
-        if require && *self == OptionalState::Unused {
-            *self = OptionalState::Required;
-        }
-    }
-}
-
-#[derive(Debug, PartialEq)]
-enum DrawError {
-    MissingBlendColor,
-    MissingStencilReference,
-    IncompatibleBindGroup {
-        index: u32,
-        //expected: BindGroupLayoutId,
-        //provided: Option<(BindGroupLayoutId, BindGroupId)>,
-    },
-}
-
-#[derive(Debug)]
-pub struct IndexState {
-    bound_buffer_view: Option<(BufferId, Range<BufferAddress>)>,
-    format: IndexFormat,
-    limit: u32,
-}
-
-impl IndexState {
-    fn update_limit(&mut self) {
-        self.limit = match self.bound_buffer_view {
-            Some((_, ref range)) => {
-                let shift = match self.format {
-                    IndexFormat::Uint16 => 1,
-                    IndexFormat::Uint32 => 2,
-                };
-                ((range.end - range.start) >> shift) as u32
-            }
-            None => 0,
-        }
-    }
-}
-
-#[derive(Clone, Copy, Debug)]
-pub struct VertexBufferState {
-    total_size: BufferAddress,
-    stride: BufferAddress,
-    rate: InputStepMode,
-}
-
-impl VertexBufferState {
-    const EMPTY: Self = VertexBufferState {
-        total_size: 0,
-        stride: 0,
-        rate: InputStepMode::Vertex,
-    };
-}
-
-#[derive(Debug)]
-pub struct VertexState {
-    inputs: [VertexBufferState; MAX_VERTEX_BUFFERS],
-    vertex_limit: u32,
-    instance_limit: u32,
-}
-
-impl VertexState {
-    fn update_limits(&mut self) {
-        self.vertex_limit = !0;
-        self.instance_limit = !0;
-        for vbs in &self.inputs {
-            if vbs.stride == 0 {
-                continue;
-            }
-            let limit = (vbs.total_size / vbs.stride) as u32;
-            match vbs.rate {
-                InputStepMode::Vertex => self.vertex_limit = self.vertex_limit.min(limit),
-                InputStepMode::Instance => self.instance_limit = self.instance_limit.min(limit),
-            }
-        }
-    }
-}
-
-#[derive(Debug)]
-pub struct RenderPass<B: hal::Backend> {
-    raw: B::CommandBuffer,
-    cmb_id: Stored<CommandBufferId>,
-    context: RenderPassContext,
-    binder: Binder,
-    trackers: TrackerSet,
-    blend_color_status: OptionalState,
-    stencil_reference_status: OptionalState,
-    index_state: IndexState,
-    vertex_state: VertexState,
-    sample_count: u8,
-}
-
-impl<B: GfxBackend> RenderPass<B> {
-    pub(crate) fn new(
-        raw: B::CommandBuffer,
-        cmb_id: Stored<CommandBufferId>,
-        context: RenderPassContext,
-        sample_count: u8,
-        max_bind_groups: u32,
-    ) -> Self {
-        RenderPass {
-            raw,
-            cmb_id,
-            context,
-            binder: Binder::new(max_bind_groups),
-            trackers: TrackerSet::new(B::VARIANT),
-            blend_color_status: OptionalState::Unused,
-            stencil_reference_status: OptionalState::Unused,
-            index_state: IndexState {
-                bound_buffer_view: None,
-                format: IndexFormat::Uint16,
-                limit: 0,
-            },
-            vertex_state: VertexState {
-                inputs: [VertexBufferState::EMPTY; MAX_VERTEX_BUFFERS],
-                vertex_limit: 0,
-                instance_limit: 0,
-            },
-            sample_count,
-        }
-    }
-
-    fn is_ready(&self) -> Result<(), DrawError> {
-        //TODO: vertex buffers
-        let bind_mask = self.binder.invalid_mask();
-        if bind_mask != 0 {
-            //let (expected, provided) = self.binder.entries[index as usize].info();
-            return Err(DrawError::IncompatibleBindGroup {
-                index: bind_mask.trailing_zeros() as u32,
-            });
-        }
-        if self.blend_color_status == OptionalState::Required {
-            return Err(DrawError::MissingBlendColor);
-        }
-        if self.stencil_reference_status == OptionalState::Required {
-            return Err(DrawError::MissingStencilReference);
-        }
-        Ok(())
-    }
-}
-
-// Common routines between render/compute
-
-pub fn render_pass_end_pass<B: GfxBackend>(global: &Global, pass_id: RenderPassId) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut cmb_guard, mut token) = hub.command_buffers.write(&mut token);
-    let (mut pass, mut token) = hub.render_passes.unregister(pass_id, &mut token);
-    unsafe {
-        pass.raw.end_render_pass();
-    }
-    pass.trackers.optimize();
-    let cmb = &mut cmb_guard[pass.cmb_id.value];
-    let (buffer_guard, mut token) = hub.buffers.read(&mut token);
-    let (texture_guard, _) = hub.textures.read(&mut token);
-
-    match cmb.raw.last_mut() {
-        Some(last) => {
-            log::trace!("Encoding barriers before pass {:?}", pass_id);
-            CommandBuffer::insert_barriers(
-                last,
-                &mut cmb.trackers,
-                &pass.trackers,
-                Stitch::Last,
-                &*buffer_guard,
-                &*texture_guard,
-            );
-            unsafe { last.finish() };
-        }
-        None => {
-            cmb.trackers.merge_extend(&pass.trackers);
-        }
-    }
-
-    cmb.raw.push(pass.raw);
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_end_pass(pass_id: RenderPassId) {
-    gfx_select!(pass_id => render_pass_end_pass(&*GLOBAL, pass_id))
-}
-
-pub fn render_pass_set_bind_group<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    index: u32,
-    bind_group_id: BindGroupId,
-    offsets: &[BufferAddress],
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (pipeline_layout_guard, mut token) = hub.pipeline_layouts.read(&mut token);
-    let (bind_group_guard, mut token) = hub.bind_groups.read(&mut token);
-
-    let (mut pass_guard, _) = hub.render_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-
-    let bind_group = pass
-        .trackers
-        .bind_groups
-        .use_extend(&*bind_group_guard, bind_group_id, (), ())
-        .unwrap();
-
-    assert_eq!(bind_group.dynamic_count, offsets.len());
-
-    if cfg!(debug_assertions) {
-        for off in offsets {
-            assert_eq!(
-                *off % BIND_BUFFER_ALIGNMENT,
-                0,
-                "Misaligned dynamic buffer offset: {} does not align with {}",
-                off,
-                BIND_BUFFER_ALIGNMENT
-            );
-        }
-    }
-
-    pass.trackers.merge_extend(&bind_group.used);
-
-    if let Some((pipeline_layout_id, follow_up_sets, follow_up_offsets)) = pass
-        .binder
-        .provide_entry(index as usize, bind_group_id, bind_group, offsets)
-    {
-        let bind_groups = iter::once(bind_group.raw.raw())
-            .chain(follow_up_sets.map(|bg_id| bind_group_guard[bg_id].raw.raw()));
-        unsafe {
-            pass.raw.bind_graphics_descriptor_sets(
-                &&pipeline_layout_guard[pipeline_layout_id].raw,
-                index as usize,
-                bind_groups,
-                offsets
-                    .iter()
-                    .chain(follow_up_offsets)
-                    .map(|&off| off as hal::command::DescriptorSetOffset),
-            );
-        }
-    };
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_set_bind_group(
-    pass_id: RenderPassId,
-    index: u32,
-    bind_group_id: BindGroupId,
-    offsets: *const BufferAddress,
-    offsets_length: usize,
-) {
-    let offsets = if offsets_length != 0 {
-        unsafe { slice::from_raw_parts(offsets, offsets_length) }
-    } else {
-        &[]
-    };
-    gfx_select!(pass_id => render_pass_set_bind_group(&*GLOBAL, pass_id, index, bind_group_id, offsets))
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_push_debug_group(_pass_id: RenderPassId, _label: RawString) {
-    //TODO
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_pop_debug_group(_pass_id: RenderPassId) {
-    //TODO
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_insert_debug_marker(_pass_id: RenderPassId, _label: RawString) {
-    //TODO
-}
-
-// Render-specific routines
-
-pub fn render_pass_set_index_buffer<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    buffer_id: BufferId,
-    offset: BufferAddress,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut pass_guard, mut token) = hub.render_passes.write(&mut token);
-    let (buffer_guard, _) = hub.buffers.read(&mut token);
-
-    let pass = &mut pass_guard[pass_id];
-    let buffer = pass
-        .trackers
-        .buffers
-        .use_extend(&*buffer_guard, buffer_id, (), BufferUsage::INDEX)
-        .unwrap();
-    assert!(buffer.usage.contains(BufferUsage::INDEX));
-
-    let range = offset .. buffer.size;
-    pass.index_state.bound_buffer_view = Some((buffer_id, range));
-    pass.index_state.update_limit();
-
-    let view = hal::buffer::IndexBufferView {
-        buffer: &buffer.raw,
-        offset,
-        index_type: conv::map_index_format(pass.index_state.format),
-    };
-
-    unsafe {
-        pass.raw.bind_index_buffer(view);
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_set_index_buffer(
-    pass_id: RenderPassId,
-    buffer_id: BufferId,
-    offset: BufferAddress,
-) {
-    gfx_select!(pass_id => render_pass_set_index_buffer(&*GLOBAL, pass_id, buffer_id, offset))
-}
-
-pub fn render_pass_set_vertex_buffers<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    start_slot: u32,
-    buffers: &[BufferId],
-    offsets: &[BufferAddress],
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    assert_eq!(buffers.len(), offsets.len());
-
-    let (mut pass_guard, mut token) = hub.render_passes.write(&mut token);
-    let (buffer_guard, _) = hub.buffers.read(&mut token);
-
-    let pass = &mut pass_guard[pass_id];
-    for (vbs, (&id, &offset)) in pass.vertex_state.inputs[start_slot as usize ..]
-        .iter_mut()
-        .zip(buffers.iter().zip(offsets))
-    {
-        let buffer = pass
-            .trackers
-            .buffers
-            .use_extend(&*buffer_guard, id, (), BufferUsage::VERTEX)
-            .unwrap();
-        assert!(buffer.usage.contains(BufferUsage::VERTEX));
-
-        vbs.total_size = buffer.size - offset;
-    }
-
-    pass.vertex_state.update_limits();
-
-    let buffers = buffers
-        .iter()
-        .map(|&id| &buffer_guard[id].raw)
-        .zip(offsets.iter().cloned());
-
-    unsafe {
-        pass.raw.bind_vertex_buffers(start_slot, buffers);
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_set_vertex_buffers(
-    pass_id: RenderPassId,
-    start_slot: u32,
-    buffers: *const BufferId,
-    offsets: *const BufferAddress,
-    length: usize,
-) {
-    let buffers = unsafe { slice::from_raw_parts(buffers, length) };
-    let offsets = unsafe { slice::from_raw_parts(offsets, length) };
-    gfx_select!(pass_id => render_pass_set_vertex_buffers(&*GLOBAL, pass_id, start_slot, buffers, offsets))
-}
-
-pub fn render_pass_draw<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    vertex_count: u32,
-    instance_count: u32,
-    first_vertex: u32,
-    first_instance: u32,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut pass_guard, _) = hub.render_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-    pass.is_ready().unwrap();
-
-    assert!(
-        first_vertex + vertex_count <= pass.vertex_state.vertex_limit,
-        "Vertex out of range!"
-    );
-    assert!(
-        first_instance + instance_count <= pass.vertex_state.instance_limit,
-        "Instance out of range!"
-    );
-
-    unsafe {
-        pass.raw.draw(
-            first_vertex .. first_vertex + vertex_count,
-            first_instance .. first_instance + instance_count,
-        );
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_draw(
-    pass_id: RenderPassId,
-    vertex_count: u32,
-    instance_count: u32,
-    first_vertex: u32,
-    first_instance: u32,
-) {
-    gfx_select!(pass_id => render_pass_draw(&*GLOBAL, pass_id, vertex_count, instance_count, first_vertex, first_instance))
-}
-
-pub fn render_pass_draw_indirect<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    indirect_buffer_id: BufferId,
-    indirect_offset: BufferAddress,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut pass_guard, _) = hub.render_passes.write(&mut token);
-    let (buffer_guard, _) = hub.buffers.read(&mut token);
-    let pass = &mut pass_guard[pass_id];
-    pass.is_ready().unwrap();
-
-    let buffer = pass
-        .trackers
-        .buffers
-        .use_extend(
-            &*buffer_guard,
-            indirect_buffer_id,
-            (),
-            BufferUsage::INDIRECT,
-        )
-        .unwrap();
-    assert!(buffer.usage.contains(BufferUsage::INDIRECT));
-
-    unsafe {
-        pass.raw.draw_indirect(&buffer.raw, indirect_offset, 1, 0);
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_draw_indirect(
-    pass_id: RenderPassId,
-    indirect_buffer_id: BufferId,
-    indirect_offset: BufferAddress,
-) {
-    gfx_select!(pass_id => render_pass_draw_indirect(&*GLOBAL, pass_id, indirect_buffer_id, indirect_offset))
-}
-
-pub fn render_pass_draw_indexed<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    index_count: u32,
-    instance_count: u32,
-    first_index: u32,
-    base_vertex: i32,
-    first_instance: u32,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut pass_guard, _) = hub.render_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-    pass.is_ready().unwrap();
-
-    //TODO: validate that base_vertex + max_index() is within the provided range
-    assert!(
-        first_index + index_count <= pass.index_state.limit,
-        "Index out of range!"
-    );
-    assert!(
-        first_instance + instance_count <= pass.vertex_state.instance_limit,
-        "Instance out of range!"
-    );
-
-    unsafe {
-        pass.raw.draw_indexed(
-            first_index .. first_index + index_count,
-            base_vertex,
-            first_instance .. first_instance + instance_count,
-        );
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_draw_indexed(
-    pass_id: RenderPassId,
-    index_count: u32,
-    instance_count: u32,
-    first_index: u32,
-    base_vertex: i32,
-    first_instance: u32,
-) {
-    gfx_select!(pass_id => render_pass_draw_indexed(&*GLOBAL, pass_id, index_count, instance_count, first_index, base_vertex, first_instance))
-}
-
-pub fn render_pass_draw_indexed_indirect<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    indirect_buffer_id: BufferId,
-    indirect_offset: BufferAddress,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (mut pass_guard, _) = hub.render_passes.write(&mut token);
-    let (buffer_guard, _) = hub.buffers.read(&mut token);
-    let pass = &mut pass_guard[pass_id];
-    pass.is_ready().unwrap();
-
-    let buffer = pass
-        .trackers
-        .buffers
-        .use_extend(
-            &*buffer_guard,
-            indirect_buffer_id,
-            (),
-            BufferUsage::INDIRECT,
-        )
-        .unwrap();
-    assert!(buffer.usage.contains(BufferUsage::INDIRECT));
-
-    unsafe {
-        pass.raw
-            .draw_indexed_indirect(&buffer.raw, indirect_offset, 1, 0);
-    }
-}
-
-#[cfg(feature = "local")]
-#[no_mangle]
-pub extern "C" fn wgpu_render_pass_draw_indexed_indirect(
-    pass_id: RenderPassId,
-    indirect_buffer_id: BufferId,
-    indirect_offset: BufferAddress,
-) {
-    gfx_select!(pass_id => render_pass_draw_indexed_indirect(&*GLOBAL, pass_id, indirect_buffer_id, indirect_offset))
-}
-
-pub fn render_pass_set_pipeline<B: GfxBackend>(
-    global: &Global,
-    pass_id: RenderPassId,
-    pipeline_id: RenderPipelineId,
-) {
-    let hub = B::hub(global);
-    let mut token = Token::root();
-    let (pipeline_layout_guard, mut token) = hub.pipeline_layouts.read(&mut token);
-    let (bind_group_guard, mut token) = hub.bind_groups.read(&mut token);
-    let (mut pass_guard, mut token) = hub.render_passes.write(&mut token);
-    let pass = &mut pass_guard[pass_id];
-    let (pipeline_guard, mut token) = hub.render_pipelines.read(&mut token);
-    let pipeline = &pipeline_guard[pipeline_id];
-
-    assert!(
-        pass.context.compatible(&pipeline.pass_context),
-        "The render pipeline is not compatible with the pass!"
-    );
-    assert_eq!(
-        pipeline.sample_count, pass.sample_count,
-        "The render pipeline and renderpass have mismatching sample_count"
-    );
-
-    pass.blend_color_status
-        .require(pipeline.flags.contains(PipelineFlags::BLEND_COLOR));
-    pass.stencil_reference_status
-        .require(pipeline.flags.contains(PipelineFlags::STENCIL_REFERENCE));
-
-    unsafe {
-        pass.raw.bind_graphics_pipeline(&pipeline.raw);
-    }
-
-    // Rebind resource
-    if pass.binder.pipeline_layout_id != Some(pipeline.layout_id.clone()) {
-        let pipeline_layout = &pipeline_layout_guard[pipeline.layout_id];
-        pass.binder.pipeline_layout_id = Some(pipeline.layout_id.clone());
-        pass.binder
-            .reset_expectations(pipeline_layout.bind_group_layout_ids.len());
-        let mut is_compatible = true;
-
-        for (index, (entry, &bgl_id)) in pass
-            .binder
-            .entries
-            .iter_mut()
-            .zip(&pipeline_layout.bind_group_layout_ids)
-            .enumerate()
-        {
-            match entry.expect_layout(bgl_id) {
-                LayoutChange::Match(bg_id, offsets) if is_compatible => {
-                    let desc_set = bind_group_guard[bg_id].raw.raw();
-                    unsafe {
-                        pass.raw.bind_graphics_descriptor_sets(
-                            &pipeline_layout.raw,
-                            index,
-                            iter::once(desc_set),
-                            offsets.iter().map(|offset| *offset as u32),
-                        );
-                    }
-                }
-                LayoutChange::Match(..) | Layou