[package]
name = "wgpu-hal"
version = "24.0.0"
authors = ["gfx-rs developers"]
edition = "2021"
description = "Hardware abstraction layer for wgpu, the cross-platform, safe, pure-rust graphics API"
homepage = "https://wgpu.rs/"
repository = "https://github.com/gfx-rs/wgpu"
keywords = ["graphics"]
license = "MIT OR Apache-2.0"

# Override the workspace's `rust-version` key. Firefox uses `cargo vendor` to
# copy the crates it actually uses out of the workspace, so it's meaningful for
# them to have less restrictive MSRVs individually than the workspace as a
# whole, if their code permits. See `../README.md` for details.
rust-version = "1.76"

[package.metadata.docs.rs]
# Ideally we would enable all the features.
#
# However, the metal features fail to be documented because the docs.rs runner cross-compiling under
# x86_64-unknown-linux-gnu and metal-rs cannot compile in that environment at the moment. The same applies
# for the dx12 feature.
features = ["vulkan", "gles", "renderdoc"]
rustdoc-args = ["--cfg", "docsrs"]
targets = [
    "x86_64-unknown-linux-gnu",
    "x86_64-apple-darwin",
    "x86_64-pc-windows-msvc",
    "wasm32-unknown-unknown",
]

[package.metadata.cargo-machete]
# Cargo machete can't check build.rs dependencies. See https://github.com/bnjbvr/cargo-machete/issues/100
ignored = ["cfg_aliases"]

[lib]

[features]
## Enables the Metal backend when targeting Apple platforms.
##
## Has no effect on non-Apple platforms.
metal = [
    # Metal is only available on Apple platforms, therefore request MSL output also only if we target an Apple platform.
    "naga/msl-out-if-target-apple",
    "dep:block",
]
vulkan = [
    "naga/spv-out",
    "dep:ash",
    "dep:gpu-alloc",
    "dep:gpu-descriptor",
    "dep:libloading",
    "dep:smallvec",
    "dep:android_system_properties",
    "dep:ordered-float",
]
gles = [
    "naga/glsl-out",
    "dep:bytemuck",
    "dep:glow",
    "dep:glutin_wgl_sys",
    "dep:khronos-egl",
    "dep:libloading",
    "dep:ndk-sys",
    "windows/Win32_Graphics_OpenGL",
    "windows/Win32_Graphics_Gdi",
    "windows/Win32_System_LibraryLoader",
    "windows/Win32_UI_WindowsAndMessaging",
]
## Enables the DX12 backend when targeting Windows.
##
## Has no effect if not targeting Windows.
dx12 = [
    # DX12 is only available on Windows, therefore request HLSL output also only if we target Windows.
    "dep:bit-set",
    "dep:libloading",
    "dep:range-alloc",
    "dep:windows-core",
    "gpu-allocator/d3d12",
    "naga/hlsl-out-if-target-windows",
    "windows/Win32_Graphics_Direct3D_Fxc",
    "windows/Win32_Graphics_Direct3D_Dxc",
    "windows/Win32_Graphics_Direct3D",
    "windows/Win32_Graphics_Direct3D12",
    "windows/Win32_Graphics_DirectComposition",
    "windows/Win32_Graphics_Dxgi_Common",
    "windows/Win32_Security",
    "windows/Win32_System_Diagnostics_Debug",
    "windows/Win32_System_Kernel",
    "windows/Win32_System_Performance",
    "windows/Win32_System_Threading",
    "windows/Win32_UI_WindowsAndMessaging",
]
## Enables statically linking DXC.
static-dxc = ["dep:mach-dxcompiler-rs"]
renderdoc = ["dep:libloading", "dep:renderdoc-sys"]
fragile-send-sync-non-atomic-wasm = ["wgt/fragile-send-sync-non-atomic-wasm"]
# Panic when running into an out-of-memory error (for debugging purposes).
#
# Only affects the d3d12 and vulkan backends.
oom_panic = []
# Panic when running into a device lost error (for debugging purposes).
# Only affects the d3d12 and vulkan backends.
device_lost_panic = []
# Panic when running into an internal error other than out-of-memory and device lost
# (for debugging purposes).
#
# Only affects the d3d12 and vulkan backends.
internal_error_panic = []

