Skip to content

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Oct 2, 2025

This PR contains the following updates:

Package Type Update Change
wgpu (source) dev-dependencies major 23 -> 27

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

gfx-rs/wgpu (wgpu)

v27.0.1

Compare Source

Bug Fixes

v27.0.0

Compare Source

Major Changes
Deferred command buffer actions: map_buffer_on_submit and on_submitted_work_done

You may schedule buffer mapping and a submission-complete callback to run automatically after you submit, directly from encoders, command buffers, and passes.

// Record some GPU work so the submission isn't empty and touches `buffer`.
encoder.clear_buffer(&buffer, 0, None);

// Defer mapping until this encoder is submitted.
encoder.map_buffer_on_submit(&buffer, wgpu::MapMode::Read, 0..size, |result| { .. });

// Fires after the command buffer's work is finished.
encoder.on_submitted_work_done(|| { .. });

// Automatically calls `map_async` and `on_submitted_work_done` after this submission finishes.
queue.submit([encoder.finish()]);

Available on CommandEncoder, CommandBuffer, RenderPass, and ComputePass.

By @​cwfitzgerald in #​8125.

Builtin Support for DXGI swapchains on top of of DirectComposition Visuals in DX12

By enabling DirectComposition support, the dx12 backend can now support transparent windows.

This creates a single IDCompositionVisual over the entire window that is used by the mfSurface. If a user wants to manage the composition tree themselves, they should create their own device and composition, and pass the relevant visual down into wgpu via SurfaceTargetUnsafe::CompositionVisual.

let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
    backend_options: wgpu::BackendOptions {
        dx12: wgpu::Dx12BackendOptions {
            presentation_system: wgpu::Dx12SwapchainKind::DxgiFromVisual,
            ..
        },
        ..
    },
    ..
});

By @​n1ght-hunter in #​7550.

EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE has been merged into EXPERIMENTAL_RAY_QUERY

We have merged the acceleration structure feature into the RayQuery feature. This is to help work around an AMD driver bug and reduce the feature complexity of ray tracing. In the future when ray tracing pipelines are implemented, if either feature is enabled, acceleration structures will be available.

- Features::EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE
+ Features::EXPERIMENTAL_RAY_QUERY

By @​Vecvec in #​7913.

New EXPERIMENTAL_PRECOMPILED_SHADERS API

We have added Features::EXPERIMENTAL_PRECOMPILED_SHADERS, replacing existing passthrough types with a unified CreateShaderModuleDescriptorPassthrough which allows passing multiple shader codes for different backends. By @​SupaMaggie70Incorporated in #​7834

Difference for SPIR-V passthrough:

- device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough::SpirV(
-     wgpu::ShaderModuleDescriptorSpirV {
-         label: None,
-         source: spirv_code,
-     },
- ))
+ device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough {
+     entry_point: "main".into(),
+     label: None,
+     spirv: Some(spirv_code),
+     ..Default::default()
})

This allows using precompiled shaders without manually checking which backend's code to pass, for example if you have shaders precompiled for both DXIL and SPIR-V.

Buffer mapping apis no longer have lifetimes

Buffer::get_mapped_range(), Buffer::get_mapped_range_mut(), and Queue::write_buffer_with() now return guard objects without any lifetimes. This
makes it significantly easier to store these types in structs, which is useful for building utilities that build the contents of a buffer over time.

- let buffer_mapping_ref: wgpu::BufferView<'_>           = buffer.get_mapped_range(..);
- let buffer_mapping_mut: wgpu::BufferViewMut<'_>        = buffer.get_mapped_range_mut(..);
- let queue_write_with:   wgpu::QueueWriteBufferView<'_> = queue.write_buffer_with(..);
+ let buffer_mapping_ref: wgpu::BufferView               = buffer.get_mapped_range(..);
+ let buffer_mapping_mut: wgpu::BufferViewMut            = buffer.get_mapped_range_mut(..);
+ let queue_write_with:   wgpu::QueueWriteBufferView     = queue.write_buffer_with(..);

By @​sagudev in #​8046 and @​cwfitzgerald in #​8070.

EXPERIMENTAL_* features now require unsafe code to enable

