diff --git a/wgpu-types/src/instance.rs b/wgpu-types/src/instance.rs index 4bafabb5f..a427b1b1c 100644 --- a/wgpu-types/src/instance.rs +++ b/wgpu-types/src/instance.rs @@ -8,15 +8,34 @@ use crate::Backends; use crate::{Backend, DownlevelFlags}; /// Options for creating an instance. +/// +/// If you want to allow control of instance settings via environment variables, call either +/// [`InstanceDescriptor::from_env_or_default()`] or [`InstanceDescriptor::with_env()`]. Each type +/// within this descriptor has its own equivalent methods, so you can select which options you want +/// to expose to influence from the environment. #[derive(Clone, Debug)] pub struct InstanceDescriptor { - /// Which `Backends` to enable. + /// Which [`Backends`] to enable. + /// + /// [`Backends::BROWSER_WEBGPU`] has an additional effect: + /// If it is set and a [`navigator.gpu`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/gpu) + /// object is present, this instance will *only* be able to create WebGPU adapters. + /// + /// ⚠️ On some browsers this check is insufficient to determine whether WebGPU is supported, + /// as the browser may define the `navigator.gpu` object, but be unable to create any WebGPU adapters. + /// For targeting _both_ WebGPU & WebGL, it is recommended to use [`crate::util::new_instance_with_webgpu_detection`](../wgpu/util/fn.new_instance_with_webgpu_detection.html). + /// + /// If you instead want to force use of WebGL, either disable the `webgpu` compile-time feature + /// or don't include the [`Backends::BROWSER_WEBGPU`] flag in this field. + /// If it is set and WebGPU support is *not* detected, the instance will use `wgpu-core` + /// to create adapters, meaning that if the `webgl` feature is enabled, it is able to create + /// a WebGL adapter. pub backends: Backends, /// Flags to tune the behavior of the instance. pub flags: InstanceFlags, /// Memory budget thresholds used by some backends. pub memory_budget_thresholds: MemoryBudgetThresholds, - /// Options the control the behavior of various backends. + /// Options the control the behavior of specific backends. pub backend_options: BackendOptions, } diff --git a/wgpu/src/api/instance.rs b/wgpu/src/api/instance.rs index 26703a48e..7d7e6eaf0 100644 --- a/wgpu/src/api/instance.rs +++ b/wgpu/src/api/instance.rs @@ -21,7 +21,7 @@ bitflags::bitflags! { } } -/// Context for all other wgpu objects. Instance of wgpu. +/// Contains the various entry points to start interacting with the system's GPUs. /// /// This is the first thing you create when using wgpu. /// Its primary use is to create [`Adapter`]s and [`Surface`]s. @@ -84,33 +84,14 @@ impl Instance { backends } - /// Create an new instance of wgpu. - /// - /// # Arguments - /// - /// - `instance_desc` - Has fields for which [backends][Backends] wgpu will choose - /// during instantiation, and which [DX12 shader compiler][Dx12Compiler] wgpu will use. - /// - /// [`Backends::BROWSER_WEBGPU`] takes a special role: - /// If it is set and a [`navigator.gpu`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/gpu) - /// object is present, this instance will *only* be able to create WebGPU adapters. - /// - /// ⚠️ On some browsers this check is insufficient to determine whether WebGPU is supported, - /// as the browser may define the `navigator.gpu` object, but be unable to create any WebGPU adapters. - /// For targeting _both_ WebGPU & WebGL is recommended to use [`crate::util::new_instance_with_webgpu_detection`]. - /// - /// If you instead want to force use of WebGL, either disable the `webgpu` compile-time feature - /// or don't add the [`Backends::BROWSER_WEBGPU`] flag to the the `instance_desc`'s `backends` field. - /// If it is set and WebGPU support is *not* detected, the instance will use wgpu-core - /// to create adapters. Meaning that if the `webgl` feature is enabled, it is able to create - /// a WebGL adapter. + /// Create an new instance of wgpu using the given options and enabled backends. /// /// # Panics /// - /// If no backend feature for the active target platform is enabled, - /// this method will panic, see [`Instance::enabled_backend_features()`]. + /// - If no backend feature for the active target platform is enabled, + /// this method will panic; see [`Instance::enabled_backend_features()`]. #[allow(clippy::allow_attributes, unreachable_code)] - pub fn new(_instance_desc: &InstanceDescriptor) -> Self { + pub fn new(desc: &InstanceDescriptor) -> Self { if Self::enabled_backend_features().is_empty() { panic!( "No wgpu backend feature that is implemented for the target platform was enabled. \ @@ -121,14 +102,14 @@ impl Instance { #[cfg(webgpu)] { let is_only_available_backend = !cfg!(wgpu_core); - let requested_webgpu = _instance_desc.backends.contains(Backends::BROWSER_WEBGPU); + let requested_webgpu = desc.backends.contains(Backends::BROWSER_WEBGPU); let support_webgpu = crate::backend::get_browser_gpu_property() .map(|maybe_gpu| maybe_gpu.is_some()) .unwrap_or(false); if is_only_available_backend || (requested_webgpu && support_webgpu) { return Self { - inner: crate::backend::ContextWebGpu::new(_instance_desc).into(), + inner: crate::backend::ContextWebGpu::new(desc).into(), }; } } @@ -136,10 +117,13 @@ impl Instance { #[cfg(wgpu_core)] { return Self { - inner: crate::backend::ContextWgpuCore::new(_instance_desc).into(), + inner: crate::backend::ContextWgpuCore::new(desc).into(), }; } + // Silence unused variable warnings without adding _ to the parameter name (which shows up in docs). + let _ = desc; + unreachable!( "Earlier check of `enabled_backend_features` should have prevented getting here!" ); diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 44791dea2..0a3ded75f 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -1,6 +1,23 @@ -//! A cross-platform graphics and compute library based on [WebGPU](https://gpuweb.github.io/gpuweb/). +//! `wgpu` is a cross-platform, safe, pure-Rust graphics API. It runs natively on +//! Vulkan, Metal, D3D12, and OpenGL; and on top of WebGL2 and WebGPU on wasm. //! -//! To start using the API, create an [`Instance`]. +//! The API is based on the [WebGPU standard][webgpu]. It serves as the core of the +//! WebGPU integration in Firefox, Servo, and Deno. +//! +//! [webgpu]: https://gpuweb.github.io/gpuweb/ +//! +//! ## Getting Started +//! +//! The main entry point to the API is the [`Instance`] type, from which you can create [`Adapter`], [`Device`], and [`Surface`]. +//! +//! If you are new to `wgpu` and graphics programming, we recommend reading +//! and . The latter is a WebGPU +//! tutorial, but the concepts are nearly identical to `wgpu`. +//! +//! There are examples for this version [available on GitHub](https://github.com/gfx-rs/wgpu/tree/v26/examples#readme).. +//! +//! The API is refcounted, so all handles are cloneable, and if you create a resource which references another, +//! it will automatically keep dependent resources alive. //! //! ## Feature flags #![doc = document_features::document_features!()]