[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(web_sys_unstable_apis)'] }

[[example]]
name = "halmark"

[[example]]
name = "raw-gles"
required-features = ["gles"]

[dependencies]
bitflags.workspace = true
parking_lot.workspace = true
profiling = { workspace = true, default-features = false }
raw-window-handle.workspace = true
thiserror.workspace = true
once_cell.workspace = true
ordered-float = { workspace = true, optional = true }

# backends common
arrayvec.workspace = true
rustc-hash.workspace = true
log.workspace = true

# backend: Gles
bytemuck = { workspace = true, optional = true }
glow = { workspace = true, optional = true }

[dependencies.wgt]
package = "wgpu-types"
path = "../wgpu-types"
version = "24.0.0"

[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
# backend: Vulkan
ash = { workspace = true, optional = true }
gpu-alloc = { workspace = true, optional = true }
gpu-descriptor = { workspace = true, optional = true }
smallvec = { workspace = true, optional = true, features = ["union"] }

khronos-egl = { workspace = true, features = ["dynamic"], optional = true }
libloading = { workspace = true, optional = true }
renderdoc-sys = { workspace = true, optional = true }

[target.'cfg(target_os = "emscripten")'.dependencies]
khronos-egl = { workspace = true, features = ["static", "no-pkg-config"] }
#Note: it's unused by emscripten, but we keep it to have single code base in egl.rs
libloading = { workspace = true, optional = true }

[target.'cfg(windows)'.dependencies]
# backend: Dx12 and Gles
windows = { workspace = true, optional = true }
# backend: Dx12
bit-set = { workspace = true, optional = true }
range-alloc = { workspace = true, optional = true }
gpu-allocator = { workspace = true, optional = true }
# For core macros. This crate is also reexported as windows::core.
windows-core = { workspace = true, optional = true }

# backend: Gles
glutin_wgl_sys = { workspace = true, optional = true }

# This doesn't support aarch64. See https://github.com/gfx-rs/wgpu/issues/6860.
#
# ⚠️ Keep in sync with static_dxc cfg in build.rs and cfg_alias in `wgpu` crate ⚠️
[target.'cfg(all(windows, not(target_arch = "aarch64")))'.dependencies]
mach-dxcompiler-rs = { workspace = true, optional = true }

[target.'cfg(target_vendor = "apple")'.dependencies]
# backend: Metal
block = { workspace = true, optional = true }

metal.workspace = true
objc.workspace = true
core-graphics-types.workspace = true

[target.'cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))'.dependencies]
wasm-bindgen.workspace = true
web-sys = { workspace = true, features = [
    "default",
    "Window",
    "HtmlCanvasElement",
    "WebGl2RenderingContext",
    "OffscreenCanvas",
] }
js-sys = { workspace = true, features = ["default"] }

[target.'cfg(unix)'.dependencies]
libc.workspace = true

[target.'cfg(target_os = "android")'.dependencies]
android_system_properties = { workspace = true, optional = true }
ndk-sys = { workspace = true, optional = true }

[dependencies.naga]
path = "../naga"
version = "24.0.0"

[build-dependencies]
cfg_aliases.workspace = true

# DEV dependencies
[dev-dependencies.naga]
path = "../naga"
version = "24.0.0"
features = ["wgsl-in"]

[dev-dependencies]
cfg-if.workspace = true
env_logger.workspace = true
glam.workspace = true       # for ray-traced-triangle example
winit.workspace = true      # for "halmark" example

[target.'cfg(not(any(target_arch = "wasm32", target_os = "ios", target_os = "visionos")))'.dev-dependencies]
glutin-winit = { workspace = true, features = [
    "egl",
    "wgl",
    "wayland",
    "x11",
] } # for "raw-gles" example
glutin = { workspace = true, features = [
    "egl",
    "wgl",
    "wayland",
    "x11",
] } # for "raw-gles" example
rwh_05 = { version = "0.5", package = "raw-window-handle" } # temporary compatibility for glutin-winit in "raw-gles" example
winit = { workspace = true, features = ["rwh_05"] } # for "raw-gles" example