We want to be able to expose potentially experimental features to our users before we have ensured that they are fully sound to use.
As such, we now require any feature that is prefixed with EXPERIMENTAL to have a special unsafe token enabled in the device descriptor
acknowledging that the features may still have bugs in them and to report any they find.

adapter.request_device(&wgpu::DeviceDescriptor {
    features: wgpu::Features::EXPERIMENTAL_MESH_SHADER,
    experimental_features: unsafe { wgpu::ExperimentalFeatures::enabled() }
    ..
})

By @​cwfitzgerald in #​8163.

Multi-draw indirect is now unconditionally supported when indirect draws are supported

We have removed Features::MULTI_DRAW_INDIRECT as it was unconditionally available on all platforms.
RenderPass::multi_draw_indirect is now available if the device supports downlevel flag DownlevelFlags::INDIRECT_EXECUTION.

If you are using spirv-passthrough with multi-draw indirect and gl_DrawID, you can know if MULTI_DRAW_INDIRECT is being emulated
by if the Feature::MULTI_DRAW_INDIRECT_COUNT feature is available on the device, this feature cannot be emulated efficicently.

By @​cwfitzgerald in #​8162.

wgpu::PollType::Wait has now an optional timeout

We removed wgpu::PollType::WaitForSubmissionIndex and added fields to wgpu::PollType::Wait in order to express timeouts.

Before/after for wgpu::PollType::Wait:

-device.poll(wgpu::PollType::Wait).unwrap();
-device.poll(wgpu::PollType::wait_indefinitely()).unwrap();
+device.poll(wgpu::PollType::Wait {
+      submission_index: None, // Wait for most recent submission
+      timeout: Some(std::time::Duration::from_secs(60)), // Previous behavior, but more likely you want `None` instead.
+  })
+  .unwrap();

Before/after for wgpu::PollType::WaitForSubmissionIndex:

-device.poll(wgpu::PollType::WaitForSubmissionIndex(index_to_wait_on))
+device.poll(wgpu::PollType::Wait {
+      submission_index: Some(index_to_wait_on),
+      timeout: Some(std::time::Duration::from_secs(60)), // Previous behavior, but more likely you want `None` instead.
+  })
+  .unwrap();

⚠️ Previously, both wgpu::PollType::WaitForSubmissionIndex and wgpu::PollType::Wait had a hard-coded timeout of 60 seconds.

To wait indefinitely on the latest submission, you can also use the wait_indefinitely convenience function:

device.poll(wgpu::PollType::wait_indefinitely());

By @​wumpf in #​8282, #​8285

New Features
General
  • Added mesh shader support to wgpu, with examples. Requires passthrough. By @​SupaMaggie70Incorporated in #​7345.
  • Added support for external textures based on WebGPU's GPUExternalTexture. These allow shaders to transparently operate on potentially multiplanar source texture data in either RGB or YCbCr formats via WGSL's texture_external type. This is gated behind the Features::EXTERNAL_TEXTURE feature, which is currently only supported on DX12. By @​jamienicol in #​4386.
  • wgpu::Device::poll can now specify a timeout via wgpu::PollType::Wait. By @​wumpf in #​8282 & #​8285
