Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(deps): update rust crate wgpu to v22 #1320

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Jul 18, 2024

This PR contains the following updates:

Package Type Update Change
wgpu (source) dev-dependencies major 0.19 -> 22.0

Release Notes

gfx-rs/wgpu (wgpu)

v22.1.0

Compare Source

This release includes wgpu, wgpu-core and naga. All other crates remain at 22.0.0.

Added
Naga
Bug Fixes
General

v22.0.0

Compare Source

Overview
Our first major version release!

For the first time ever, WGPU is being released with a major version (i.e., 22.* instead of 0.22.*)! Maintainership has decided to fully adhere to Semantic Versioning's recommendations for versioning production software. According to SemVer 2.0.0's Q&A about when to use 1.0.0 versions (and beyond):

How do I know when to release 1.0.0?

If your software is being used in production, it should probably already be 1.0.0. If you have a stable API on which users have come to depend, you should be 1.0.0. If you’re worrying a lot about backward compatibility, you should probably already be 1.0.0.

It is a well-known fact that WGPU has been used for applications and platforms already in production for years, at this point. We are often concerned with tracking breaking changes, and affecting these consumers' ability to ship. By releasing our first major version, we publicly acknowledge that this is the case. We encourage other projects in the Rust ecosystem to follow suit.

Note that while we start to use the major version number, WGPU is not "going stable", as many Rust projects do. We anticipate many breaking changes before we fully comply with the WebGPU spec., which we expect to take a small number of years.

Overview

A major (pun intended) theme of this release is incremental improvement. Among the typically large set of bug fixes, new features, and other adjustments to WGPU by the many contributors listed below, @​wumpf and @​teoxoy have merged a series of many simplifications to WGPU's internals and, in one case, to the render and compute pass recording APIs. Many of these change WGPU to use atomically reference-counted resource tracking (i.e., Arc<…>), rather than using IDs to manage the lifetimes of platform-specific graphics resources in a registry of separate reference counts. This has led us to diagnose and fix many long-standing bugs, and net some neat performance improvements on the order of 40% or more of some workloads.

While the above is exciting, we acknowledge already finding and fixing some (easy-to-fix) regressions from the above work. If you migrate to WGPU 22 and encounter such bugs, please engage us in the issue tracker right away!

Major Changes
Lifetime bounds on wgpu::RenderPass & wgpu::ComputePass

wgpu::RenderPass & wgpu::ComputePass recording methods (e.g. wgpu::RenderPass:set_render_pipeline) no longer impose a lifetime constraint to objects passed to a pass (like pipelines/buffers/bindgroups/query-sets etc.).

This means the following pattern works now as expected:

let mut pipelines: Vec<wgpu::RenderPipeline> = ...;
// ...
let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor::default());
cpass.set_pipeline(&pipelines[123]);
// Change pipeline container - this requires mutable access to `pipelines` while one of the pipelines is in use.
pipelines.push(/* ... */);
// Continue pass recording.
cpass.set_bindgroup(...);

Previously, a set pipeline (or other resource) had to outlive pass recording which often affected wider systems,
meaning that users needed to prove to the borrow checker that Vec<wgpu::RenderPipeline> (or similar constructs)
aren't accessed mutably for the duration of pass recording.

Furthermore, you can now opt out of wgpu::RenderPass/wgpu::ComputePass's lifetime dependency on its parent wgpu::CommandEncoder using wgpu::RenderPass::forget_lifetime/wgpu::ComputePass::forget_lifetime:

fn independent_cpass<'enc>(encoder: &'enc mut wgpu::CommandEncoder) -> wgpu::ComputePass<'static> {
    let cpass: wgpu::ComputePass<'enc> = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor::default());
    cpass.forget_lifetime()
}

⚠️ As long as a wgpu::RenderPass/wgpu::ComputePass is pending for a given wgpu::CommandEncoder, creation of a compute or render pass is an error and invalidates the wgpu::CommandEncoder.
forget_lifetime can be very useful for library authors, but opens up an easy way for incorrect use, so use with care.
This method doesn't add any additional overhead and has no side effects on pass recording.

By @​wumpf in #​5569, #​5575, #​5620, #​5768 (together with @​kpreid), #​5671, #​5794, #​5884.

Querying shader compilation errors

Wgpu now supports querying shader compilation info.

This allows you to get more structured information about compilation errors, warnings and info:

...
let lighting_shader = ctx.device.create_shader_module(include_wgsl!("lighting.wgsl"));
let compilation_info = lighting_shader.get_compilation_info().await;
for message in compilation_info
    .messages
    .iter()
    .filter(|m| m.message_type == wgpu::CompilationMessageType::Error)
{
    let line = message.location.map(|l| l.line_number).unwrap_or(1);
    println!("Compile error at line {line}");
}

By @​stefnotch in #​5410

64 bit integer atomic support in shaders.

Add support for 64 bit integer atomic operations in shaders.

Add the following flags to wgpu_types::Features:

  • SHADER_INT64_ATOMIC_ALL_OPS enables all atomic operations on atomic<i64> and
    atomic<u64> values.

  • SHADER_INT64_ATOMIC_MIN_MAX is a subset of the above, enabling only
    AtomicFunction::Min and AtomicFunction::Max operations on atomic<i64> and
    atomic<u64> values in the Storage address space. These are the only 64-bit
    atomic operations available on Metal as of 3.1.

Add corresponding flags to naga::valid::Capabilities. These are supported by the
WGSL front end, and all Naga backends.

Platform support:

  • On Direct3d 12, in D3D12_FEATURE_DATA_D3D12_OPTIONS9, if
    AtomicInt64OnTypedResourceSupported and AtomicInt64OnGroupSharedSupported are
    both available, then both wgpu features described above are available.

  • On Metal, SHADER_INT64_ATOMIC_MIN_MAX is available on Apple9 hardware, and on
    hardware that advertises both Apple8 and Mac2 support. This also requires Metal
    Shading Language 2.4 or later. Metal does not yet support the more general
    SHADER_INT64_ATOMIC_ALL_OPS.

  • On Vulkan, if the VK_KHR_shader_atomic_int64 extension is available with both the
    shader_buffer_int64_atomics and shader_shared_int64_atomics features, then both
    wgpu features described above are available.

By @​atlv24 in #​5383

A compatible surface is now required for request_adapter() on WebGL2 + enumerate_adapters() is now native only.

When targeting WebGL2, it has always been the case that a surface had to be created before calling request_adapter().
We now make this requirement explicit.

Validation was also added to prevent configuring the surface with a device that doesn't share the same underlying
WebGL2 context since this has never worked.

Calling enumerate_adapters() when targeting WebGPU used to return an empty Vec and since we now require users
to pass a compatible surface when targeting WebGL2, having enumerate_adapters() doesn't make sense.

By @​teoxoy in #​5901

New features
General
  • Added as_hal for Buffer to access wgpu created buffers form wgpu-hal. By @​JasondeWolff in #​5724
  • include_wgsl! is now callable in const contexts by @​9SMTM6 in #​5872
  • Added memory allocation hints to DeviceDescriptor by @​nical in #​5875
    • MemoryHints::Performance, the default, favors performance over memory usage and will likely cause large amounts of VRAM to be allocated up-front. This hint is typically good for games.
    • MemoryHints::MemoryUsage favors memory usage over performance. This hint is typically useful for smaller applications or UI libraries.
    • MemoryHints::Manual allows the user to specify parameters for the underlying GPU memory allocator. These parameters are subject to change.
    • These hints may be ignored by some backends. Currently only the Vulkan and D3D12 backends take them into account.
  • Add HTMLImageElement and ImageData as external source for copying images. By @​Valaphee in #​5668
Naga
  • Added -D, --defines option to naga CLI to define preprocessor macros by @​theomonnom in #​5859

  • Added type upgrades to SPIR-V atomic support. Added related infrastructure. Tracking issue is here. By @​schell in #​5775.

  • Implement WGSL's unpack4xI8,unpack4xU8,pack4xI8 and pack4xU8. By @​VlaDexa in #​5424

  • Began work adding support for atomics to the SPIR-V frontend. Tracking issue is here. By @​schell in #​5702.

  • In hlsl-out, allow passing information about the fragment entry point to omit vertex outputs that are not in the fragment inputs. By @​Imberflur in #​5531

  • In spv-out, allow passing acceleration_structure as a function argument. By @​kvark in #​5961

    let writer: naga::back::hlsl::Writer = /* ... */;
    -writer.write(&module, &module_info);
    +writer.write(&module, &module_info, None);
  • HLSL & MSL output can now be added conditionally on the target via the msl-out-if-target-apple and hlsl-out-if-target-windows features. This is used in wgpu-hal to no longer compile with MSL output when metal is enabled & MacOS isn't targeted and no longer compile with HLSL output when dx12 is enabled & Windows isn't targeted. By @​wumpf in #​5919

