diff --git a/CHANGELOG.md b/CHANGELOG.md index 53a43857bc..0cd61fdea9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,12 +67,15 @@ Bottom level categories: - `tan` - `tanh` - Eager release of GPU resources comes from device.trackers. By @bradwerth in [#5075](https://github.com/gfx-rs/wgpu/pull/5075) +- `wgpu-types`'s `trace` and `replay` features have been replaced by the `serde` feature. By @KirmesBude in [#5149](https://github.com/gfx-rs/wgpu/pull/5149) +- `wgpu-core`'s `serial-pass` feature has been removed. Use `serde` instead. By @KirmesBude in [#5149](https://github.com/gfx-rs/wgpu/pull/5149) ### Bug Fixes #### General - Fix `panic!` when dropping `Instance` without `InstanceFlags::VALIDATION`. By @hakolao in [#5134](https://github.com/gfx-rs/wgpu/pull/5134) +- Fix `serde` feature not compiling for `wgpu-types`. By @KirmesBude in [#5149](https://github.com/gfx-rs/wgpu/pull/5149) #### WGL diff --git a/deno_webgpu/Cargo.toml b/deno_webgpu/Cargo.toml index d1097c658d..9f6d96a95b 100644 --- a/deno_webgpu/Cargo.toml +++ b/deno_webgpu/Cargo.toml @@ -22,7 +22,7 @@ surface = ["wgpu-core/raw-window-handle", "dep:raw-window-handle"] deno_core.workspace = true serde = { workspace = true, features = ["derive"] } tokio = { workspace = true, features = ["full"] } -wgpu-types = { workspace = true, features = ["trace", "replay", "serde"] } +wgpu-types = { workspace = true, features = ["serde"] } raw-window-handle = { workspace = true, optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies.wgpu-core] diff --git a/player/Cargo.toml b/player/Cargo.toml index 63493a4ee2..6c391cb4d6 100644 --- a/player/Cargo.toml +++ b/player/Cargo.toml @@ -29,7 +29,7 @@ winit = { workspace = true, optional = true } [dependencies.wgt] workspace = true -features = ["replay"] +features = ["serde"] [target.'cfg(not(target_arch = "wasm32"))'.dependencies.wgc] workspace = true diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 7c0288388d..c4cbaa9e3e 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -38,7 +38,7 @@ serde_json.workspace = true serde.workspace = true wgpu-macros.workspace = true wgpu.workspace = true -wgt = { workspace = true, features = ["replay"] } +wgt = { workspace = true, features = ["serde"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] env_logger.workspace = true diff --git a/wgpu-core/Cargo.toml b/wgpu-core/Cargo.toml index 95507bd7e2..d66f7b7d3a 100644 --- a/wgpu-core/Cargo.toml +++ b/wgpu-core/Cargo.toml @@ -47,14 +47,14 @@ renderdoc = ["hal/renderdoc"] ## to the validation carried out at public APIs in all builds. strict_asserts = ["wgt/strict_asserts"] +## Enables serialization via `serde` on common wgpu types. +serde = ["dep:serde", "wgt/serde", "arrayvec/serde"] + ## Enable API tracing. -trace = ["ron", "serde", "wgt/trace", "arrayvec/serde", "naga/serialize"] +trace = ["ron", "serde", "naga/serialize"] ## Enable API replaying -replay = ["serde", "wgt/replay", "arrayvec/serde", "naga/deserialize"] - -## Enable serializable compute/render passes, and bundle encoders. -serial-pass = ["serde", "wgt/serde", "arrayvec/serde"] +replay = ["serde", "naga/deserialize"] ## Enable `ShaderModuleSource::Wgsl` wgsl = ["naga/wgsl-in"] diff --git a/wgpu-core/src/binding_model.rs b/wgpu-core/src/binding_model.rs index 833920ea35..fe4f977d03 100644 --- a/wgpu-core/src/binding_model.rs +++ b/wgpu-core/src/binding_model.rs @@ -21,9 +21,9 @@ use crate::{ use arrayvec::ArrayVec; -#[cfg(feature = "replay")] +#[cfg(feature = "serde")] use serde::Deserialize; -#[cfg(feature = "trace")] +#[cfg(feature = "serde")] use serde::Serialize; use std::{borrow::Cow, ops::Range, sync::Arc}; @@ -406,8 +406,7 @@ impl BindingTypeMaxCountValidator { /// Bindable resource and the slot to bind it to. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct BindGroupEntry<'a> { /// Slot for which binding provides resource. Corresponds to an entry of the same /// binding index in the [`BindGroupLayoutDescriptor`]. @@ -418,8 +417,7 @@ pub struct BindGroupEntry<'a> { /// Describes a group of bindings and the resources to be bound. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct BindGroupDescriptor<'a> { /// Debug label of the bind group. /// @@ -433,8 +431,7 @@ pub struct BindGroupDescriptor<'a> { /// Describes a [`BindGroupLayout`]. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct BindGroupLayoutDescriptor<'a> { /// Debug label of the bind group layout. /// @@ -582,8 +579,7 @@ pub enum PushConstantUploadError { /// /// A `PipelineLayoutDescriptor` can be used to create a pipeline layout. #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct PipelineLayoutDescriptor<'a> { /// Debug label of the pipeine layout. /// @@ -734,8 +730,7 @@ impl Resource for PipelineLayout { #[repr(C)] #[derive(Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct BufferBinding { pub buffer_id: BufferId, pub offset: wgt::BufferAddress, @@ -745,8 +740,7 @@ pub struct BufferBinding { // Note: Duplicated in `wgpu-rs` as `BindingResource` // They're different enough that it doesn't make sense to share a common type #[derive(Debug, Clone)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum BindingResource<'a> { Buffer(BufferBinding), BufferArray(Cow<'a, [BufferBinding]>), diff --git a/wgpu-core/src/command/bundle.rs b/wgpu-core/src/command/bundle.rs index 5d474f6a3a..49def22d45 100644 --- a/wgpu-core/src/command/bundle.rs +++ b/wgpu-core/src/command/bundle.rs @@ -197,8 +197,7 @@ fn validate_indexed_draw( /// Describes a [`RenderBundleEncoder`]. #[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct RenderBundleEncoderDescriptor<'a> { /// Debug label of the render bundle encoder. /// @@ -226,7 +225,7 @@ pub struct RenderBundleEncoderDescriptor<'a> { } #[derive(Debug)] -#[cfg_attr(feature = "serial-pass", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct RenderBundleEncoder { base: BasePass, parent_id: id::DeviceId, @@ -235,9 +234,9 @@ pub struct RenderBundleEncoder { pub(crate) is_stencil_read_only: bool, // Resource binding dedupe state. - #[cfg_attr(feature = "serial-pass", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] current_bind_groups: BindGroupStateChange, - #[cfg_attr(feature = "serial-pass", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] current_pipeline: StateChange, } diff --git a/wgpu-core/src/command/compute.rs b/wgpu-core/src/command/compute.rs index ef56f54985..cd7949b3da 100644 --- a/wgpu-core/src/command/compute.rs +++ b/wgpu-core/src/command/compute.rs @@ -29,9 +29,9 @@ use crate::{ }; use hal::CommandEncoder as _; -#[cfg(any(feature = "serial-pass", feature = "replay"))] +#[cfg(feature = "serde")] use serde::Deserialize; -#[cfg(any(feature = "serial-pass", feature = "trace"))] +#[cfg(feature = "serde")] use serde::Serialize; use thiserror::Error; @@ -40,14 +40,7 @@ use std::{fmt, mem, str}; #[doc(hidden)] #[derive(Clone, Copy, Debug)] -#[cfg_attr( - any(feature = "serial-pass", feature = "trace"), - derive(serde::Serialize) -)] -#[cfg_attr( - any(feature = "serial-pass", feature = "replay"), - derive(serde::Deserialize) -)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum ComputeCommand { SetBindGroup { index: u32, @@ -98,16 +91,16 @@ pub enum ComputeCommand { EndPipelineStatisticsQuery, } -#[cfg_attr(feature = "serial-pass", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct ComputePass { base: BasePass, parent_id: id::CommandEncoderId, timestamp_writes: Option, // Resource binding dedupe state. - #[cfg_attr(feature = "serial-pass", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] current_bind_groups: BindGroupStateChange, - #[cfg_attr(feature = "serial-pass", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] current_pipeline: StateChange, } @@ -151,8 +144,7 @@ impl fmt::Debug for ComputePass { /// Describes the writing of timestamp values in a compute pass. #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct ComputePassTimestampWrites { /// The query set to write the timestamps to. pub query_set: id::QuerySetId, diff --git a/wgpu-core/src/command/draw.rs b/wgpu-core/src/command/draw.rs index 058ba81f95..e03a78ee93 100644 --- a/wgpu-core/src/command/draw.rs +++ b/wgpu-core/src/command/draw.rs @@ -126,14 +126,7 @@ impl crate::error::PrettyError for RenderCommandError { } #[derive(Clone, Copy, Debug, Default)] -#[cfg_attr( - any(feature = "serial-pass", feature = "trace"), - derive(serde::Serialize) -)] -#[cfg_attr( - any(feature = "serial-pass", feature = "replay"), - derive(serde::Deserialize) -)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Rect { pub x: T, pub y: T, @@ -143,14 +136,7 @@ pub struct Rect { #[doc(hidden)] #[derive(Clone, Copy, Debug)] -#[cfg_attr( - any(feature = "serial-pass", feature = "trace"), - derive(serde::Serialize) -)] -#[cfg_attr( - any(feature = "serial-pass", feature = "replay"), - derive(serde::Deserialize) -)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum RenderCommand { SetBindGroup { index: u32, diff --git a/wgpu-core/src/command/mod.rs b/wgpu-core/src/command/mod.rs index 784d158bce..40ac0628f0 100644 --- a/wgpu-core/src/command/mod.rs +++ b/wgpu-core/src/command/mod.rs @@ -338,14 +338,7 @@ pub struct BasePassRef<'a, C> { /// [`InsertDebugMarker`]: RenderCommand::InsertDebugMarker #[doc(hidden)] #[derive(Debug)] -#[cfg_attr( - any(feature = "serial-pass", feature = "trace"), - derive(serde::Serialize) -)] -#[cfg_attr( - any(feature = "serial-pass", feature = "replay"), - derive(serde::Deserialize) -)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct BasePass { pub label: Option, diff --git a/wgpu-core/src/command/render.rs b/wgpu-core/src/command/render.rs index 9f31d3c6d0..fedc6f7c89 100644 --- a/wgpu-core/src/command/render.rs +++ b/wgpu-core/src/command/render.rs @@ -40,9 +40,9 @@ use wgt::{ TextureViewDimension, VertexStepMode, }; -#[cfg(any(feature = "serial-pass", feature = "replay"))] +#[cfg(feature = "serde")] use serde::Deserialize; -#[cfg(any(feature = "serial-pass", feature = "trace"))] +#[cfg(feature = "serde")] use serde::Serialize; use std::sync::Arc; @@ -56,8 +56,7 @@ use super::{ /// Operation to perform to the output attachment at the start of a renderpass. #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum LoadOp { /// Clear the output attachment with the clear color. Clearing is faster than loading. @@ -69,8 +68,7 @@ pub enum LoadOp { /// Operation to perform to the output attachment at the end of a renderpass. #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum StoreOp { /// Discards the content of the render target. @@ -84,8 +82,7 @@ pub enum StoreOp { /// Describes an individual channel within a render pass, such as color, depth, or stencil. #[repr(C)] #[derive(Clone, Debug, Eq, PartialEq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct PassChannel { /// Operation to perform to the output attachment at the start of a /// renderpass. @@ -122,8 +119,7 @@ impl PassChannel { /// Describes a color attachment to a render pass. #[repr(C)] #[derive(Clone, Debug, PartialEq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct RenderPassColorAttachment { /// The view to use as an attachment. pub view: id::TextureViewId, @@ -136,8 +132,7 @@ pub struct RenderPassColorAttachment { /// Describes a depth/stencil attachment to a render pass. #[repr(C)] #[derive(Clone, Debug, PartialEq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct RenderPassDepthStencilAttachment { /// The view to use as an attachment. pub view: id::TextureViewId, @@ -188,8 +183,7 @@ impl RenderPassDepthStencilAttachment { /// Location to write a timestamp to (beginning or end of the pass). #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum RenderPassTimestampLocation { Beginning = 0, @@ -199,8 +193,7 @@ pub enum RenderPassTimestampLocation { /// Describes the writing of timestamp values in a render pass. #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq)] -#[cfg_attr(any(feature = "serial-pass", feature = "trace"), derive(Serialize))] -#[cfg_attr(any(feature = "serial-pass", feature = "replay"), derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct RenderPassTimestampWrites { /// The query set to write the timestamp to. pub query_set: id::QuerySetId, @@ -224,7 +217,7 @@ pub struct RenderPassDescriptor<'a> { pub occlusion_query_set: Option, } -#[cfg_attr(feature = "serial-pass", derive(Deserialize, Serialize))] +#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] pub struct RenderPass { base: BasePass, parent_id: id::CommandEncoderId, @@ -234,9 +227,9 @@ pub struct RenderPass { occlusion_query_set_id: Option, // Resource binding dedupe state. - #[cfg_attr(feature = "serial-pass", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] current_bind_groups: BindGroupStateChange, - #[cfg_attr(feature = "serial-pass", serde(skip))] + #[cfg_attr(feature = "serde", serde(skip))] current_pipeline: StateChange, } diff --git a/wgpu-core/src/device/mod.rs b/wgpu-core/src/device/mod.rs index c417952c40..2d53026162 100644 --- a/wgpu-core/src/device/mod.rs +++ b/wgpu-core/src/device/mod.rs @@ -42,15 +42,14 @@ pub type DeviceDescriptor<'a> = wgt::DeviceDescriptor>; #[repr(C)] #[derive(Clone, Copy, Debug, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum HostMap { Read, Write, } #[derive(Clone, Debug, Hash, PartialEq)] -#[cfg_attr(feature = "serial-pass", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub(crate) struct AttachmentData { pub colors: ArrayVec, { hal::MAX_COLOR_ATTACHMENTS }>, pub resolves: ArrayVec, @@ -74,7 +73,7 @@ pub enum RenderPassCompatibilityCheckType { } #[derive(Clone, Debug, Hash, PartialEq)] -#[cfg_attr(feature = "serial-pass", derive(serde::Deserialize, serde::Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub(crate) struct RenderPassContext { pub attachments: AttachmentData, pub sample_count: u32, @@ -457,8 +456,7 @@ pub struct MissingFeatures(pub wgt::Features); pub struct MissingDownlevelFlags(pub wgt::DownlevelFlags); #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImplicitPipelineContext { pub root_id: id::PipelineLayoutId, pub group_ids: ArrayVec, diff --git a/wgpu-core/src/device/trace.rs b/wgpu-core/src/device/trace.rs index 315b7e8e84..0802b610d8 100644 --- a/wgpu-core/src/device/trace.rs +++ b/wgpu-core/src/device/trace.rs @@ -33,8 +33,7 @@ pub(crate) fn new_render_bundle_encoder_descriptor<'a>( #[allow(clippy::large_enum_variant)] #[derive(Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Action<'a> { Init { desc: crate::device::DeviceDescriptor<'a>, @@ -126,8 +125,7 @@ pub enum Action<'a> { } #[derive(Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Command { CopyBufferToBuffer { src: id::BufferId, diff --git a/wgpu-core/src/id.rs b/wgpu-core/src/id.rs index 739beb7180..f55a077f6a 100644 --- a/wgpu-core/src/id.rs +++ b/wgpu-core/src/id.rs @@ -67,8 +67,7 @@ pub struct Id(NonZeroId, PhantomData); // This type represents Id in a more readable (and editable) way. #[allow(dead_code)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] enum SerialId { // The only variant forces RON to not ignore "Id" Id(Index, Epoch, Backend), diff --git a/wgpu-core/src/lib.rs b/wgpu-core/src/lib.rs index 74c27bd960..5413be6b63 100644 --- a/wgpu-core/src/lib.rs +++ b/wgpu-core/src/lib.rs @@ -13,9 +13,9 @@ //! [https://renderdoc.org/](https://renderdoc.org/) //! - **`strict_asserts`** --- Apply run-time checks, even in release builds. These are in addition //! to the validation carried out at public APIs in all builds. +//! - **`serde`** --- Enables serialization via `serde` on common wgpu types. //! - **`trace`** --- Enable API tracing. //! - **`replay`** --- Enable API replaying -//! - **`serial-pass`** --- Enable serializable compute/render passes, and bundle encoders. //! - **`wgsl`** --- Enable `ShaderModuleSource::Wgsl` //! - **`fragile-send-sync-non-atomic-wasm`** --- Implement `Send` and `Sync` on Wasm, but only if //! atomics are not enabled. diff --git a/wgpu-core/src/pipeline.rs b/wgpu-core/src/pipeline.rs index 7fb45321f0..b6c3bf5bfe 100644 --- a/wgpu-core/src/pipeline.rs +++ b/wgpu-core/src/pipeline.rs @@ -38,8 +38,7 @@ pub enum ShaderModuleSource<'a> { } #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ShaderModuleDescriptor<'a> { pub label: Label<'a>, #[cfg_attr(feature = "serde", serde(default))] @@ -208,8 +207,7 @@ impl CreateShaderModuleError { /// Describes a programmable pipeline stage. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ProgrammableStageDescriptor<'a> { /// The compiled shader module for this stage. pub module: ShaderModuleId, @@ -236,8 +234,7 @@ pub enum ImplicitLayoutError { /// Describes a compute pipeline. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ComputePipelineDescriptor<'a> { pub label: Label<'a>, /// The layout of bind groups for this pipeline. @@ -311,8 +308,7 @@ impl ComputePipeline { /// Describes how the vertex buffer is interpreted. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct VertexBufferLayout<'a> { /// The stride, in bytes, between elements of this buffer. @@ -325,8 +321,7 @@ pub struct VertexBufferLayout<'a> { /// Describes the vertex process in a render pipeline. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct VertexState<'a> { /// The compiled vertex stage and its entry point. pub stage: ProgrammableStageDescriptor<'a>, @@ -336,8 +331,7 @@ pub struct VertexState<'a> { /// Describes fragment processing in a render pipeline. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct FragmentState<'a> { /// The compiled fragment stage and its entry point. pub stage: ProgrammableStageDescriptor<'a>, @@ -347,8 +341,7 @@ pub struct FragmentState<'a> { /// Describes a render (graphics) pipeline. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct RenderPipelineDescriptor<'a> { pub label: Label<'a>, /// The layout of bind groups for this pipeline. @@ -356,13 +349,13 @@ pub struct RenderPipelineDescriptor<'a> { /// The vertex processing state for this pipeline. pub vertex: VertexState<'a>, /// The properties of the pipeline at the primitive assembly and rasterization level. - #[cfg_attr(any(feature = "replay", feature = "trace"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub primitive: wgt::PrimitiveState, /// The effect of draw calls on the depth and stencil aspects of the output target, if any. - #[cfg_attr(any(feature = "replay", feature = "trace"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub depth_stencil: Option, /// The multi-sampling properties of the pipeline. - #[cfg_attr(any(feature = "replay", feature = "trace"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub multisample: wgt::MultisampleState, /// The fragment processing state for this pipeline. pub fragment: Option>, diff --git a/wgpu-core/src/resource.rs b/wgpu-core/src/resource.rs index b08216eeeb..85384939f6 100644 --- a/wgpu-core/src/resource.rs +++ b/wgpu-core/src/resource.rs @@ -1186,8 +1186,8 @@ impl Borrow for Texture { /// Describes a [`TextureView`]. #[derive(Clone, Debug, Default, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize), serde(default))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", serde(default))] pub struct TextureViewDescriptor<'a> { /// Debug label of the texture view. /// @@ -1343,8 +1343,7 @@ impl Resource for TextureView { /// Describes a [`Sampler`] #[derive(Clone, Debug, PartialEq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct SamplerDescriptor<'a> { /// Debug label of the sampler. /// diff --git a/wgpu-info/Cargo.toml b/wgpu-info/Cargo.toml index a729bbc885..59fc074fa8 100644 --- a/wgpu-info/Cargo.toml +++ b/wgpu-info/Cargo.toml @@ -17,4 +17,4 @@ pico-args.workspace = true serde.workspace = true serde_json.workspace = true wgpu.workspace = true -wgpu-types = { workspace = true, features = ["trace", "replay"] } +wgpu-types = { workspace = true, features = ["serde"] } diff --git a/wgpu-types/Cargo.toml b/wgpu-types/Cargo.toml index 7528b18c0a..ff3649f24b 100644 --- a/wgpu-types/Cargo.toml +++ b/wgpu-types/Cargo.toml @@ -28,8 +28,6 @@ targets = [ [lib] [features] -trace = ["serde"] -replay = ["serde"] strict_asserts = [] fragile-send-sync-non-atomic-wasm = [] diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index fa2a8df5f8..7c39c32e03 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -10,7 +10,9 @@ #![warn(missing_docs, unsafe_op_in_unsafe_fn)] #[cfg(any(feature = "serde", test))] -use serde::{Deserialize, Serialize}; +use serde::Deserialize; +#[cfg(any(feature = "serde", test))] +use serde::Serialize; use std::hash::{Hash, Hasher}; use std::path::PathBuf; use std::{num::NonZeroU32, ops::Range}; @@ -128,8 +130,7 @@ impl Backend { /// https://gpuweb.github.io/gpuweb/#enumdef-gpupowerpreference). #[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum PowerPreference { #[default] @@ -197,8 +198,7 @@ impl From for Backends { /// https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions). #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct RequestAdapterOptions { /// Power preference for the adapter. pub power_preference: PowerPreference, @@ -989,7 +989,7 @@ impl InstanceFlags { /// [`downlevel_defaults()`]: Limits::downlevel_defaults #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase", default))] pub struct Limits { /// Maximum allowed value for the `size.width` of a texture created with `TextureDimension::D1`. @@ -1664,8 +1664,7 @@ pub struct AdapterInfo { /// https://gpuweb.github.io/gpuweb/#gpudevicedescriptor). #[repr(C)] #[derive(Clone, Debug, Default)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct DeviceDescriptor { /// Debug label for the device. pub label: L, @@ -1727,8 +1726,7 @@ impl_bitflags!(ShaderStages); /// https://gpuweb.github.io/gpuweb/#enumdef-gputextureviewdimension). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum TextureViewDimension { /// A one dimensional texture. `texture_1d` in WGSL and `texture1D` in GLSL. #[cfg_attr(feature = "serde", serde(rename = "1d"))] @@ -1772,8 +1770,7 @@ impl TextureViewDimension { /// used with the first render target. #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum BlendFactor { /// 0.0 @@ -1835,8 +1832,7 @@ impl BlendFactor { /// https://gpuweb.github.io/gpuweb/#enumdef-gpublendoperation). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum BlendOperation { /// Src + Dst @@ -1858,8 +1854,7 @@ pub enum BlendOperation { /// https://gpuweb.github.io/gpuweb/#dictdef-gpublendcomponent). #[repr(C)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct BlendComponent { /// Multiplier for the source, which is produced by the fragment shader. @@ -1914,8 +1909,7 @@ impl Default for BlendComponent { /// https://gpuweb.github.io/gpuweb/#dictdef-gpublendstate). #[repr(C)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct BlendState { /// Color equation. @@ -1954,8 +1948,7 @@ impl BlendState { /// https://gpuweb.github.io/gpuweb/#dictdef-gpucolortargetstate). #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct ColorTargetState { /// The [`TextureFormat`] of the image that this pipeline will render to. Must match the format @@ -1987,8 +1980,7 @@ impl From for ColorTargetState { /// https://gpuweb.github.io/gpuweb/#enumdef-gpuprimitivetopology). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum PrimitiveTopology { /// Vertex data is a list of points. Each vertex is a new point. @@ -2028,8 +2020,7 @@ impl PrimitiveTopology { /// https://gpuweb.github.io/gpuweb/#enumdef-gpufrontface). #[repr(C)] #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum FrontFace { /// Triangles with vertices in counter clockwise order are considered the front face. @@ -2050,8 +2041,7 @@ pub enum FrontFace { /// except that the `"none"` value is represented using `Option` instead. #[repr(C)] #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum Face { /// Front face @@ -2063,8 +2053,7 @@ pub enum Face { /// Type of drawing mode for polygons #[repr(C)] #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum PolygonMode { /// Polygons are filled @@ -2082,8 +2071,7 @@ pub enum PolygonMode { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuprimitivestate). #[repr(C)] #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct PrimitiveState { /// The primitive topology used to interpret vertices. @@ -2123,8 +2111,7 @@ pub struct PrimitiveState { /// https://gpuweb.github.io/gpuweb/#dictdef-gpumultisamplestate). #[repr(C)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct MultisampleState { /// The number of samples calculated per pixel (for MSAA). For non-multisampled textures, @@ -2223,7 +2210,7 @@ pub struct TextureFormatFeatures { /// ASTC block dimensions #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum AstcBlock { /// 4x4 block compressed texture. 16 bytes per block (8 bit/px). B4x4, @@ -2258,7 +2245,7 @@ pub enum AstcBlock { /// ASTC RGBA channel #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum AstcChannel { /// 8 bit integer RGBA, [0, 255] converted to/from linear-color float [0, 1] in shader. /// @@ -4366,8 +4353,7 @@ impl MaintainResult { /// https://gpuweb.github.io/gpuweb/#dictdef-gpudepthstencilstate). #[repr(C)] #[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct StencilState { /// Front face mode. pub front: StencilFaceState, @@ -4414,8 +4400,7 @@ impl StencilState { /// https://gpuweb.github.io/gpuweb/#dictdef-gpudepthstencilstate). #[repr(C)] #[derive(Clone, Copy, Debug, Default)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct DepthBiasState { /// Constant depth biasing factor, in basic units of the depth format. pub constant: i32, @@ -4456,8 +4441,7 @@ impl Eq for DepthBiasState {} /// https://gpuweb.github.io/gpuweb/#dictdef-gpudepthstencilstate). #[repr(C)] #[derive(Clone, Debug, Hash, PartialEq, Eq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct DepthStencilState { /// Format of the depth/stencil buffer, must be special depth format. Must match the format /// of the depth/stencil attachment in [`CommandEncoder::begin_render_pass`][CEbrp]. @@ -4469,10 +4453,10 @@ pub struct DepthStencilState { /// Comparison function used to compare depth values in the depth test. pub depth_compare: CompareFunction, /// Stencil state. - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub stencil: StencilState, /// Depth bias state. - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub bias: DepthBiasState, } @@ -4504,7 +4488,7 @@ impl DepthStencilState { /// https://gpuweb.github.io/gpuweb/#enumdef-gpuindexformat). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum IndexFormat { /// Indices are 16 bit unsigned integers. @@ -4520,8 +4504,7 @@ pub enum IndexFormat { /// https://gpuweb.github.io/gpuweb/#enumdef-gpustenciloperation). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum StencilOperation { /// Keep stencil value unchanged. @@ -4554,8 +4537,7 @@ pub enum StencilOperation { /// https://gpuweb.github.io/gpuweb/#dictdef-gpustencilfacestate). #[repr(C)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct StencilFaceState { /// Comparison function that determines if the fail_op or pass_op is used on the stencil buffer. @@ -4605,8 +4587,7 @@ impl Default for StencilFaceState { /// https://gpuweb.github.io/gpuweb/#enumdef-gpucomparefunction). #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum CompareFunction { /// Function never passes @@ -4700,8 +4681,7 @@ impl CompareFunction { /// [`Instance`]: VertexStepMode::Instance #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum VertexStepMode { /// Vertex data is advanced every vertex. @@ -4722,8 +4702,7 @@ pub enum VertexStepMode { /// [`vertex_attr_array`]: ../wgpu/macro.vertex_attr_array.html #[repr(C)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct VertexAttribute { /// Format of the input @@ -4740,8 +4719,7 @@ pub struct VertexAttribute { /// https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat). #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))] pub enum VertexFormat { /// Two unsigned bytes (u8). `vec2` in shaders. @@ -4900,8 +4878,7 @@ impl_bitflags!(BufferUsages); /// https://gpuweb.github.io/gpuweb/#dictdef-gpubufferdescriptor). #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct BufferDescriptor { /// Debug label of a buffer. This will show up in graphics debuggers for easy identification. pub label: L, @@ -4935,8 +4912,7 @@ impl BufferDescriptor { /// Corresponds to [WebGPU `GPUCommandEncoderDescriptor`]( /// https://gpuweb.github.io/gpuweb/#dictdef-gpucommandencoderdescriptor). #[repr(C)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct CommandEncoderDescriptor { /// Debug label for the command encoder. This will show up in graphics debuggers for easy identification. @@ -4961,8 +4937,7 @@ impl Default for CommandEncoderDescriptor> { /// Behavior of the presentation engine based on frame rate. #[repr(C)] #[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum PresentMode { /// Chooses FifoRelaxed -> Fifo based on availability. /// @@ -5034,8 +5009,7 @@ pub enum PresentMode { /// compositing. #[repr(C)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))] pub enum CompositeAlphaMode { /// Chooses either `Opaque` or `Inherit` automatically,depending on the @@ -5134,8 +5108,7 @@ impl Default for SurfaceCapabilities { /// [`Surface`]: ../wgpu/struct.Surface.html #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct SurfaceConfiguration { /// The usage of the swap chain. The only supported usage is `RENDER_ATTACHMENT`. pub usage: TextureUsages, @@ -5261,7 +5234,7 @@ impl PresentationTimestamp { /// This is not to be used as a generic color type, only for specific wgpu interfaces. #[repr(C)] #[derive(Clone, Copy, Debug, Default, PartialEq)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct Color { /// Red component of the color @@ -5320,8 +5293,7 @@ impl Color { /// https://gpuweb.github.io/gpuweb/#enumdef-gputexturedimension). #[repr(C)] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum TextureDimension { /// 1D texture #[cfg_attr(feature = "serde", serde(rename = "1d"))] @@ -5340,8 +5312,7 @@ pub enum TextureDimension { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuorigin2ddict). #[repr(C)] #[derive(Clone, Copy, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct Origin2d { /// @@ -5376,8 +5347,7 @@ impl std::fmt::Debug for Origin2d { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuorigin3ddict). #[repr(C)] #[derive(Clone, Copy, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct Origin3d { /// X position of the origin @@ -5419,8 +5389,7 @@ impl std::fmt::Debug for Origin3d { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuextent3ddict). #[repr(C)] #[derive(Clone, Copy, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct Extent3d { /// Width of the extent @@ -5619,8 +5588,7 @@ fn test_max_mips() { /// https://gpuweb.github.io/gpuweb/#dictdef-gputexturedescriptor). #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct TextureDescriptor { /// Debug label of the texture. This will show up in graphics debuggers for easy identification. pub label: L, @@ -5751,8 +5719,7 @@ impl TextureDescriptor { /// https://gpuweb.github.io/gpuweb/#enumdef-gputextureaspect). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum TextureAspect { /// Depth, Stencil, and Color. @@ -5776,8 +5743,7 @@ pub enum TextureAspect { /// https://gpuweb.github.io/gpuweb/#enumdef-gpuaddressmode). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum AddressMode { /// Clamp the value to the edge of the texture @@ -5810,8 +5776,7 @@ pub enum AddressMode { /// https://gpuweb.github.io/gpuweb/#enumdef-gpufiltermode). #[repr(C)] #[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum FilterMode { /// Nearest neighbor sampling. @@ -5827,8 +5792,7 @@ pub enum FilterMode { /// A range of push constant memory to pass to a shader stage. #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct PushConstantRange { /// Stage push constant range is visible from. Each stage can only be served by at most one range. /// One range can serve multiple stages however. @@ -5844,8 +5808,7 @@ pub struct PushConstantRange { /// https://gpuweb.github.io/gpuweb/#dictdef-gpucommandbufferdescriptor). #[repr(C)] #[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct CommandBufferDescriptor { /// Debug label of this command buffer. pub label: L, @@ -5866,8 +5829,7 @@ impl CommandBufferDescriptor { /// https://gpuweb.github.io/gpuweb/#dictdef-gpurenderbundleencoderdescriptor). #[repr(C)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct RenderBundleDepthStencil { /// Format of the attachment. pub format: TextureFormat, @@ -5894,8 +5856,7 @@ pub struct RenderBundleDepthStencil { /// https://gpuweb.github.io/gpuweb/#dictdef-gpurenderbundledescriptor). #[repr(C)] #[derive(Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct RenderBundleDescriptor { /// Debug label of the render bundle encoder. This will show up in graphics debuggers for easy identification. pub label: L, @@ -5931,8 +5892,7 @@ impl Default for RenderBundleDescriptor> { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuimagedatalayout). #[repr(C)] #[derive(Clone, Copy, Debug, Default)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImageDataLayout { /// Offset into the buffer that is the start of the texture. Must be a multiple of texture block size. /// For non-compressed textures, this is 1. @@ -5972,8 +5932,7 @@ pub struct ImageDataLayout { /// Corresponds to [WebGPU `GPUBufferBindingType`]( /// https://gpuweb.github.io/gpuweb/#enumdef-gpubufferbindingtype). #[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum BufferBindingType { /// A buffer for uniform values. /// @@ -6038,8 +5997,7 @@ pub enum BufferBindingType { /// Corresponds to [WebGPU `GPUTextureSampleType`]( /// https://gpuweb.github.io/gpuweb/#enumdef-gputexturesampletype). #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum TextureSampleType { /// Sampling returns floats. /// @@ -6121,8 +6079,7 @@ impl Default for TextureSampleType { /// Corresponds to [WebGPU `GPUStorageTextureAccess`]( /// https://gpuweb.github.io/gpuweb/#enumdef-gpustoragetextureaccess). #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum StorageTextureAccess { /// The texture can only be written in the shader and it: @@ -6184,8 +6141,7 @@ pub enum StorageTextureAccess { /// https://gpuweb.github.io/gpuweb/#enumdef-gpusamplerbindingtype). #[repr(C)] #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum SamplerBindingType { /// The sampling result is produced based on more than a single color sample from a texture, @@ -6205,8 +6161,7 @@ pub enum SamplerBindingType { /// Corresponds to WebGPU's mutually exclusive fields within [`GPUBindGroupLayoutEntry`]( /// https://gpuweb.github.io/gpuweb/#dictdef-gpubindgrouplayoutentry). #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum BindingType { /// A buffer binding. /// @@ -6222,7 +6177,7 @@ pub enum BindingType { /// for each dynamic binding in increasing order of binding number. /// /// [RPsbg]: ../wgpu/struct.RenderPass.html#method.set_bind_group - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] has_dynamic_offset: bool, /// The minimum size for a [`BufferBinding`] matching this entry, in bytes. @@ -6250,7 +6205,7 @@ pub enum BindingType { /// [minimum buffer binding size]: https://www.w3.org/TR/webgpu/#minimum-buffer-binding-size /// [`create_render_pipeline`]: ../wgpu/struct.Device.html#method.create_render_pipeline /// [`create_compute_pipeline`]: ../wgpu/struct.Device.html#method.create_compute_pipeline - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] min_binding_size: Option, }, /// A sampler that can be used to sample a texture. @@ -6355,8 +6310,7 @@ impl BindingType { /// Corresponds to [WebGPU `GPUBindGroupLayoutEntry`]( /// https://gpuweb.github.io/gpuweb/#dictdef-gpubindgrouplayoutentry). #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "trace", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct BindGroupLayoutEntry { /// Binding index. Must match shader index and be unique inside a BindGroupLayout. A binding /// of index 1, would be described as `layout(set = 0, binding = 1) uniform` in shaders. @@ -6370,7 +6324,7 @@ pub struct BindGroupLayoutEntry { /// If this value is Some and `ty` is `BindingType::Texture`, [`Features::TEXTURE_BINDING_ARRAY`] must be supported. /// /// If this value is Some and `ty` is any other variant, bind group creation will fail. - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub count: Option, } @@ -6380,8 +6334,7 @@ pub struct BindGroupLayoutEntry { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuimagecopybuffer). #[repr(C)] #[derive(Copy, Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImageCopyBuffer { /// The buffer to be copied to/from. pub buffer: B, @@ -6395,8 +6348,7 @@ pub struct ImageCopyBuffer { /// https://gpuweb.github.io/gpuweb/#dictdef-gpuimagecopytexture). #[repr(C)] #[derive(Copy, Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImageCopyTexture { /// The texture to be copied to/from. pub texture: T, @@ -6405,10 +6357,10 @@ pub struct ImageCopyTexture { /// The base texel of the texture in the selected `mip_level`. Together /// with the `copy_size` argument to copy functions, defines the /// sub-region of the texture to copy. - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub origin: Origin3d, /// The copy aspect. - #[cfg_attr(any(feature = "trace", feature = "replay"), serde(default))] + #[cfg_attr(feature = "serde", serde(default))] pub aspect: TextureAspect, } @@ -6528,8 +6480,7 @@ unsafe impl Sync for ExternalImageSource {} /// Corresponds to [HTML Canvas `PredefinedColorSpace`]( /// https://html.spec.whatwg.org/multipage/canvas.html#predefinedcolorspace). #[derive(Copy, Clone, Debug, PartialEq, Eq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] pub enum PredefinedColorSpace { /// sRGB color space @@ -6544,8 +6495,7 @@ pub enum PredefinedColorSpace { /// Corresponds to [WebGPU `GPUImageCopyTextureTagged`]( /// https://gpuweb.github.io/gpuweb/#dictdef-gpuimagecopytexturetagged). #[derive(Copy, Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ImageCopyTextureTagged { /// The texture to be copied to/from. pub texture: T, @@ -6576,8 +6526,7 @@ impl ImageCopyTextureTagged { /// Subresource range within an image #[repr(C)] #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] pub struct ImageSubresourceRange { /// Aspect of the texture. Color textures must be [`TextureAspect::All`][TAA]. @@ -6678,8 +6627,7 @@ impl ImageSubresourceRange { /// Color variation to use when sampler addressing mode is [`AddressMode::ClampToBorder`] #[repr(C)] #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum SamplerBorderColor { /// [0, 0, 0, 0] TransparentBlack, @@ -6701,8 +6649,7 @@ pub enum SamplerBorderColor { /// Corresponds to [WebGPU `GPUQuerySetDescriptor`]( /// https://gpuweb.github.io/gpuweb/#dictdef-gpuquerysetdescriptor). #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct QuerySetDescriptor { /// Debug label for the query set. pub label: L, @@ -6729,8 +6676,7 @@ impl QuerySetDescriptor { /// Corresponds to [WebGPU `GPUQueryType`]( /// https://gpuweb.github.io/gpuweb/#enumdef-gpuquerytype). #[derive(Copy, Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum QueryType { /// Query returns a single 64-bit number, serving as an occlusion boolean. Occlusion, @@ -6876,8 +6822,7 @@ impl DispatchIndirectArgs { /// Describes how shader bound checks should be performed. #[derive(Clone, Debug)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ShaderBoundChecks { runtime_checks: bool, } diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml index cc97e4d249..a0c1926713 100644 --- a/wgpu/Cargo.toml +++ b/wgpu/Cargo.toml @@ -78,6 +78,9 @@ strict_asserts = ["wgc?/strict_asserts", "wgt/strict_asserts"] ## Log all API entry points at info instead of trace level. api_log_info = ["wgc/api_log_info"] +## Enables serialization via `serde` on common wgpu types. +serde = ["dep:serde", "wgc/serde"] + ## Allow writing of trace capture files. ## See [`Adapter::request_device`]. trace = ["serde", "wgc/trace"] diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 9b4af33cd6..b963fa695b 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -37,6 +37,7 @@ //! - **`strict_asserts`** --- Apply run-time checks, even in release builds. These are in addition //! to the validation carried out at public APIs in all builds. //! - **`api_log_info`** --- Log all API entry points at info instead of trace level. +//! - **`serde`** --- Enables serialization via `serde` on common wgpu types. //! - **`trace`** --- Allow writing of trace capture files. See [`Adapter::request_device`]. //! - **`replay`** --- Allow deserializing of trace capture files that were written with the `trace` //! feature. To replay a trace file use the [wgpu @@ -1115,8 +1116,7 @@ static_assertions::assert_impl_all!(BufferBinding<'_>: Send, Sync); /// Corresponds to [WebGPU `GPULoadOp`](https://gpuweb.github.io/gpuweb/#enumdef-gpuloadop), /// plus the corresponding clearValue. #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum LoadOp { /// Loads the specified value for this attachment into the render pass. /// @@ -1143,8 +1143,7 @@ impl Default for LoadOp { /// /// Corresponds to [WebGPU `GPUStoreOp`](https://gpuweb.github.io/gpuweb/#enumdef-gpustoreop). #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Default)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum StoreOp { /// Stores the resulting value of the render pass for this attachment. #[default] @@ -1166,8 +1165,7 @@ pub enum StoreOp { /// This type is unique to the Rust API of `wgpu`. In the WebGPU specification, /// separate `loadOp` and `storeOp` fields are used instead. #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)] -#[cfg_attr(feature = "trace", derive(serde::Serialize))] -#[cfg_attr(feature = "replay", derive(serde::Deserialize))] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Operations { /// How data should be read through this attachment. pub load: LoadOp,