naga
Changes
General
  • Command encoding now happens when CommandEncoder::finish is called, not when the individual operations are requested. This does not affect the API, but may affect performance characteristics. By @​andyleiserson in #​8220.
  • Prevent resources for acceleration structures being created if acceleration structures are not enabled. By @​Vecvec in #​8036.
  • Validate that each push_debug_group pairs with exactly one pop_debug_group. By @​andyleiserson in #​8048.
  • set_viewport now requires that the supplied minimum depth value is less than the maximum depth value. By @​andyleiserson in #​8040.
  • Validation of copy_texture_to_buffer, copy_buffer_to_texture, and copy_texture_to_texture operations more closely follows the WebGPU specification. By @​andyleiserson in various PRs.
    • Copies within the same texture must not overlap.
    • Copies of multisampled or depth/stencil formats must span an entire subresource (layer).
    • Copies of depth/stencil formats must be 4B aligned.
    • For texture-buffer copies, bytes_per_row on the buffer side must be 256B-aligned, even if the transfer is a single row.
  • The offset for set_vertex_buffer and set_index_buffer must be 4B aligned. By @​andyleiserson in #​7929.
  • The offset and size of bindings are validated as fitting within the underlying buffer in more cases. By @​andyleiserson in #​7911.
  • The function you pass to Device::on_uncaptured_error() must now implement Sync in addition to Send, and be wrapped in Arc instead of Box.
    In exchange for this, it is no longer possible for calling wgpu functions while in that callback to cause a deadlock (not that we encourage you to actually do that).
    By @​kpreid in #​8011.
  • Make a compacted hal acceleration structure inherit a label from the base BLAS. By @​Vecvec in #​8103.
  • The limits requested for a device must now satisfy min_subgroup_size <= max_subgroup_size. By @​andyleiserson in #​8085.
  • Improve errors when buffer mapping is done incorrectly. Allow aliasing immutable [BufferViews]. By @​cwfitzgerald in #​8150.
  • Require new F16_IN_F32 downlevel flag for quantizeToF16, pack2x16float, and unpack2x16float in WGSL input. By @​aleiserson in #​8130.
  • The error message for non-copyable depth/stencil formats no longer mentions the aspect when it is not relevant. By @​reima in #​8156.
  • Track the initialization status of buffer memory correctly when copy_texture_to_buffer skips over padding space between rows or layers, or when the start/end of a texture-buffer transfer is not 4B aligned. By @​andyleiserson in #​8099.
  • Allow include_spirv! and include_spirv_raw! macros to be used in constants and statics. By @​clarfonthey in #​8250.
naga
  • naga now requires that no type be larger than 1 GB. This limit may be lowered in the future; feedback on an appropriate value for the limit is welcome. By @​andyleiserson in #​7950.
  • If the shader source contains control characters, naga now replaces them with U+FFFD ("replacement character") in diagnostic output. By @​andyleiserson in #​8049.
  • Add f16 IO polyfill on Vulkan backend to enable SHADER_F16 use without requiring storageInputOutput16. By @​cryvosh in #​7884.
  • For custom Naga backend authors: naga::proc::Namer now accepts reserved keywords using two new dedicated types, proc::{KeywordSet, CaseInsensitiveKeywordSet}. By @​kpreid in #​8136.
  • BREAKING: Previously the WGSL storage-texture format rg11b10float was incorrectly accepted and generated by naga, but now only accepts the the correct name rg11b10ufloat instead. By @​ErikWDev in #​8219.
  • The source() method of ShaderError no longer reports the error as its own source. By @​andyleiserson in #​8258.
  • naga correctly ingests SPIR-V that use descriptor runtime indexing, which in turn is correctly converted into WGSLs binding array. By @​hasenbanck in 8256.
  • naga correctly ingests SPIR-V that loads from multi-sampled textures, which in turn is correctly converted into WGSLs texture_multisampled_2d and load operations. By @​hasenbanck in 8270.
  • naga implement OpImageGather and OpImageDrefGather operations when ingesting SPIR-V. By @​hasenbanck in 8280.
DX12
Bug Fixes
General
  • Validate that effective buffer binding size is aligned to 4 when creating bind groups with buffer entries.. By @​ErichDonGubler in 8041.
DX12
  • Create an event per wait to prevent 60 second hangs in certain multithreaded scenarios. By @​Vecvec in #​8273.
  • Fixed a bug where access to matrices with 2 rows would not work in some cases. By @​andyleiserson in #​7438.
EGL
  • Fixed unwrap failed in context creation for some Android devices. By @​uael in #​8024.
Vulkan
  • Fixed wrong color format+space being reported versus what is hardcoded in create_swapchain(). By @​MarijnS95 in #​8226.
naga
Documentation
General
  • Clarify that subgroup barriers require both the SUBGROUP and SUBGROUP_BARRIER features / capabilities. By @​andyleiserson in #​8203.

v26.0.1

Compare Source

Bug Fixes
  • Fixed build error inside wgpu::util::initialize_adapter_from_env when std feature is not enabled. By @​kpreid in #​7918.
  • Fixed build error occurring when the profiling dependency is configured to have profiling active. By @​kpreid in #​7916.
  • Emit a validation error instead of panicking when a query set index is OOB. By @​ErichDonGubler in #​7908.

v26.0.0

Compare Source

Major Features
New method TextureView::texture

You can now call texture_view.texture() to get access to the texture that
a given texture view points to.

By @​cwfitzgerald and @​Wumpf in #​7907.