Vulkan
  • Added a PipelineCache resource to allow using Vulkan pipeline caches. By @​DJMcNab in #​5319
WebGPU
Changes
General
Metal
  • Removed the link Cargo feature.

    This was used to allow weakly linking frameworks. This can be achieved with putting something like the following in your .cargo/config.toml instead:

    [target.'cfg(target_vendor = "apple")']
    rustflags = ["-C", "link-args=-weak_framework Metal -weak_framework QuartzCore -weak_framework CoreGraphics"]

    By @​madsmtm in #​5752

Bug Fixes
General
  • Ensure render pipelines have at least 1 target. By @​ErichDonGubler in #​5715
  • wgpu::ComputePass now internally takes ownership of QuerySet for both wgpu::ComputePassTimestampWrites as well as timestamp writes and statistics query, fixing crashes when destroying QuerySet before ending the pass. By @​wumpf in #​5671
  • Validate resources passed during compute pass recording for mismatching device. By @​wumpf in #​5779
  • Fix staging buffers being destroyed too early. By @​teoxoy in #​5910
  • Fix attachment byte cost validation panicking with native only formats. By @​teoxoy in #​5934
  • [wgpu] Fix leaks from auto layout pipelines. By @​teoxoy in #​5971
  • [wgpu-core] Fix length of copy in queue_write_texture (causing UB). By @​teoxoy in #​5973
  • Add missing same device checks. By @​teoxoy in #​5980
GLES / OpenGL
  • Fix ClearColorF, ClearColorU and ClearColorI commands being issued before SetDrawColorBuffers #​5666
  • Replace glClear with glClearBufferF because glDrawBuffers requires that the ith buffer must be COLOR_ATTACHMENTi or NONE #​5666
  • Return the unmodified version in driver_info. By @​Valaphee in #​5753
Naga
  • In spv-out don't decorate a BindingArray's type with Block if the type is a struct with a runtime array by @​Vecvec in #​5776
  • Add packed as a keyword for GLSL by @​kjarosh in #​5855

v0.20.1

Compare Source

This release included v0.21.0 of wgpu-core and wgpu-hal, due to breaking changes needed to solve vulkan validation issues.

Bug Fixes

This release fixes the validation errors whenever a surface is used with the vulkan backend. By @​cwfitzgerald in #​5681.

General
Metal
Vulkan
  • Fix enablement of subgroup ops extension on Vulkan devices that don't support Vulkan 1.3. By @​cwfitzgerald in #​5624.
GLES / OpenGL
  • Fix regression on OpenGL (EGL) where non-sRGB still used sRGB #​5642
Naga
  • Work around shader consumers that have bugs handling switch statements with a single body for all cases. These are now written as do {} while(false); loops in hlsl-out and glsl-out. By @​Imberflur in #​5654
  • In hlsl-out, defer continue statements in switches by setting a flag and breaking from the switch. This allows such constructs to work with FXC which does not support continue within a switch. By @​Imberflur in #​5654

v0.20.0

Compare Source

Major Changes
Pipeline overridable constants

Wgpu supports now pipeline-overridable constants

This allows you to define constants in wgsl like this:

override some_factor: f32 = 42.1337; // Specifies a default of 42.1337 if it's not set.

And then set them at runtime like so on your pipeline consuming this shader:

// ...
fragment: Some(wgpu::FragmentState {
    compilation_options: wgpu::PipelineCompilationOptions {
        constants: &[("some_factor".to_owned(), 0.1234)].into(), // Sets `some_factor` to 0.1234.
        ..Default::default()
    },
    // ...
}),
// ...

By @​teoxoy & @​jimblandy in #​5500

Changed feature requirements for timestamps

Due to a specification change write_timestamp is no longer supported on WebGPU.
wgpu::CommandEncoder::write_timestamp requires now the new wgpu::Features::TIMESTAMP_QUERY_INSIDE_ENCODERS feature which is available on all native backends but not on WebGPU.

By @​wumpf in #​5188

Wgsl const evaluation for many more built-ins

Many numeric built-ins have had a constant evaluation implementation added for them, which allows them to be used in a const context:

abs, acos, acosh, asin, asinh, atan, atanh, cos, cosh, round, saturate, sin, sinh, sqrt, step, tan, tanh, ceil, countLeadingZeros, countOneBits, countTrailingZeros, degrees, exp, exp2, floor, fract, fma, inverseSqrt, log, log2, max, min, radians, reverseBits, sign, trunc

By @​ErichDonGubler in #​4879, #​5098

