9080 Commits

Author SHA1 Message Date
Christian Legnitto
1ef9940114
Reduce repo MSRV from 1.85 to 1.84 (#7425)
* Reduce repo MSRV from 1.85 to 1.84

Fixes https://github.com/gfx-rs/wgpu/issues/7409

* Replace usage of task::Waker::noop()

* Gate waker code to `noop` feature

* Remove unused copied waker function

* Remove doctest from copied code
2025-03-27 14:25:19 -04:00
Daniel McNab
5a583b1fb7
Polyfill unpackUnorm4x8 and friends on unsupported GLSL versions (#7408) 2025-03-27 15:55:14 +00:00
Jamie Nicol
479173197e [naga hlsl-out msl-out spv-out] Avoid undefined behaviour when casting floats to integers
Currently we generate code to convert floating point values to integers
using constructor-style casts in HLSL, static_cast in MSL, and
OpConvertFToS/OpConvertFToU instructions in SPV. Unfortunately the
behaviour of these operations is undefined when the original value is
outside of the range of the target type.

This patch avoids undefined behaviour by first clamping the value to
be inside the target type's range, then performing the cast.
Additionally, we specifically clamp to the minimum and maximum values
that are exactly representable in both the original and the target
type, as per the WGSL spec[1]. Note that these may not be the same as
the minimum and maximum values of the target type.

We additionally must ensure we clamp in the same manner for
conversions during const evaluation. Lastly, although not part of the
WGSL spec, we do the same for casting from F64 and/or to I64 or U64.

[1] https://www.w3.org/TR/WGSL/#floating-point-conversion
2025-03-27 15:41:27 +00:00
dependabot[bot]
e63a51fdaf
chore(deps): bump the patch-updates group across 1 directory with 15 updates (#7441)
* chore(deps): bump the patch-updates group across 1 directory with 15 updates

Bumps the patch-updates group with 12 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [log](https://github.com/rust-lang/log) | `0.4.26` | `0.4.27` |
| [nanoserde](https://github.com/not-fl3/nanoserde) | `0.1.37` | `0.2.1` |
| [bytemuck_derive](https://github.com/Lokathor/bytemuck) | `1.8.1` | `1.9.2` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.16` | `1.2.17` |
| [clap](https://github.com/clap-rs/clap) | `4.5.32` | `4.5.33` |
| [icu_locid_transform_data](https://github.com/unicode-org/icu4x) | `1.5.0` | `1.5.1` |
| [icu_normalizer_data](https://github.com/unicode-org/icu4x) | `1.5.0` | `1.5.1` |
| [icu_properties_data](https://github.com/unicode-org/icu4x) | `1.5.0` | `1.5.1` |
| [jiff](https://github.com/BurntSushi/jiff) | `0.2.4` | `0.2.5` |
| [libm](https://github.com/rust-lang/libm) | `0.2.8` | `0.2.11` |
| [quick-xml](https://github.com/tafia/quick-xml) | `0.37.2` | `0.37.3` |
| [unicode-width](https://github.com/unicode-rs/unicode-width) | `0.1.14` | `0.2.0` |



Updates `log` from 0.4.26 to 0.4.27
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.26...0.4.27)

Updates `nanoserde` from 0.1.37 to 0.2.1
- [Commits](https://github.com/not-fl3/nanoserde/commits)

Updates `bytemuck_derive` from 1.8.1 to 1.9.2
- [Changelog](https://github.com/Lokathor/bytemuck/blob/main/changelog.md)
- [Commits](https://github.com/Lokathor/bytemuck/compare/bytemuck_derive-v1.8.1...bytemuck_derive-v1.9.2)

Updates `cc` from 1.2.16 to 1.2.17
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.16...cc-v1.2.17)

Updates `clap` from 4.5.32 to 4.5.33
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.32...clap_complete-v4.5.33)

Updates `clap_builder` from 4.5.32 to 4.5.33
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/v4.5.32...v4.5.33)

Updates `icu_locid_transform_data` from 1.5.0 to 1.5.1
- [Release notes](https://github.com/unicode-org/icu4x/releases)
- [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md)
- [Commits](https://github.com/unicode-org/icu4x/compare/icu@1.5.0...ind/icu_capi@1.5.1)

Updates `icu_normalizer_data` from 1.5.0 to 1.5.1
- [Release notes](https://github.com/unicode-org/icu4x/releases)
- [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md)
- [Commits](https://github.com/unicode-org/icu4x/compare/icu@1.5.0...ind/icu_capi@1.5.1)

Updates `icu_properties_data` from 1.5.0 to 1.5.1
- [Release notes](https://github.com/unicode-org/icu4x/releases)
- [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md)
- [Commits](https://github.com/unicode-org/icu4x/compare/icu@1.5.0...ind/icu_capi@1.5.1)

Updates `jiff` from 0.2.4 to 0.2.5
- [Release notes](https://github.com/BurntSushi/jiff/releases)
- [Changelog](https://github.com/BurntSushi/jiff/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/jiff/compare/jiff-static-0.2.4...jiff-static-0.2.5)

Updates `jiff-static` from 0.2.4 to 0.2.5
- [Release notes](https://github.com/BurntSushi/jiff/releases)
- [Changelog](https://github.com/BurntSushi/jiff/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/jiff/compare/jiff-static-0.2.4...jiff-static-0.2.5)

Updates `libm` from 0.2.8 to 0.2.11
- [Release notes](https://github.com/rust-lang/libm/releases)
- [Changelog](https://github.com/rust-lang/libm/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/libm/compare/0.2.8...libm-v0.2.11)

Updates `nanoserde-derive` from 0.1.22 to 0.2.1

Updates `quick-xml` from 0.37.2 to 0.37.3
- [Release notes](https://github.com/tafia/quick-xml/releases)
- [Changelog](https://github.com/tafia/quick-xml/blob/master/Changelog.md)
- [Commits](https://github.com/tafia/quick-xml/compare/v0.37.2...v0.37.3)

Updates `unicode-width` from 0.1.14 to 0.2.0
- [Commits](https://github.com/unicode-rs/unicode-width/compare/v0.1.14...v0.2.0)

---
updated-dependencies:
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: nanoserde
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: patch-updates
- dependency-name: bytemuck_derive
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: patch-updates
- dependency-name: cc
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: clap
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: clap_builder
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: icu_locid_transform_data
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: icu_normalizer_data
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: icu_properties_data
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: jiff
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: jiff-static
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: libm
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: nanoserde-derive
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: patch-updates
- dependency-name: quick-xml
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: patch-updates
- dependency-name: unicode-width
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>

* Add step to downgrade MSRV of dependencies

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
2025-03-26 21:28:22 +00:00
Erich Gubler
1d4740e89d build: upgrade ron 0.8.1 → 0.9.0 2025-03-26 16:03:03 -04:00
Erich Gubler
b3da513d51 chore(naga): remove unnecessary comment on version selection for ron 2025-03-26 16:03:03 -04:00
Erich Gubler
ded2e7f9f1 refactor(naga): use workspace version of ron 2025-03-26 16:03:03 -04:00
teoxoy
9a2b5fdb70 abstract away usage of scratch space for buffer barriers and unique index iterators 2025-03-26 18:26:31 +00:00
teoxoy
3705928273 [validate_draw] refactor out an is_bit_set function 2025-03-26 18:26:31 +00:00
teoxoy
7d15c511de move indirect validation code to its own folder
rename items appropriately
internalize indirect buffer bind groups
2025-03-26 18:26:31 +00:00
teoxoy
ef622c1061 validate multi draw indirect calls 2025-03-26 18:26:31 +00:00
teoxoy
2ab3b6da8d guarantee DownlevelFlags::COMPUTE_SHADERS when DownlevelFlags::INDIRECT_EXECUTION is enabled 2025-03-26 18:26:31 +00:00
teoxoy
a2878db5f2 add indirect_buffer_offsets test 2025-03-26 18:26:31 +00:00
teoxoy
0285e60984 Replace the indirect-validation feature with InstanceFlags::VALIDATION_INDIRECT_CALL.
With the only caveat that device creation will now panic if the `wgsl` feature is not enabled, `InstanceFlags::VALIDATION_INDIRECT_CALL` is set and the device supports `DownlevelFlags::INDIRECT_EXECUTION`.
2025-03-26 18:26:31 +00:00
teoxoy
53c2d15e0b implement indirect draw validation 2025-03-26 18:26:31 +00:00
Andy Leiserson
90afc88e76
[naga] Gracefully handle span lookup with no module source (#7390)
Fixes #7165
2025-03-26 11:19:11 -04:00
Jamie Nicol
e037f4bc48
[naga wgsl-in] Implement unary negation during const evaluation for Literal::F64 (#7431)
This not being implemented made it impossible to express negative f64
literals. This is now fixed, and we've added a test.
2025-03-26 08:18:52 -04:00
Jamie Nicol
7e0e1e2803
[naga wgsl-in] Clamp negative f16 values to 0 when converting to unsigned integers during const evaluation (#7421)
This avoids a panic due to f16::to_u32()/f16::to_u64() returning None
when the value of the f16 is <= -1.0. The correct behaviour when
converting from a floating point to an integer when the value is out
of range is to clamp to the nearest value that is representable in
both the source and destination type. ie zero for negative numbers.
2025-03-26 09:04:56 +00:00
Jim Blandy
61b70cfdb1
[naga] Check the type of ImageQuery::Size's level parameter. (#7426)
Require that the `level` operand of an `ImageQuery::Size` expression
is `i32` or `u32`, per spec.

Without this fix, the following WGSL:

    @group(0) @binding(0)
    var t: texture_1d<f32>;
    fn f() -> u32 {
      return textureDimensions(t, false);
    }

produces the following invalid HLSL:

    Texture1D<float4> t : register(t0);

    uint NagaMipDimensions1D(Texture1D<float4> tex, uint mip_level)
    {
        uint4 ret;
        tex.GetDimensions(mip_level, ret.x, ret.y);
        return ret.x;
    }

    uint f()
    {
        return NagaMipDimensions1D(t, false);
    }
2025-03-26 03:38:38 +00:00
Zachary Harrold
175b66c796
Update codespan-reporting to 0.12 (#7398)
* Update `codespan-reporting` to 0.12

* Use explicit path for `term::termcolor`

* Revert changes to `Cargo.lock`
2025-03-26 02:10:30 +00:00
Jamie Nicol
7b6ff5f554
[naga wgsl-out] Represent min value i64 literals as -9223372036854775807li - 1li (#7424)
ie the second-most negative value minus 1.

The most negative value of an integer type is not directly expressible
in WGSL, as it relies on applying the unary negation operator to a
value which is one larger than the largest value representable by the
type.

To avoid this issue for i32, we negate the required value as an
AbstractInt before converting to i32. AbstractInt, being 64 bits, is
capable of representing the maximum i32 value + 1.

However, for i64 this is not the case. Instead this patch makes us
express the mimimum i64 value as the second most negative i64 value,
minus 1, ie `-9223372036854775807li - 1li`, thereby avoiding the
issue.
2025-03-25 14:36:14 -04:00
sagudev
94dd3a7dc7
Fix some cfg guards (#7418)
All guards should actually refer to `wgpu_core` instead of `native`

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
2025-03-25 08:25:59 -04:00
Erich Gubler
299079fb69
chore: remove unnecessarily allow'd unused_braces (#7416) 2025-03-24 22:23:24 +00:00
Erich Gubler
958528fb14
fix(wgsl-in): increase brace limit to 127 (#7412) 2025-03-24 21:43:21 +00:00
Erich Gubler
97dbdc7d75
fix(wgsl-in): allow f16s in overrides (#7411) 2025-03-24 16:06:27 -04:00
Jim Blandy
f0ff173f82
[naga] Implement constant evaluation for the cross builtin. (#7404)
Add support for `naga::ir::MathFunction::Cross` to
`naga::proc::constant_evaluator`.

In the tests:

- Change `naga/tests/in/wgsl/cross.wgsl` to use more interesting
  argument values. Rather than passing the same vector twice, which
  yields a cross product of zero, pass in the x and y unit vectors,
  whose cross product is the z unit vector. Update snapshot output.

- Replace `validation::bad_cross_builtin_args` with a new test,
  `builtin_cross_product_args`, that is written more in the style of
  the other tests in this module, and does not depend on the WGSL
  front end. Because this PR changes the behavior of the constant
  evaluator, this test stopped behaving as expected.

- In `wgsl_errors::check`, move a `panic!` out of a closure so that
  the `#[track_caller]` attribute works properly.
2025-03-24 10:55:22 +01:00
Christian Legnitto
10cd1ccd8c
[spv_in] Finish emitter after function arguments (#7397)
Fixes https://github.com/gfx-rs/wgpu/issues/7358.
2025-03-24 10:36:30 +01:00
Bruce Mitchener
ccaf9a84f8
Fix clippy::implicit_saturating_sub lints (#7395) 2025-03-22 13:17:34 -04:00
Bruce Mitchener
edd0ef80af
Fix clippy::manual_repeat_n lints (#7394) 2025-03-22 16:18:34 +00:00
Erich Gubler
1e172b2e14
test: repair multi-instance tests (#7388) 2025-03-21 13:25:31 -04:00
Connor Fitzgerald
c37a005f63
Make target defaults align with "butterfly" target set (#7379) 2025-03-21 11:41:06 -04:00
Jamie Nicol
894d0369b5
[naga spv-out msl-out hlsl-out] Make infinite loop workaround count down instead of up (#7372)
[naga spv-out msl-out hlsl-out] Make infinite loop workaround count down instead of up

To avoid generating code containing infinite loops, and therefore
incurring the wrath of undefined behaviour, we insert a counter into
each loop that will break after 2^64 iterations. This was previously
implemented as two u32 variables counting up from zero.

We have been informed that this construct can cause certain Intel
drivers to hang. Instead, we must count down from u32::MAX. Counting
down is more fun, anyway.

Co-authored-by: Erich Gubler <erichdongubler@gmail.com>
2025-03-21 08:24:17 +00:00
Bruce Mitchener
f89ede7cd8
[doc] Fix unbalanced backticks (#7385) 2025-03-21 03:03:37 +00:00
Bruce Mitchener
b7e7d7ce7a
Fix clippy::manual_contains lints (#7384) 2025-03-20 21:55:52 -04:00
Andy Leiserson
ebf87526dd
[doc] Correct the doc comment for Expression::FunctionArgument (#7382) 2025-03-20 19:29:44 -04:00
Jamie Nicol
3bbd97cf0d
[naga wgsl-in] Allow explicit cast from AbstractFloat to integer types (#7377)
And from either AbstractFloat or AbstractInt to bool.

AbstractFloat to integer was presumably not implemented as *automatic*
conversion between those types is not allowed. However, explicit
conversions (for example `i32(1.0)`) are allowed, and are implemented
during const evaluation using the same code path in
ConstantEvaluator::cast().

The integer conversion constructors treat AbstractFloats as any other
floating point type, meaning we must follow the scalar floating point
to integral conversion algorithm [1]. This specifies:

    To convert a floating point scalar value X to an integer scalar
    type T:
    * If X is a NaN, the result is an indeterminate value in T.
    * If X is exactly representable in the target type T, then the
      result is that value.
    * Otherwise, the result is the value in T closest to truncate(X)
      and also exactly representable in the original floating point
      type.

Fortunately a rust cast satisfies all these conditions apart from the
result being exactly representable in the original floating point
type. However, as i32::MIN, i32::MAX, u32::MIN, and u32::MAX are all
representable by f64 (the underlying type of AbstractFloat), this is
not an issue.

For i64 and u64 using a rust cast will not meet that requirement, but
as these types are not present in the WGSL spec we are free to ignore
that.

[1] https://www.w3.org/TR/WGSL/#floating-point-conversion
2025-03-20 15:28:30 -04:00
Connor Fitzgerald
79a5cd557c
Remove vestigial snapshot outputs (#7380) 2025-03-20 15:21:18 -04:00
Connor Fitzgerald
db4cb26858
Allow overriding instance flags in tests (#7374) 2025-03-20 11:35:54 -04:00
Jamie Nicol
187e1a6967 [naga wgsl-in] Reject vector constructors with incorrect number of components during const evaluation.
A vector constructor with multiple arguments is represented in IR as a
Compose expression. These can be nested, for example due to code such
as this: `vec4(1, vec3(2, vec2(3, 4)))`. The total number of
components of each argument must match the vector size, meaning
`vec4(1, 2, 3, 4, 5)` is invalid. The validation pass already catches
such occurences. However, validation runs after constant evaluation,
meaning this can cause issues if the expression is evaluated as part
of a const expression.

When applying an operation to a vector compose during const
evaluation, we typically "flatten" the vector using the function
`proc::flatten_compose()`. This silently truncates the list of
components to the size implied by the type, meaning invalid code is
accepted.

This patch validates that the total number of components in a Compose
expression, once flattened, matches the size implied by the type. We
do so once as each expression is registered to avoid needing to handle
this each time the expression is used in a const expression.

For nested compose expressions, the inner expressions will be registed
before the outer ones. This means we can trust that the size implied
by the inner expression's type is correct, as it will have already
been validated, and can therefore avoid recursing through each nested
expression when registering the outer expression.
2025-03-20 12:24:31 +00:00
Connor Fitzgerald
4687973c9a
Use bytemuck instead of slice::from_raw_parts for transmutes (#7376) 2025-03-19 22:05:21 -04:00
Christopher Fleetwood
c6286791fe
feat: implement F16 support in shaders (#5701)
Co-authored-by: FL33TW00D <fleetwoodpersonal@gmail.com>
Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
Co-authored-by: ErichDonGubler <erichdongubler@gmail.com>
2025-03-19 16:26:50 +00:00
Kevin Reid
b912232188 [naga] Make Level::next() public.
It doesn’t make sense to have `Level` public but not `Level::next()`.
2025-03-19 12:11:01 -04:00
Erich Gubler
47c72fa943 fix(wgsl-in,const-eval): use {float}::round_ties_even instead of polyfill for round 2025-03-19 11:21:57 -04:00
Jim Blandy
45b0df6adf [naga wgsl-in] Tweak logging in front::wgsl::lower::conversion. 2025-03-19 11:21:02 -04:00
Jim Blandy
e82f52135b [naga wgsl-in] Use common type-formatting code.
Remove the `naga::front::wgsl::to_wgsl` module. Instead, use the
implementations of `naga::common::wgsl`'s `TryToWgsl` and
`TypeContext` traits.
2025-03-19 11:21:02 -04:00
Jim Blandy
3ec38a0a15 [naga wgsl] Add TryToWgsl::to_wgsl_for_diagnostics.
Add a new method to the `naga::common::wgsl::TryToWgsl` trait,
`to_wgsl_for_diagnostics`, which always returns a `String`, falling
back to the `Debug` representation of the type if necessary.

Provide a custom implementation for `Scalar` that shows abstract types
in a reasonable way.
2025-03-19 11:21:02 -04:00
Jim Blandy
62d49918fd [naga wgsl] Provide defaults for TypeContext non-WGSL methods.
Provide default implementations for the `write_non_wgsl_inner` and
`write_non_wgsl_scalar` methods of `naga::common::wgsl::TypeContext`.

We will be implementing this trait for various types in the WGSL front
end and the validator, and almost all of these applications will need
basically identical implementations of these methods.
2025-03-19 11:21:02 -04:00
Jim Blandy
13b8036b89 [naga wgsl] Add string creation methods to TypeContext.
Add new default methods, `type_to_string`, `type_inner_to_string`, and
`resolution_to_string` to the `naga::common::wgsl::TypeResolution`
trait, for generating WGSL source strings from these types.
2025-03-19 11:21:02 -04:00
Jim Blandy
e17c0bdc17 [naga wgsl] Fix generics on naga::common::wgsl::TypeContext.
In `naga::common::wgsl::types`, move the type parameter `<W: Write>`
from the `TypeContext` trait itself to the individual methods of the
trait. It is very unlikely for Naga to need to be able to implement
`TypeContext`, but only for one particular kind of output stream.

The motivation for this change is that the old parameterization makes
it awkward to provide utility methods for generating `String`s on the
trait, which we do in subsequent commits. In order to write to a
`String`, such utility methods need `Self` to implement
`TypeContext<String>`, so you can add bounds to the methods like this:

    fn type_to_string(..., out: &mut W) -> ...
        where Self: TypeContext<String>
    {
        ... self.write(..., &mut string_buf)?;
    }

That will compile, but if you try to actually call it, Rust gets
confused. Remember, the above is not a method on
`TypeContext<String>`, it's a method on `TypeContext<W>` that uses
`TypeContext<String>` internally. So when you write
`ctx.type_to_string(...)`, Rust needs to decide whether `ctx`
implements `TypeContext<W>` for some completely unspecified `W`, and
asks for type annotations.

You could supply type annotations, but this would be basically
supplying some never-used type that implements `core::fmt::Write`.
Instead of

    ctx.type_to_string(handle)

you'd have to write

    TypeContext::<String>::type_to_string(ctx, handle)

which is dumb.

(I don't *think* this explanation belongs in the code, since it's an
explanation of a design *not* used, replaced by a design that's pretty
natural --- so I'll leave it here.)
2025-03-19 11:21:02 -04:00
Jim Blandy
fc6d6c6483 [naga wgsl] Add write_type_resolution method to TypeContext.
Add a new default method, `write_type_resolution`, to the
`naga::common::wgsl::TypeResolution` trait, for writing
`TypeResolution` values as WGSL.
2025-03-19 11:21:02 -04:00