as_hal calls now return guards instead of using callbacks.

Previously, if you wanted to get access to the wgpu-hal or underlying api types, you would call as_hal and get the hal type as a callback. Now the function returns a guard which dereferences to the hal type.

- device.as_hal::<hal::api::Vulkan>(|hal_device| {...});
+ let hal_device: impl Deref<Item = hal::vulkan::Device> = device.as_hal::<hal::api::Vulkan>();

By @​cwfitzgerald in #​7863.

Enabling Vulkan Features/Extensions

For those who are doing vulkan/wgpu interop or passthrough and need to enable features/extensions that wgpu does not expose, there is a new wgpu_hal::vulkan::Adapter::open_with_callback that allows the user to modify the pnext chains and extension lists populated by wgpu before we create a vulkan device. This should vastly simplify the experience, as previously you needed to create a device yourself.

Underlying api interop is a quickly evolving space, so we welcome all feedback!

type VkApi = wgpu::hal::api::Vulkan;
let adapter: wgpu::Adapter = ...;

let mut buffer_device_address_create_info = ash::vk::PhysicalDeviceBufferDeviceAddressFeatures { .. };
let hal_device: wgpu::hal::OpenDevice<VkApi> = adapter
    .as_hal::<VkApi>()
    .unwrap()
    .open_with_callback(
        wgpu::Features::empty(),
        &wgpu::MemoryHints::Performance,
        Some(Box::new(|args| {
            // Add the buffer device address extension.
            args.extensions.push(ash::khr::buffer_device_address::NAME);
            // Extend the create info with the buffer device address create info.
            *args.create_info = args
                .create_info
                .push_next(&mut buffer_device_address_create_info);
            // We also have access to the queue create infos if we need them.
            let _ = args.queue_create_infos;
        })),
    )
    .unwrap();

let (device, queue) = adapter
    .create_device_from_hal(hal_device, &wgpu::DeviceDescriptor { .. })
    .unwrap();

By @​Vecvec in #​7829.

naga
General
  • Add support for astc-sliced-3d feature. By @​mehmetoguzderin in #​7577
  • Added wgpu_hal::dx12::Adapter::as_raw(). By @​tronical in ##​7852
  • Add support for rendering to slices of 3D texture views and single layered 2D-Array texture views (this requires VK_KHR_maintenance1 which should be widely available on newer drivers). By @​teoxoy in #​7596
  • Add extra acceleration structure vertex formats. By @​Vecvec in #​7580.
  • Add acceleration structure limits. By @​Vecvec in #​7845.
  • Add support for clip-distances feature for Vulkan and GL backends. By @​dzamkov in #​7730
  • Added wgpu_types::error::{ErrorType, WebGpuError} for classification of errors according to WebGPU's GPUError's classification scheme, and implement WebGpuError for existing errors. This allows users of wgpu-core to offload error classification onto the wgpu ecosystem, rather than having to do it themselves without sufficient information. By @​ErichDonGubler in #​6547.
Bug Fixes
General
  • Fix error message for sampler array limit. By @​LPGhatguy in #​7704.
  • Fix bug where using BufferSlice::get_mapped_range_as_array_buffer() on a buffer would prevent you from ever unmapping it. Note that this API has changed and is now BufferView::as_uint8array().
naga
DX12
  • Get vertex_index & instance_index builtins working for indirect draws. By @​teoxoy in #​7535
Vulkan
Metal
WebGPU
Changes
  • Loosen Viewport validation requirements to match the new specs. By @​ebbdrop in #​7564
  • wgpu and deno_webgpu now use wgpu-types::error::WebGpuError to classify errors. Any changes here are likely to be regressions; please report them if you find them! By @​ErichDonGubler in #​6547.