New native-only wgsl features
Subgroup operations

The following subgroup operations are available in wgsl now:

subgroupBallot, subgroupAll, subgroupAny, subgroupAdd, subgroupMul, subgroupMin, subgroupMax, subgroupAnd, subgroupOr, subgroupXor, subgroupExclusiveAdd, subgroupExclusiveMul, subgroupInclusiveAdd, subgroupInclusiveMul, subgroupBroadcastFirst, subgroupBroadcast, subgroupShuffle, subgroupShuffleDown, subgroupShuffleUp, subgroupShuffleXor

Availability is governed by the following feature flags:

  • wgpu::Features::SUBGROUP for all operations except subgroupBarrier in fragment & compute, supported on Vulkan, DX12 and Metal.
  • wgpu::Features::SUBGROUP_VERTEX, for all operations except subgroupBarrier general operations in vertex shaders, supported on Vulkan
  • wgpu::Features::SUBGROUP_BARRIER, for support of the subgroupBarrier operation, supported on Vulkan & Metal

Note that there currently some differences between wgpu's native-only implementation and the open WebGPU proposal.

By @​exrook and @​lichtso in #​5301

Signed and unsigned 64 bit integer support in shaders.

wgpu::Features::SHADER_INT64 enables 64 bit integer signed and unsigned integer variables in wgsl (i64 and u64 respectively).
Supported on Vulkan, DX12 (requires DXC) and Metal (with MSL 2.3+ support).

By @​atlv24 and @​cwfitzgerald in #​5154

New features
General
  • Implemented the Unorm10_10_10_2 VertexFormat by @​McMackety in #​5477
  • wgpu-types's trace and replay features have been replaced by the serde feature. By @​KirmesBude in #​5149
  • wgpu-core's serial-pass feature has been removed. Use serde instead. By @​KirmesBude in #​5149
  • Added InstanceFlags::GPU_BASED_VALIDATION, which enables GPU-based validation for shaders. This is currently only supported on the DX12 and Vulkan backends; other platforms ignore this flag, for now. By @​ErichDonGubler in #​5146, #​5046.
    • When set, this flag implies InstanceFlags::VALIDATION.
    • This has been added to the set of flags set by InstanceFlags::advanced_debugging. Since the overhead is potentially very large, the flag is not enabled by default in debug builds when using InstanceFlags::from_build_config.
    • As with other instance flags, this flag can be changed in calls to InstanceFlags::with_env with the new WGPU_GPU_BASED_VALIDATION environment variable.
  • wgpu::Instance can now report which wgpu::Backends are available based on the build configuration. By @​wumpf #​5167
    -wgpu::Instance::any_backend_feature_enabled()
    +!wgpu::Instance::enabled_backend_features().is_empty()
  • Breaking change: wgpu_core::pipeline::ProgrammableStageDescriptor is now optional. By @​ErichDonGubler in #​5305.
  • Features::downlevel{_webgl2,}_features was made const by @​MultisampledNight in #​5343
  • Breaking change: wgpu_core::pipeline::ShaderError has been moved to naga. By @​stefnotch in #​5410
  • More as_hal methods and improvements by @​JMS55 in #​5452
    • Added wgpu::CommandEncoder::as_hal_mut
    • Added wgpu::TextureView::as_hal
    • wgpu::Texture::as_hal now returns a user-defined type to match the other as_hal functions
Naga
  • Allow user to select which MSL version to use via --metal-version with Naga CLI. By @​pcleavelin in #​5392
  • Support arrayLength for runtime-sized arrays inside binding arrays (for WGSL input and SPIR-V output). By @​kvark in #​5428
  • Added --shader-stage and --input-kind options to naga-cli for specifying vertex/fragment/compute shaders, and frontend. by @​ratmice in #​5411
  • Added a create_validator function to wgpu_core Device to create naga Validators. By @​atlv24 #​5606
WebGPU
GLES / OpenGL
Metal
DX12
Other performance improvements
  • Simplify and speed up the allocation of internal IDs. By @​nical in #​5229
  • Use memory pooling for UsageScopes to avoid frequent large allocations. by @​robtfm in #​5414
  • Eager release of GPU resources comes from device.trackers. By @​bradwerth in #​5075
  • Support disabling zero-initialization of workgroup local memory in compute shaders. By @​DJMcNab in #​5508
