From 93afb46fc5f6bb9a1acd0bee0a3b55b3d17a4a2d Mon Sep 17 00:00:00 2001 From: sagudev <16504129+sagudev@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:32:59 +0200 Subject: [PATCH 1/4] Split `MipmapFilterMode` from `FilterMode` Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --- deno_webgpu/sampler.rs | 21 ++++++++++++--- examples/features/src/bunnymark/mod.rs | 2 +- examples/features/src/mipmap/mod.rs | 4 +-- .../src/multiple_render_targets/mod.rs | 4 +-- examples/features/src/ray_cube_compute/mod.rs | 2 +- examples/features/src/ray_cube_normals/mod.rs | 2 +- .../features/src/ray_traced_triangle/mod.rs | 2 +- examples/features/src/shadow/mod.rs | 2 +- examples/features/src/skybox/mod.rs | 2 +- examples/features/src/water/mod.rs | 2 +- tests/tests/wgpu-gpu/bind_groups.rs | 8 +++--- .../tests/wgpu-gpu/binding_array/samplers.rs | 4 +-- tests/tests/wgpu-gpu/samplers.rs | 8 +++--- wgpu-core/src/device/resource.rs | 6 ++--- wgpu-core/src/resource.rs | 11 ++++++-- wgpu-hal/examples/halmark/main.rs | 2 +- wgpu-hal/src/gles/conv.rs | 11 ++++---- wgpu-hal/src/lib.rs | 2 +- wgpu-hal/src/vulkan/conv.rs | 6 ++--- wgpu-types/src/lib.rs | 26 ++++++++++++++++--- wgpu/src/backend/webgpu.rs | 6 ++--- wgpu/src/lib.rs | 22 ++++++++-------- 22 files changed, 99 insertions(+), 56 deletions(-) diff --git a/deno_webgpu/sampler.rs b/deno_webgpu/sampler.rs index c6dd44339f3..c1b5f483f1c 100644 --- a/deno_webgpu/sampler.rs +++ b/deno_webgpu/sampler.rs @@ -66,8 +66,8 @@ pub(super) struct GPUSamplerDescriptor { pub mag_filter: GPUFilterMode, #[webidl(default = GPUFilterMode::Nearest)] pub min_filter: GPUFilterMode, - #[webidl(default = GPUFilterMode::Nearest)] - pub mipmap_filter: GPUFilterMode, + #[webidl(default = GPUMipmapFilterMode::Nearest)] + pub mipmap_filter: GPUMipmapFilterMode, #[webidl(default = 0.0)] pub lod_min_clamp: f32, @@ -99,7 +99,6 @@ impl From for wgpu_types::AddressMode { } } -// Same as GPUMipmapFilterMode #[derive(WebIDL)] #[webidl(enum)] pub(crate) enum GPUFilterMode { @@ -116,6 +115,22 @@ impl From for wgpu_types::FilterMode { } } +#[derive(WebIDL)] +#[webidl(enum)] +pub(crate) enum GPUMipmapFilterMode { + Nearest, + Linear, +} + +impl From for wgpu_types::MipmapFilterMode { + fn from(value: GPUMipmapFilterMode) -> Self { + match value { + GPUMipmapFilterMode::Nearest => Self::Nearest, + GPUMipmapFilterMode::Linear => Self::Linear, + } + } +} + #[derive(WebIDL)] #[webidl(enum)] pub(crate) enum GPUCompareFunction { diff --git a/examples/features/src/bunnymark/mod.rs b/examples/features/src/bunnymark/mod.rs index 233fe8ba539..797a8b90519 100644 --- a/examples/features/src/bunnymark/mod.rs +++ b/examples/features/src/bunnymark/mod.rs @@ -278,7 +278,7 @@ impl crate::framework::Example for Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); diff --git a/examples/features/src/mipmap/mod.rs b/examples/features/src/mipmap/mod.rs index 3875bc3a76a..82c965d29d4 100644 --- a/examples/features/src/mipmap/mod.rs +++ b/examples/features/src/mipmap/mod.rs @@ -117,7 +117,7 @@ impl Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); @@ -268,7 +268,7 @@ impl crate::framework::Example for Example { address_mode_w: wgpu::AddressMode::Repeat, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::MipmapFilterMode::Linear, ..Default::default() }); let mx_total = Self::generate_matrix(config.width as f32 / config.height as f32); diff --git a/examples/features/src/multiple_render_targets/mod.rs b/examples/features/src/multiple_render_targets/mod.rs index d708f701f0b..0f4d5aeb68d 100644 --- a/examples/features/src/multiple_render_targets/mod.rs +++ b/examples/features/src/multiple_render_targets/mod.rs @@ -121,7 +121,7 @@ impl MultiTargetRenderer { address_mode_w: wgpu::AddressMode::Repeat, mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); @@ -240,7 +240,7 @@ impl TargetRenderer { address_mode_w: wgpu::AddressMode::Repeat, mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); diff --git a/examples/features/src/ray_cube_compute/mod.rs b/examples/features/src/ray_cube_compute/mod.rs index 3d875b1c745..a120aae6c76 100644 --- a/examples/features/src/ray_cube_compute/mod.rs +++ b/examples/features/src/ray_cube_compute/mod.rs @@ -200,7 +200,7 @@ impl crate::framework::Example for Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); diff --git a/examples/features/src/ray_cube_normals/mod.rs b/examples/features/src/ray_cube_normals/mod.rs index 4620b7551c0..664bdfec2ed 100644 --- a/examples/features/src/ray_cube_normals/mod.rs +++ b/examples/features/src/ray_cube_normals/mod.rs @@ -189,7 +189,7 @@ impl crate::framework::Example for Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); diff --git a/examples/features/src/ray_traced_triangle/mod.rs b/examples/features/src/ray_traced_triangle/mod.rs index 0df2e829d2b..b61d0cc3a1f 100644 --- a/examples/features/src/ray_traced_triangle/mod.rs +++ b/examples/features/src/ray_traced_triangle/mod.rs @@ -257,7 +257,7 @@ impl crate::framework::Example for Example { address_mode_w: Default::default(), mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, lod_min_clamp: 1.0, lod_max_clamp: 1.0, compare: None, diff --git a/examples/features/src/shadow/mod.rs b/examples/features/src/shadow/mod.rs index b89d2c902dc..a112e6bd1ae 100644 --- a/examples/features/src/shadow/mod.rs +++ b/examples/features/src/shadow/mod.rs @@ -366,7 +366,7 @@ impl crate::framework::Example for Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, compare: Some(wgpu::CompareFunction::LessEqual), ..Default::default() }); diff --git a/examples/features/src/skybox/mod.rs b/examples/features/src/skybox/mod.rs index 699f6615ba9..c45779a37c2 100644 --- a/examples/features/src/skybox/mod.rs +++ b/examples/features/src/skybox/mod.rs @@ -263,7 +263,7 @@ impl crate::framework::Example for Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::MipmapFilterMode::Linear, ..Default::default() }); diff --git a/examples/features/src/water/mod.rs b/examples/features/src/water/mod.rs index 5d1241fce39..e287f6edf61 100644 --- a/examples/features/src/water/mod.rs +++ b/examples/features/src/water/mod.rs @@ -217,7 +217,7 @@ impl Example { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..Default::default() }); diff --git a/tests/tests/wgpu-gpu/bind_groups.rs b/tests/tests/wgpu-gpu/bind_groups.rs index a6924d34ead..a28a9617be2 100644 --- a/tests/tests/wgpu-gpu/bind_groups.rs +++ b/tests/tests/wgpu-gpu/bind_groups.rs @@ -192,7 +192,7 @@ static BIND_GROUP_NONFILTERING_LAYOUT_NONFILTERING_SAMPLER: GpuTestConfiguration label: Some("bind_group_non_filtering_layout_nonfiltering_sampler"), min_filter: wgpu::FilterMode::Nearest, mag_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..wgpu::SamplerDescriptor::default() }, true, @@ -210,7 +210,7 @@ static BIND_GROUP_NONFILTERING_LAYOUT_MIN_SAMPLER: GpuTestConfiguration = label: Some("bind_group_non_filtering_layout_min_sampler"), min_filter: wgpu::FilterMode::Linear, mag_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..wgpu::SamplerDescriptor::default() }, false, @@ -228,7 +228,7 @@ static BIND_GROUP_NONFILTERING_LAYOUT_MAG_SAMPLER: GpuTestConfiguration = label: Some("bind_group_non_filtering_layout_mag_sampler"), min_filter: wgpu::FilterMode::Nearest, mag_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, ..wgpu::SamplerDescriptor::default() }, false, @@ -246,7 +246,7 @@ static BIND_GROUP_NONFILTERING_LAYOUT_MIPMAP_SAMPLER: GpuTestConfiguration = label: Some("bind_group_non_filtering_layout_mipmap_sampler"), min_filter: wgpu::FilterMode::Nearest, mag_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::MipmapFilterMode::Linear, ..wgpu::SamplerDescriptor::default() }, false, diff --git a/tests/tests/wgpu-gpu/binding_array/samplers.rs b/tests/tests/wgpu-gpu/binding_array/samplers.rs index d8dfefe21fe..23f069b381e 100644 --- a/tests/tests/wgpu-gpu/binding_array/samplers.rs +++ b/tests/tests/wgpu-gpu/binding_array/samplers.rs @@ -120,7 +120,7 @@ async fn binding_array_samplers(ctx: TestingContext, partially_bound: bool) { address_mode_w: AddressMode::ClampToEdge, mag_filter: FilterMode::Linear, min_filter: FilterMode::Linear, - mipmap_filter: FilterMode::Linear, + mipmap_filter: MipmapFilterMode::Linear, lod_min_clamp: 0.0, lod_max_clamp: 1000.0, compare: None, @@ -134,7 +134,7 @@ async fn binding_array_samplers(ctx: TestingContext, partially_bound: bool) { address_mode_w: AddressMode::ClampToEdge, mag_filter: FilterMode::Nearest, min_filter: FilterMode::Nearest, - mipmap_filter: FilterMode::Nearest, + mipmap_filter: MipmapFilterMode::Nearest, lod_min_clamp: 0.0, lod_max_clamp: 1000.0, compare: None, diff --git a/tests/tests/wgpu-gpu/samplers.rs b/tests/tests/wgpu-gpu/samplers.rs index 6c8018302d5..9395332d4e9 100644 --- a/tests/tests/wgpu-gpu/samplers.rs +++ b/tests/tests/wgpu-gpu/samplers.rs @@ -37,7 +37,7 @@ fn sampler_deduplication(ctx: TestingContext) { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, lod_min_clamp: 0.0, lod_max_clamp: 100.0, compare: None, @@ -52,7 +52,7 @@ fn sampler_deduplication(ctx: TestingContext) { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::MipmapFilterMode::Linear, lod_min_clamp: 0.0, lod_max_clamp: 100.0, compare: None, @@ -96,7 +96,7 @@ fn sampler_creation_failure(ctx: TestingContext) { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, lod_min_clamp: 0.0, lod_max_clamp: 100.0, compare: None, @@ -397,7 +397,7 @@ fn sampler_bind_group(ctx: TestingContext, group_type: GroupType) { address_mode_w: wgpu::AddressMode::ClampToEdge, mag_filter: wgpu::FilterMode::Linear, min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::MipmapFilterMode::Nearest, lod_min_clamp: 0.0, lod_max_clamp: 100.0, compare: None, diff --git a/wgpu-core/src/device/resource.rs b/wgpu-core/src/device/resource.rs index 804e6103c31..81e907d13d5 100644 --- a/wgpu-core/src/device/resource.rs +++ b/wgpu-core/src/device/resource.rs @@ -1951,9 +1951,9 @@ impl Device { }, ); } - if !matches!(desc.mipmap_filter, wgt::FilterMode::Linear) { + if !matches!(desc.mipmap_filter, wgt::MipmapFilterMode::Linear) { return Err( - resource::CreateSamplerError::InvalidFilterModeWithAnisotropy { + resource::CreateSamplerError::InvalidMipmapFilterModeWithAnisotropy { filter_type: resource::SamplerFilterErrorType::MipmapFilter, filter_mode: desc.mipmap_filter, anisotropic_clamp: desc.anisotropy_clamp, @@ -1999,7 +1999,7 @@ impl Device { comparison: desc.compare.is_some(), filtering: desc.min_filter == wgt::FilterMode::Linear || desc.mag_filter == wgt::FilterMode::Linear - || desc.mipmap_filter == wgt::FilterMode::Linear, + || desc.mipmap_filter == wgt::MipmapFilterMode::Linear, }; let sampler = Arc::new(sampler); diff --git a/wgpu-core/src/resource.rs b/wgpu-core/src/resource.rs index 8d51298a711..41d2cad89a1 100644 --- a/wgpu-core/src/resource.rs +++ b/wgpu-core/src/resource.rs @@ -1908,7 +1908,7 @@ pub struct SamplerDescriptor<'a> { /// How to filter the texture when it needs to be minified (made smaller) pub min_filter: wgt::FilterMode, /// How to filter between mip map levels - pub mipmap_filter: wgt::FilterMode, + pub mipmap_filter: wgt::MipmapFilterMode, /// Minimum level of detail (i.e. mip level) to use pub lod_min_clamp: f32, /// Maximum level of detail (i.e. mip level) to use @@ -1989,6 +1989,12 @@ pub enum CreateSamplerError { filter_mode: wgt::FilterMode, anisotropic_clamp: u16, }, + #[error("Invalid filter mode for {filter_type:?}: {filter_mode:?}. When anistropic clamp is not 1 (it is {anisotropic_clamp}), all filter modes must be linear.")] + InvalidMipmapFilterModeWithAnisotropy { + filter_type: SamplerFilterErrorType, + filter_mode: wgt::MipmapFilterMode, + anisotropic_clamp: u16, + }, #[error(transparent)] MissingFeatures(#[from] MissingFeatures), } @@ -2008,7 +2014,8 @@ impl WebGpuError for CreateSamplerError { Self::InvalidLodMinClamp(_) | Self::InvalidLodMaxClamp { .. } | Self::InvalidAnisotropy(_) - | Self::InvalidFilterModeWithAnisotropy { .. } => return ErrorType::Validation, + | Self::InvalidFilterModeWithAnisotropy { .. } + | Self::InvalidMipmapFilterModeWithAnisotropy { .. } => return ErrorType::Validation, }; e.webgpu_error_type() } diff --git a/wgpu-hal/examples/halmark/main.rs b/wgpu-hal/examples/halmark/main.rs index c70e37bc12b..34f20695296 100644 --- a/wgpu-hal/examples/halmark/main.rs +++ b/wgpu-hal/examples/halmark/main.rs @@ -385,7 +385,7 @@ impl Example { address_modes: [wgpu_types::AddressMode::ClampToEdge; 3], mag_filter: wgpu_types::FilterMode::Linear, min_filter: wgpu_types::FilterMode::Nearest, - mipmap_filter: wgpu_types::FilterMode::Nearest, + mipmap_filter: wgpu_types::MipmapFilterMode::Nearest, lod_clamp: 0.0..32.0, compare: None, anisotropy_clamp: 1, diff --git a/wgpu-hal/src/gles/conv.rs b/wgpu-hal/src/gles/conv.rs index b9dd545d562..658165eeb1e 100644 --- a/wgpu-hal/src/gles/conv.rs +++ b/wgpu-hal/src/gles/conv.rs @@ -238,9 +238,10 @@ pub(super) fn describe_vertex_format(vertex_format: wgt::VertexFormat) -> super: pub fn map_filter_modes( min: wgt::FilterMode, mag: wgt::FilterMode, - mip: wgt::FilterMode, + mip: wgt::MipmapFilterMode, ) -> (u32, u32) { use wgt::FilterMode as Fm; + use wgt::MipmapFilterMode as Mfm; let mag_filter = match mag { Fm::Nearest => glow::NEAREST, @@ -248,10 +249,10 @@ pub fn map_filter_modes( }; let min_filter = match (min, mip) { - (Fm::Nearest, Fm::Nearest) => glow::NEAREST_MIPMAP_NEAREST, - (Fm::Nearest, Fm::Linear) => glow::NEAREST_MIPMAP_LINEAR, - (Fm::Linear, Fm::Nearest) => glow::LINEAR_MIPMAP_NEAREST, - (Fm::Linear, Fm::Linear) => glow::LINEAR_MIPMAP_LINEAR, + (Fm::Nearest, Mfm::Nearest) => glow::NEAREST_MIPMAP_NEAREST, + (Fm::Nearest, Mfm::Linear) => glow::NEAREST_MIPMAP_LINEAR, + (Fm::Linear, Mfm::Nearest) => glow::LINEAR_MIPMAP_NEAREST, + (Fm::Linear, Mfm::Linear) => glow::LINEAR_MIPMAP_LINEAR, }; (min_filter, mag_filter) diff --git a/wgpu-hal/src/lib.rs b/wgpu-hal/src/lib.rs index a1a7eb147a1..503be802d4e 100644 --- a/wgpu-hal/src/lib.rs +++ b/wgpu-hal/src/lib.rs @@ -1948,7 +1948,7 @@ pub struct SamplerDescriptor<'a> { pub address_modes: [wgt::AddressMode; 3], pub mag_filter: wgt::FilterMode, pub min_filter: wgt::FilterMode, - pub mipmap_filter: wgt::FilterMode, + pub mipmap_filter: wgt::MipmapFilterMode, pub lod_clamp: Range, pub compare: Option, // Must in the range [1, 16]. diff --git a/wgpu-hal/src/vulkan/conv.rs b/wgpu-hal/src/vulkan/conv.rs index 97044233e07..127e3f61c1d 100644 --- a/wgpu-hal/src/vulkan/conv.rs +++ b/wgpu-hal/src/vulkan/conv.rs @@ -697,10 +697,10 @@ pub fn map_filter_mode(mode: wgt::FilterMode) -> vk::Filter { } } -pub fn map_mip_filter_mode(mode: wgt::FilterMode) -> vk::SamplerMipmapMode { +pub fn map_mip_filter_mode(mode: wgt::MipmapFilterMode) -> vk::SamplerMipmapMode { match mode { - wgt::FilterMode::Nearest => vk::SamplerMipmapMode::NEAREST, - wgt::FilterMode::Linear => vk::SamplerMipmapMode::LINEAR, + wgt::MipmapFilterMode::Nearest => vk::SamplerMipmapMode::NEAREST, + wgt::MipmapFilterMode::Linear => vk::SamplerMipmapMode::LINEAR, } } diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index 7195e0cc31d..f9f48e1e82b 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -6587,7 +6587,7 @@ pub struct SamplerDescriptor { /// How to filter the texture when it needs to be minified (made smaller) pub min_filter: FilterMode, /// How to filter between mip map levels - pub mipmap_filter: FilterMode, + pub mipmap_filter: MipmapFilterMode, /// Minimum level of detail (i.e. mip level) to use pub lod_min_clamp: f32, /// Maximum level of detail (i.e. mip level) to use @@ -6692,12 +6692,32 @@ pub enum AddressMode { pub enum FilterMode { /// Nearest neighbor sampling. /// - /// This creates a pixelated effect when used as a mag filter + /// This creates a pixelated effect. #[default] Nearest = 0, /// Linear Interpolation /// - /// This makes textures smooth but blurry when used as a mag filter. + /// This makes textures smooth but blurry. + Linear = 1, +} + +/// Texel mixing mode when sampling between texels. +/// +/// Corresponds to [WebGPU `GPUMipmapFilterMode`]( +/// https://gpuweb.github.io/gpuweb/#enumdef-gpumipmapfiltermode). +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))] +pub enum MipmapFilterMode { + /// Nearest neighbor sampling. + /// + /// Return the value of the texel nearest to the texture coordinates. + #[default] + Nearest = 0, + /// Linear Interpolation + /// + /// Select two texels in each dimension and return a linear interpolation between their values. Linear = 1, } diff --git a/wgpu/src/backend/webgpu.rs b/wgpu/src/backend/webgpu.rs index 4c34042c55d..5ea8e50d76c 100644 --- a/wgpu/src/backend/webgpu.rs +++ b/wgpu/src/backend/webgpu.rs @@ -675,10 +675,10 @@ fn map_filter_mode(mode: wgt::FilterMode) -> webgpu_sys::GpuFilterMode { } } -fn map_mipmap_filter_mode(mode: wgt::FilterMode) -> webgpu_sys::GpuMipmapFilterMode { +fn map_mipmap_filter_mode(mode: wgt::MipmapFilterMode) -> webgpu_sys::GpuMipmapFilterMode { match mode { - wgt::FilterMode::Nearest => webgpu_sys::GpuMipmapFilterMode::Nearest, - wgt::FilterMode::Linear => webgpu_sys::GpuMipmapFilterMode::Linear, + wgt::MipmapFilterMode::Nearest => webgpu_sys::GpuMipmapFilterMode::Nearest, + wgt::MipmapFilterMode::Linear => webgpu_sys::GpuMipmapFilterMode::Linear, } } diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 25ac702f053..248296c7ae3 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -98,17 +98,17 @@ pub use wgt::{ ExternalTextureTransferFunction, Face, Features, FeaturesWGPU, FeaturesWebGPU, FilterMode, FrontFace, GlBackendOptions, GlFenceBehavior, Gles3MinorVersion, HalCounters, ImageSubresourceRange, IndexFormat, InstanceDescriptor, InstanceFlags, InternalCounters, - Limits, MemoryBudgetThresholds, MemoryHints, MultisampleState, NoopBackendOptions, Origin2d, - Origin3d, PipelineStatisticsTypes, PollError, PollStatus, PolygonMode, PowerPreference, - PredefinedColorSpace, PresentMode, PresentationTimestamp, PrimitiveState, PrimitiveTopology, - PushConstantRange, QueryType, RenderBundleDepthStencil, RequestAdapterError, - SamplerBindingType, SamplerBorderColor, ShaderLocation, ShaderModel, ShaderRuntimeChecks, - ShaderStages, StencilFaceState, StencilOperation, StencilState, StorageTextureAccess, - SurfaceCapabilities, SurfaceStatus, TexelCopyBufferLayout, TextureAspect, TextureDimension, - TextureFormat, TextureFormatFeatureFlags, TextureFormatFeatures, TextureSampleType, - TextureTransition, TextureUsages, TextureUses, TextureViewDimension, Trace, VertexAttribute, - VertexFormat, VertexStepMode, WasmNotSend, WasmNotSendSync, WasmNotSync, COPY_BUFFER_ALIGNMENT, - COPY_BYTES_PER_ROW_ALIGNMENT, MAP_ALIGNMENT, PUSH_CONSTANT_ALIGNMENT, + Limits, MemoryBudgetThresholds, MemoryHints, MipmapFilterMode, MultisampleState, + NoopBackendOptions, Origin2d, Origin3d, PipelineStatisticsTypes, PollError, PollStatus, + PolygonMode, PowerPreference, PredefinedColorSpace, PresentMode, PresentationTimestamp, + PrimitiveState, PrimitiveTopology, PushConstantRange, QueryType, RenderBundleDepthStencil, + RequestAdapterError, SamplerBindingType, SamplerBorderColor, ShaderLocation, ShaderModel, + ShaderRuntimeChecks, ShaderStages, StencilFaceState, StencilOperation, StencilState, + StorageTextureAccess, SurfaceCapabilities, SurfaceStatus, TexelCopyBufferLayout, TextureAspect, + TextureDimension, TextureFormat, TextureFormatFeatureFlags, TextureFormatFeatures, + TextureSampleType, TextureTransition, TextureUsages, TextureUses, TextureViewDimension, Trace, + VertexAttribute, VertexFormat, VertexStepMode, WasmNotSend, WasmNotSendSync, WasmNotSync, + COPY_BUFFER_ALIGNMENT, COPY_BYTES_PER_ROW_ALIGNMENT, MAP_ALIGNMENT, PUSH_CONSTANT_ALIGNMENT, QUERY_RESOLVE_BUFFER_ALIGNMENT, QUERY_SET_MAX_QUERIES, QUERY_SIZE, VERTEX_ALIGNMENT, }; From 91a0cf9bd5a3c44cc3b9e9667f793a882e55e405 Mon Sep 17 00:00:00 2001 From: sagudev <16504129+sagudev@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:36:36 +0200 Subject: [PATCH 2/4] add changelog Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fa8bd6303c..f34c36e184d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,19 @@ This is a breaking change By @R-Cramer4 in [#8230](https://github.com/gfx-rs/wgpu/pull/8230) +#### `MipmapFilterMode` is split from `FilterMode` + +This is a breaking change that aligns wgpu with spec. + +```diff +SamplerDescriptor { +... +- mipmap_filter: FilterMode::Nearest ++ mipmap_filter: MipmapFilterMode::Nearest +... +} +``` + ## v27.0.2 (2025-10-03) ### Bug Fixes From c2d7c85abef309b1d8124ec9324b8da748639281 Mon Sep 17 00:00:00 2001 From: sagudev <16504129+sagudev@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:44:19 +0200 Subject: [PATCH 3/4] fixes Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --- wgpu-hal/src/dx12/conv.rs | 7 +++++++ wgpu-hal/src/dx12/device.rs | 2 +- wgpu-hal/src/metal/device.rs | 6 +++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/wgpu-hal/src/dx12/conv.rs b/wgpu-hal/src/dx12/conv.rs index 6005f43bf1a..aa241364ce8 100644 --- a/wgpu-hal/src/dx12/conv.rs +++ b/wgpu-hal/src/dx12/conv.rs @@ -85,6 +85,13 @@ pub fn map_filter_mode(mode: wgt::FilterMode) -> Direct3D12::D3D12_FILTER_TYPE { } } +pub fn map_mipmap_filter_mode(mode: wgt::MipmapFilterMode) -> Direct3D12::D3D12_FILTER_TYPE { + match mode { + wgt::MipmapFilterMode::Nearest => Direct3D12::D3D12_FILTER_TYPE_POINT, + wgt::MipmapFilterMode::Linear => Direct3D12::D3D12_FILTER_TYPE_LINEAR, + } +} + pub fn map_comparison(func: wgt::CompareFunction) -> Direct3D12::D3D12_COMPARISON_FUNC { use wgt::CompareFunction as Cf; match func { diff --git a/wgpu-hal/src/dx12/device.rs b/wgpu-hal/src/dx12/device.rs index 473423b8145..420e2571aed 100644 --- a/wgpu-hal/src/dx12/device.rs +++ b/wgpu-hal/src/dx12/device.rs @@ -726,7 +726,7 @@ impl crate::Device for super::Device { let mut filter = Direct3D12::D3D12_FILTER( (conv::map_filter_mode(desc.min_filter).0 << Direct3D12::D3D12_MIN_FILTER_SHIFT) | (conv::map_filter_mode(desc.mag_filter).0 << Direct3D12::D3D12_MAG_FILTER_SHIFT) - | (conv::map_filter_mode(desc.mipmap_filter).0 + | (conv::map_mipmap_filter_mode(desc.mipmap_filter).0 << Direct3D12::D3D12_MIP_FILTER_SHIFT) | (reduction.0 << Direct3D12::D3D12_FILTER_REDUCTION_TYPE_SHIFT), ); diff --git a/wgpu-hal/src/metal/device.rs b/wgpu-hal/src/metal/device.rs index 9f994e6302f..c12b552b162 100644 --- a/wgpu-hal/src/metal/device.rs +++ b/wgpu-hal/src/metal/device.rs @@ -566,11 +566,11 @@ impl crate::Device for super::Device { descriptor.set_min_filter(conv::map_filter_mode(desc.min_filter)); descriptor.set_mag_filter(conv::map_filter_mode(desc.mag_filter)); descriptor.set_mip_filter(match desc.mipmap_filter { - wgt::FilterMode::Nearest if desc.lod_clamp == (0.0..0.0) => { + wgt::MipmapFilterMode::Nearest if desc.lod_clamp == (0.0..0.0) => { MTLSamplerMipFilter::NotMipmapped } - wgt::FilterMode::Nearest => MTLSamplerMipFilter::Nearest, - wgt::FilterMode::Linear => MTLSamplerMipFilter::Linear, + wgt::MipmapFilterMode::Nearest => MTLSamplerMipFilter::Nearest, + wgt::MipmapFilterMode::Linear => MTLSamplerMipFilter::Linear, }); let [s, t, r] = desc.address_modes; From eadf6c095ef4f22fb3c6528f753cfb352d82ccab Mon Sep 17 00:00:00 2001 From: sagudev <16504129+sagudev@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:44:28 +0200 Subject: [PATCH 4/4] fix typo Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f34c36e184d..c69920db573 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,7 +42,7 @@ Bottom level categories: #### 'wgpu::Instance::enumerate_adapters` is now `async` & available on WebGPU -Making `enumerate_adapters` async allows custom backends to use it along with elimnating some native/non-native distinctions +Making `enumerate_adapters` async allows custom backends to use it along with eliminating some native/non-native distinctions This is a breaking change