General
  • Support BLAS compaction in wgpu. By @​Vecvec in #​7285.
  • Removed MaintainBase in favor of using PollType. By @​waywardmonkeys in #​7508.
  • The destroy functions for buffers and textures in wgpu-core are now infallible. Previously, they returned an error if called multiple times for the same object. This only affects the wgpu-core API; the wgpu API already allowed multiple destroy calls. By @​andyleiserson in #​7686 and #​7720.
  • Remove CommandEncoder::build_acceleration_structures_unsafe_tlas in favour of as_hal and apply
    simplifications allowed by this. By @​Vecvec in #​7513
  • The type of the size parameter to copy_buffer_to_buffer has changed from BufferAddress to impl Into<Option<BufferAddress>>. This achieves the spec-defined behavior of the value being optional, while still accepting existing calls without changes. By @​andyleiserson in #​7659.
  • To bring wgpu's error reporting into compliance with the WebGPU specification, the error type returned from some functions has changed, and some errors may be raised at a different time than they were previously.
    • The error type returned by many methods on CommandEncoder, RenderPassEncoder, ComputePassEncoder, and RenderBundleEncoder has changed to EncoderStateError or PassStateError. These functions will return the Ended variant of these errors if called on an encoder that is no longer active. Reporting of all other errors is deferred until a call to finish().
    • Variants holding a CommandEncoderError in the error enums ClearError, ComputePassErrorInner, QueryError, and RenderPassErrorInner have been replaced with variants holding an EncoderStateError.
    • The definition of enum CommandEncoderError has changed significantly, to reflect which errors can be raised by CommandEncoder.finish(). There are also some errors that no longer appear directly in CommandEncoderError, and instead appear nested within the RenderPass or ComputePass variants.
    • CopyError has been removed. Errors that were previously a CopyError are now a CommandEncoderError returned by finish(). (The detailed reasons for copies to fail were and still are described by TransferError, which was previously a variant of CopyError, and is now a variant of CommandEncoderError).
naga
  • Mark readonly_and_readwrite_storage_textures & packed_4x8_integer_dot_product language extensions as implemented. By @​teoxoy in #​7543
  • naga::back::hlsl::Writer::new has a new pipeline_options argument. hlsl::PipelineOptions::default() can be passed as a default. The shader_stage and entry_point members of pipeline_options can be used to write only a single entry point when using the HLSL and MSL backends (GLSL and SPIR-V already had this functionality). The Metal and DX12 HALs now write only a single entry point when loading shaders. By @​andyleiserson in #​7626.
  • Implemented early_depth_test for SPIR-V backend, enabling SHADER_EARLY_DEPTH_TEST for Vulkan. Additionally, fixed conservative depth optimizations when using early_depth_test. The syntax for forcing early depth tests is now @early_depth_test(force) instead of @early_depth_test. By @​dzamkov in #​7676.
  • ImplementedLanguageExtension::VARIANTS is now implemented manually rather than derived using strum (allowing strum to become a dev-only dependency) so it is no longer a member of the strum::VARIANTS trait. Unless you are using this trait as a bound this should have no effect.
  • Compaction changes, by @​andyleiserson in #​7703:
    • process_overrides now compacts the module to remove unused items. It is no longer necessary to supply values for overrides that are not used by the active entry point.
    • The compact Cargo feature has been removed. It is no longer possible to exclude compaction support from the build.
    • compact now has an additional argument that specifies whether to remove unused functions, globals, and named types and overrides. For the previous behavior, pass KeepUnused::Yes.
D3D12
Vulkan
HAL
Documentation
General

v25.0.2

Compare Source

Bug Fixes
General
WebGPU
  • Insert fragment pipeline constants into fragment descriptor instead of vertex descriptor. By @​DerSchmale in #​7621

v25.0.0

Compare Source

Major Features
Hashmaps Removed from APIs

Both PipelineCompilationOptions::constants and ShaderSource::Glsl::defines now take
slices of key-value pairs instead of hashmaps. This is to prepare for no_std
support and allow us to keep which hashmap hasher and such as implementation details. It
also allows more easily creating these structures inline.

By @​cwfitzgerald in #​7133

All Backends Now Have Features

Previously, the vulkan and gles backends were non-optional on windows, linux, and android and there was no way to disable them. We have now figured out how to properly make them disablable! Additionally, if you turn on the webgl feature, you will only get the GLES backend on WebAssembly, it won't leak into native builds, like previously it might have.

[!WARNING]
If you use wgpu with default-features = false and you want to retain the vulkan and gles backends, you will need to add them to your feature list.

-wgpu = { version = "24", default-features = false, features = ["metal", "wgsl", "webgl"] }
+wgpu = { version = "25", default-features = false, features = ["metal", "wgsl", "webgl", "vulkan", "gles"] }

