Releases: gfx-rs/wgpu
v27.0.2
This release includes wgpu-hal
version 27.0.2
. All other crates remain at their previous versions.
Bug Fixes
DX12
- Fix device creation failures for devices that do not support mesh shaders. By @vorporeal in #8297.
v27.0.1
This release includes wgpu
, wgpu-core
, wgpu-hal
, and wgpu-types
version 27.0.1
. All other crates remain at their previous versions.
Bug Fixes
- Fixed the build on docs.rs. By @cwfitzgerald in #8292.
v27.0.0
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
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
.
The Feature::MULTI_DRAW_INDIRECT_COUNT
feature can be used to determine if multi-draw is supported natively on the device. This is helpful to know if you are using spirv-passthrough and gl_DrawID
in your shaders.
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();
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());
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'stexture_external
type. This is gated behind theFeatures::EXTERNAL_TEXTURE
feature, which is currently only supported on DX12. By @jamienicol in #4386. wgpu::Device::poll
can now specify a timeout viawgpu::PollType::Wait
. By @Wumpf in #8282 & #8285
naga
- Expose
naga::front::wgsl::UnimplementedEnableExtension
. By @ErichDonGubler in #8237.
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 onepop_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
, andcopy_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
andset_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 implementSync
in addition toSend
, and be wrapped inArc
...
v26.0.4
v26.0.3
This release includes wgpu-hal
version v26.0.3
. All other crates remain at their previous versions.
Bug Fixes
- Fixed memory leak in vulkan backend. By @cwfitzgerald in #8031.
v26.0.2
This release includes wgpu-hal
version v26.0.2
. All other crates remain at their previous versions.
Bug Fixes
- Fixed vulkan validation error regarding the swapchain in latest SDK. By @cwfitzgerald in #7971.
- Fixed flickering on AMD devices and crashes inside Renderdoc due to incorrect caching of
VkFramebuffer
s when the driver re-used image view handles. By @cwfitzgerald in #7972.
Warning
There is formally a breaking change in wgpu_hal::vulkan::Device::texture_from_raw
as there is now a &self
receiver where there previously wasn't one. This will not
affect you unless you explicitly use this api. We have gone ahead with the release
as the bug was pervasive and made wgpu unusable for the affected people on v26.
v26.0.1
This release includes v26.0.1
of wgpu
and wgpu-core
. All other crates remain at their previous versions.
Bug Fixes
- Fixed build error inside
wgpu::util::initialize_adapter_from_env
whenstd
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
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();
More examples of this kind of interop will come soon.
Naga
- Added
no_std
support with default features disabled. By @bushrat011899 in #7585. - [wgsl-in,ir] Add support for parsing rust-style doc comments via
naga::front::glsl::Frontend::new_with_options
. By @Vrixyz in #6364. - When emitting GLSL, Uniform and Storage Buffer memory layouts are now emitted even if no explicit binding is given. By @cloone8 in #7579.
- Diagnostic rendering methods (i.e.,
naga::{front::wgsl::ParseError,WithSpan}::emit_error_to_string_with_path
) now accept more types for theirpath
argument via a new sealedAsDiagnosticFilePath
trait. By @atlv24, @bushrat011899, and @ErichDonGubler in #7643. - Add support for quad operations (requires
SUBGROUP
feature to be enabled). By @dzamkov and @valaphee in #7683. - Add support for
atomicCompareExchangeWeak
in HLSL and GLSL backends. By @cryvosh in #7658
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'sGPUError
's classification scheme, and implementWebGpuError
for existing errors. This allows users ofwgpu-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 nowBufferView::as_uint8array()
.
Naga
- Naga now infers the correct binding layout when a resource appears only in an assignment to
_
. By @andyleiserson in #7540. - Implement
dot4U8Packed
anddot4I8Packed
for all backends, using specialized intrinsics on SPIR-V, HSLS, and Metal if available, and polyfills everywhere else. By @robamler in #7494, #7574, and #7653. - Add polyfilled
pack4x{I,U}8Clamped
built-ins to all backends and WGSL frontend. By @ErichDonGubler in #7546. - Allow textureLoad's sample index arg to be unsigned. By @jimblandy in #7625.
- Properly convert arguments to atomic operations. By @jimblandy in #7573.
- Apply necessary automatic conversions to the
value
argument oftextureStore
. By @jimblandy in #7567. - Properly apply WGSL's automatic conversions to the arguments to texture sampling functions. By @jimblandy in #7548.
- Properly evaluate
abs(most negative abstract int)
. By @jimblandy in #7507. - Generate vectorized code for
[un]pack4x{I,U}8[Clamp]
on SPIR-V and MSL 2.1+. By @robamler in #7664. - Fix typing for
select
, which had issues particularly with a lack of automatic type conversion. By @ErichDonGubler in #7572. - Allow scalars as the first argument of the
distance
built-in function. By @bernhl in #7530. - Don't panic when handling
f16
for pipeline constants, i.e.,override
s in WGSL. By @ErichDonGubler in #7801. - Prevent aliased ray queries crashing naga when writing SPIR-V out. By @Vecvec in #7759.
DX12
Vulkan
- Fix OpenBSD compilation of
wgpu_hal::vulkan::drm
. By @ErichDonGubler in #7810. - Fix warnings for unrecognized present mode. By @Wumpf in #7850.
Metal
- Remove extraneous main thread warning in
fn surface_capabilities()
. By @jamesordner in #7692
WebGPU
- Fix setting unclipped_depth. By @atlv24 in #7841
- Implement
on_submitted_work_done
for WebGPU backend. By @drewcrawford in #7864
Changes
- Loosen Viewport validation requirements to match the new specs. By @EbbDrop in #7564
wgpu
anddeno_webgpu
now usewgpu-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 usingPollType
. 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 multipledestroy
calls. By @andyleiserson in #7686 and #7720. - Remove
CommandEncoder::build_acceleration_structures_unsafe_tlas
in favour ofas_hal
and apply
simplifications allowed by this. By @Vecvec in #7513 - The type of the
size
parameter tocopy_buffer_to_buffer
has changed fromBufferAddress
toimpl 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 ...
v25.0.2
This release includes wgpu
, wgpu-core
and wgpu-hal
version 25.0.2
. All other crates remain at their previous versions.
Bug Fixes
General
- Fix a possible deadlock within
Queue::write_buffer
. By @RedMindZ in #7582 - Fix
raw-window-handle
dependency being too lenient. By @kpreid in #7526
WebGPU
- Insert fragment pipeline constants into fragment descriptor instead of vertex descriptor. By @DerSchmale in #7621
v24.0.5
This release includes wgpu
and wgpu-core
version 24.0.5. All other crates remain at their previous versions.
Bug Fixes
General
WebGPU
- Insert fragment pipeline constants into fragment descriptor instead of vertex descriptor. By @DerSchmale in #7621