Documentation
Bug Fixes
General
  • Fix serde feature not compiling for wgpu-types. By @​KirmesBude in #​5149
  • Fix the validation of vertex and index ranges. By @​nical in #​5144 and #​5156
  • Fix panic when creating a surface while no backend is available. By @​wumpf #​5166
  • Correctly compute minimum buffer size for array-typed storage and uniform vars. By @​jimblandy #​5222
  • Fix timeout when presenting a surface where no work has been done. By @​waywardmonkeys in #​5200
  • Fix registry leaks with de-duplicated resources. By @​nical in #​5244
  • Fix linking when targeting android. By @​ashdnazg in #​5326.
  • Failing to set the device lost closure will call the closure before returning. By @​bradwerth in #​5358.
  • Fix deadlocks caused by recursive read-write lock acquisitions #​5426.
  • Remove exposed C symbols (extern "C" + [no_mangle]) from RenderPass & ComputePass recording. By @​wumpf in #​5409.
  • Fix surfaces being only compatible with first backend enabled on an instance, causing failures when manually specifying an adapter. By @​Wumpf in #​5535.
Naga
  • In spv-in, remove unnecessary "gl_PerVertex" name check so unused builtins will always be skipped. Prevents validation errors caused by capability requirements of these builtins #​4915. By @​Imberflur in #​5227.
  • In spv-out, check for acceleration and ray-query types when enabling ray-query extension to prevent validation error. By @​Vecvec in #​5463
  • Add a limit for curly brace nesting in WGSL parsing, plus a note about stack size requirements. By @​ErichDonGubler in #​5447.
  • In hlsl-out, fix accesses on zero value expressions by generating helper functions for Expression::ZeroValue. By @​Imberflur in #​5587.
  • Fix behavior of extractBits and insertBits when offset + count overflows the bit width. By @​cwfitzgerald in #​5305
  • Fix behavior of integer clamp when min argument > max argument. By @​cwfitzgerald in #​5300.
  • Fix TypeInner::scalar_width to be consistent with the rest of the codebase and return values in bytes not bits. By @​atlv24 in #​5532.
GLES / OpenGL
  • GLSL 410 does not support layout(binding = ...), enable only for GLSL 420. By @​bes in #​5357
  • Fixes for being able to use an OpenGL 4.1 core context provided by macOS with wgpu. By @​bes in #​5331.
  • Fix crash when holding multiple devices on wayland/surfaceless. By @​ashdnazg in #​5351.
  • Fix first_instance getting ignored in draw indexed when ARB_shader_draw_parameters feature is present and base_vertex is 0. By @​valaphee in #​5482
Vulkan
  • Set object labels when the DEBUG flag is set, even if the VALIDATION flag is disabled. By @​DJMcNab in #​5345.
  • Add safety check to wgpu_hal::vulkan::CommandEncoder to make sure discard_encoding is not called in the closed state. By @​villuna in #​5557
  • Fix SPIR-V type capability requests to not depend on LocalType caching. By @​atlv24 in #​5590
  • Upgrade ash to 0.38. By @​MarijnS95 in #​5504.
Tests
  • Fix intermittent crashes on Linux in the multithreaded_compute test. By @​jimblandy in #​5129.
  • Refactor tests to read feature flags by name instead of a hardcoded hexadecimal u64. By @​atlv24 in #​5155.
  • Add test that verifies that we can drop the queue before using the device to create a command encoder. By @​Davidster in #​5211

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 July 18, 2024 17:07
Copy link
Contributor

github-actions bot commented Jul 18, 2024

Package Changes Through 2155d48

No changes.

Add a 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-22.x branch 2 times, most recently from 6631c6c to 887aae5 Compare July 22, 2024 05:34
@renovate renovate bot force-pushed the renovate/wgpu-22.x branch 2 times, most recently from 8b99b78 to 0629913 Compare August 13, 2024 02:18
@renovate renovate bot force-pushed the renovate/wgpu-22.x branch 5 times, most recently from 6104734 to 090c17f Compare August 21, 2024 23:33
@renovate renovate bot force-pushed the renovate/wgpu-22.x branch 2 times, most recently from 49c8652 to dfe251c Compare September 2, 2024 13:44
@renovate renovate bot force-pushed the renovate/wgpu-22.x branch 3 times, most recently from 66813f1 to 240a917 Compare September 8, 2024 01:56
@renovate renovate bot force-pushed the renovate/wgpu-22.x branch 2 times, most recently from f96fece to 10983e5 Compare September 11, 2024 03:02
@renovate renovate bot force-pushed the renovate/wgpu-22.x branch 3 times, most recently from 52d0840 to cd77568 Compare September 20, 2024 14:48
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.

0 participants