By @​cwfitzgerald in #​7076.

device.poll Api Reworked

This release reworked the poll api significantly to allow polling to return errors when polling hits internal timeout limits.

Maintain was renamed PollType. Additionally, poll now returns a result containing information about what happened during the poll.

-pub fn wgpu::Device::poll(&self, maintain: wgpu::Maintain) -> wgpu::MaintainResult
+pub fn wgpu::Device::poll(&self, poll_type: wgpu::PollType) -> Result<wgpu::PollStatus, wgpu::PollError>

-device.poll(wgpu::Maintain::Poll);
+device.poll(wgpu::PollType::Poll).unwrap();
pub enum PollType<T> {
    /// On wgpu-core based backends, block until the given submission has
    /// completed execution, and any callbacks have been invoked.
    ///
    /// On WebGPU, this has no effect. Callbacks are invoked from the
    /// window event loop.
    WaitForSubmissionIndex(T),
    /// Same as WaitForSubmissionIndex but waits for the most recent submission.
    Wait,
    /// Check the device for a single time without blocking.
    Poll,
}

pub enum PollStatus {
    /// There are no active submissions in flight as of the beginning of the poll call.
    /// Other submissions may have been queued on other threads during the call.
    ///
    /// This implies that the given Wait was satisfied before the timeout.
    QueueEmpty,

    /// The requested Wait was satisfied before the timeout.
    WaitSucceeded,

    /// This was a poll.
    Poll,
}

pub enum PollError {
    /// The requested Wait timed out before the submission was completed.
    Timeout,
}

[!WARNING]
As part of this change, WebGL's default behavior has changed. Previously device.poll(Wait) appeared as though it functioned correctly. This was a quirk caused by the bug that these PRs fixed. Now it will always return Timeout if the submission has not already completed. As many people rely on this behavior on WebGL, there is a new options in BackendOptions. If you want the old behavior, set the following on instance creation:

instance_desc.backend_options.gl.fence_behavior = wgpu::GlFenceBehavior::AutoFinish;

You will lose the ability to know exactly when a submission has completed, but device.poll(Wait) will behave the same as it does on native.

By @​cwfitzgerald in #​6942 and #​7030.

wgpu::Device::start_capture renamed, documented, and made unsafe
- device.start_capture();
+ unsafe { device.start_graphics_debugger_capture() }
// Your code here
- device.stop_capture();
+ unsafe { device.stop_graphics_debugger_capture() }

There is now documentation to describe how this maps to the various debuggers' apis.

By @​cwfitzgerald in #​7470

Ensure loops generated by SPIR-V and HLSL naga backends are bounded

Make sure that all loops in shaders generated by these naga backends are bounded
to avoid undefined behaviour due to infinite loops. Note that this may have a
performance cost. As with the existing implementation for the MSL backend this
can be disabled by using Device::create_shader_module_trusted().

By @​jamienicol in #​6929 and #​7080.

Split up Features internally

Internally split up the Features struct and recombine them internally using a macro. There should be no breaking
changes from this. This means there are also namespaces (as well as the old Features::*) for all wgpu specific
features and webgpu feature (FeaturesWGPU and FeaturesWebGPU respectively) and Features::from_internal_flags which
allow you to be explicit about whether features you need are available on the web too.

By @​Vecvec in #​6905, #​7086

WebGPU compliant dual source blending feature

Previously, dual source blending was implemented with a wgpu native only feature flag and used a custom syntax in wgpu.
By now, dual source blending was added to the WebGPU spec as an extension.
We're now following suite and implement the official syntax.

Existing shaders using dual source blending need to be updated:

struct FragmentOutput{
-    @&#8203;location(0) source0: vec4<f32>,
-    @&#8203;location(0) @&#8203;second_blend_source source1: vec4<f32>,
+    @&#8203;location(0) @&#8203;blend_src(0) source0: vec4<f32>,
+    @&#8203;location(0) @&#8203;blend_src(1) source1: vec4<f32>,
}

With that wgpu::Features::DUAL_SOURCE_BLENDING is now available on WebGPU.

Furthermore, GLSL shaders now support dual source blending as well via the index layout qualifier:

layout(location = 0, index = 0) out vec4 output0;
layout(location = 0, index = 1) out vec4 output1;

By @​wumpf in #​7144

Unify interface for SpirV shader passthrough

Replace device create_shader_module_spirv function with a generic create_shader_module_passthrough function
taking a ShaderModuleDescriptorPassthrough enum as parameter.

Update your calls to create_shader_module_spirv and use create_shader_module_passthrough instead:

-    device.create_shader_module_spirv(
-        wgpu::ShaderModuleDescriptorSpirV {
-            label: Some(&name),
-            source: Cow::Borrowed(&source),
-        }
-    )
+    device.create_shader_module_passthrough(
+        wgpu::ShaderModuleDescriptorPassthrough::SpirV(
+            wgpu::ShaderModuleDescriptorSpirV {
+                label: Some(&name),
+                source: Cow::Borrowed(&source),
+            },
+        ),
+    )

By @​syl20bnr in #​7326.

Noop Backend

It is now possible to create a dummy wgpu device even when no GPU is available. This may be useful for testing of code which manages graphics resources. Currently, it supports reading and writing buffers, and other resource types can be created but do nothing.

To use it, enable the noop feature of wgpu, and either call Device::noop(), or add NoopBackendOptions { enable: true } to the backend options of your Instance (this is an additional safeguard beyond the Backends bits).

By @​kpreid in #​7063 and #​7342.

SHADER_F16 feature is now available with naga shaders

Previously this feature only allowed you to use f16 on SPIR-V passthrough shaders. Now you can use it on all shaders, including WGSL, SPIR-V, and GLSL!

enable f16;

fn hello_world(a: f16) -> f16 {
    return a + 1.0h;
}

By @​FL33TW00D, @​ErichDonGubler, and @​cwfitzgerald in #​5701

Bindless support improved and validation rules changed.

Metal support for bindless has significantly improved and the limits for binding arrays have been increased.

Previously, all resources inside binding arrays contributed towards the standard limit of their type (texture_2d arrays for example would contribute to max_sampled_textures_per_shader_stage). Now these resources will only contribute towards binding-array specific limits:

  • max_binding_array_elements_per_shader_stage for all non-sampler resources
  • max_binding_array_sampler_elements_per_shader_stage for sampler resources.

This change has allowed the metal binding array limits to go from between 32 and 128 resources, all the way 500,000 sampled textures. Additionally binding arrays are now bound more efficiently on Metal.

This change also enabled legacy Intel GPUs to support 1M bindless resources, instead of the previous 1800.

To facilitate this change, there was an additional validation rule put in place: if there is a binding array in a bind group, you may not use dynamic offset buffers or uniform buffers in that bind group. This requirement comes from vulkan rules on UpdateAfterBind descriptors.
By @​cwfitzgerald in #​6811, #​6815, and #​6952.

New Features
General
  • Add Buffer methods corresponding to BufferSlice methods, so you can skip creating a BufferSlice when it offers no benefit, and BufferSlice::slice() for sub-slicing a slice. By @​kpreid in #​7123.
  • Add BufferSlice::buffer(), BufferSlice::offset() and BufferSlice::size(). By @​kpreid in #​7148.
  • Add impl From<BufferSlice> for BufferBinding and impl From<BufferSlice> for BindingResource, allowing BufferSlices to be easily used in creating bind groups. By @​kpreid in #​7148.
  • Add util::StagingBelt::allocate() so the staging belt can be used to write textures. By @​kpreid in #​6900.
  • Added CommandEncoder::transition_resources() for native API interop, and allowing users to slightly optimize barriers. By @​JMS55 in #​6678.
  • Add wgpu_hal::vulkan::Adapter::texture_format_as_raw for native API interop. By @​JMS55 in #​7228.
  • Support getting vertices of the hit triangle when raytracing. By @​Vecvec in #​7183.
  • Add as_hal for both acceleration structures. By @​Vecvec in #​7303.
  • Add Metal compute shader passthrough. Use create_shader_module_passthrough on device. By @​syl20bnr in #​7326.
  • new Features::MSL_SHADER_PASSTHROUGH run-time feature allows providing pass-through MSL Metal shaders. By @​syl20bnr in #​7326.
  • Added mesh shader support to wgpu_hal. By @​SupaMaggie70Incorporated in #​7089
naga
  • Add support for unsigned types when calling textureLoad with the level parameter. By @​ygdrasil-io in #​7058.
  • Support @​must_use attribute on function declarations. By @​turbocrime in #​6801.
  • Support for generating the candidate intersections from AABB geometry, and confirming the hits. By @​kvark in #​7047.
  • Make naga::back::spv::Function::to_words write the OpFunctionEnd instruction in itself, instead of making another call after it. By @​junjunjd in #​7156.
  • Add support for texture memory barriers. By @​Devon7925 in #​7173.
  • Add polyfills for unpackSnorm4x8, unpackUnorm4x8, unpackSnorm2x16, unpackUnorm2x16 for GLSL versions they aren't supported in. By @​DJMcNab in #​7408.
Examples
  • Added an example that shows how to handle datasets too large to fit in a single GPUBuffer by distributing it across many buffers, and then having the shader receive them as a binding_array of storage buffers. By @​alphastrata in #​6138
Changes
General
  • wgpu::Instance::request_adapter() now returns Result instead of Option; the error provides information about why no suitable adapter was returned. By @​kpreid in #​7330.
  • Support BLAS compaction in wgpu-hal. By @​Vecvec in #​7101.
  • Avoid using default features in many dependencies, etc. By Brody in #​7031
  • Use hashbrown to simplify no-std support. By Brody in #​6938 & #​6925.
  • If you use Binding Arrays in a bind group, you may not use Dynamic Offset Buffers or Uniform Buffers in that bind group. By @​cwfitzgerald in #​6811
  • Rename instance_id and instance_custom_index to instance_index and instance_custom_data by @​Vecvec in
    #​6780
naga
  • naga IR types are now available in the module naga::ir (e.g. naga::ir::Module).
    The original names (e.g. naga::Module) remain present for compatibility.
    By @​kpreid in #​7365.
  • Refactored use statements to simplify future no_std support. By @​bushrat011899 in #​7256
  • naga's WGSL frontend no longer allows using the & operator to take the address of a component of a vector,
    which is not permitted by the WGSL specification. By @​andyleiserson in #​7284
  • naga's use of termcolor and stderr are now optional behind features of the same names. By @​bushrat011899 in #​7482
Vulkan
HAL queue callback support
  • Add a way to notify with Queue::submit() to Vulkan's vk::Semaphore allocated outside of wgpu. By @​sotaroikeda in #​6813.
Bug Fixes
naga
  • Fix some instances of functions which have a return type but don't return a value being incorrectly validated. By @​jamienicol in #​7013.
  • Allow abstract expressions to be used in WGSL function return statements. By @​jamienicol in #​7035.
  • Error if structs have two fields with the same name. By @​SparkyPotato in #​7088.
  • Forward '--keep-coordinate-space' flag to GLSL backend in naga-cli. By @​cloone8 in #​7206.
  • Allow template lists to have a trailing comma. By [@​KentSla

Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot requested a review from a team as a code owner October 2, 2025 01:57
Copy link
Contributor

github-actions bot commented Oct 2, 2025

Package Changes Through a1cc490

There are 1 changes which include wry with minor

Planned Package Versions

The following package releases are the planned based on the context of changes in this pull request.

package current next
wry 0.53.4 0.54.0

Add another change file through the GitHub UI by following this link.


Read about change files or the docs at github.com/jbolda/covector

@renovate renovate bot force-pushed the renovate/wgpu-27.x branch 2 times, most recently from 828fcb9 to e178733 Compare October 6, 2025 18:44
@renovate renovate bot force-pushed the renovate/wgpu-27.x branch from e178733 to 5c6da94 Compare October 15, 2025 09:05
@renovate renovate bot force-pushed the renovate/wgpu-27.x branch from 5c6da94 to a1cc490 Compare October 15, 2025 09:06
@FabianLars FabianLars closed this Oct 15, 2025
Copy link
Contributor Author

renovate bot commented Oct 15, 2025

Renovate Ignore Notification

Because you closed this PR without merging, Renovate will ignore this update. You will not get PRs for any future 27.x releases. But if you manually upgrade to 27.x then Renovate will re-enable minor and patch updates automatically.

If you accidentally closed this PR, or if you changed your mind: rename this PR to get a fresh replacement PR.

@renovate renovate bot deleted the renovate/wgpu-27.x branch October 15, 2025 09:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant