Wgpu Versions Save

A cross-platform, safe, pure-Rust graphics API.

v0.20.0

1 week ago

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
  • 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

  • Implement the device_set_device_lost_callback method for ContextWebGpu. By @suti in #5438
  • Add support for storage texture access modes ReadOnly and ReadWrite. By @JolifantoBambla in #5434

GLES / OpenGL

  • Log an error when GLES texture format heuristics fail. By @PolyMeilex in #5266
  • Cache the sample count to keep get_texture_format_features cheap. By @Dinnerbone in #5346
  • Mark DEPTH32FLOAT_STENCIL8 as supported in GLES. By @Dinnerbone in #5370
  • Desktop GL now also supports TEXTURE_COMPRESSION_ETC2. By @Valaphee in #5568
  • Don't create a program for shader-clearing if that workaround isn't required. By @Dinnerbone in #5348.
  • OpenGL will now be preferred over OpenGL ES on EGL, making it consistent with WGL. By @valaphee in #5482
  • Fill out driver and driver_info, with the OpenGL flavor and version, similar to Vulkan. By @valaphee in #5482

Metal

  • Metal 3.0 and 3.1 detection. By @atlv24 in #5497

DX12

  • Shader Model 6.1-6.7 detection. By @atlv24 in #5498

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

  • Improved wgpu_hal documentation. By @jimblandy in #5516, #5524, #5562, #5563, #5566, #5617, #5618
  • Add mention of primitive restart in the description of PrimitiveState::strip_index_format. By @cpsdqs in #5350
  • Document precise behaviour of SourceLocation. By @stefnotch in #5386
  • Give short example of WGSL push_constant syntax. By @waywardmonkeys in #5393
  • Fix incorrect documentation of Limits::max_compute_workgroup_storage_size default value. By @atlv24 in #5601

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

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

v0.19.4

2 weeks ago

This release includes wgpu, wgpu-core, and wgpu-hal. All other crates are unchanged.

Bug Fixes

General

  • Don't depend on bind group and bind group layout entry order in backends. This caused incorrect command execution and, in some cases, crashes. By @ErichDonGubler in #5421.
  • Properly clean up all write_buffer/texture temporary resources. By @robtfm in #5413.
  • Fix deadlock in certain situations when mapping buffers using wgpu-profiler. By @cwfitzgerald in #5517

WebGPU

  • Correctly pass through timestamp queries to WebGPU. By @cwfitzgerald in #5527.

v0.19.3

2 months ago

This release includes wgpu, wgpu-core, and wgpu-hal. All other crates are unchanged.

Major Changes

Vendored WebGPU Bindings from web_sys

--cfg=web_sys_unstable_apis is no longer needed in your RUSTFLAGS to compile for WebGPU!!!

While WebGPU's javascript api is stable in the browsers, the web_sys bindings for WebGPU are still improving. As such they are hidden behind the special cfg --cfg=web_sys_unstable_apis and are not available by default. Everyone who wanted to use our WebGPU backend needed to enable this cfg in their RUSTFLAGS. This was very inconvenient and made it hard to use WebGPU, especially when WebGPU is enabled by default. Additionally, the unstable APIs don't adhere to semver, so there were repeated breakages.

To combat this problem we have decided to vendor the web_sys bindings for WebGPU within the crate. Notably we are not forking the bindings, merely vendoring, so any improvements we make to the bindings will be contributed directly to upstream web_sys.

By @cwfitzgerald in #5325.

Bug Fixes

General

  • Fix an issue where command encoders weren't properly freed if an error occurred during command encoding. By @ErichDonGubler in #5251.

Android

  • Fix linking error when targeting android without winit. By @ashdnazg in #5326.

v0.19.2

2 months ago

This release includes wgpu, wgpu-core, wgpu-hal, wgpu-types, and naga. All other crates are unchanged.

Added/New Features

General

  • wgpu::Id now implements PartialOrd/Ord allowing it to be put in BTreeMaps. By @cwfitzgerald and @9291Sam in #5176

OpenGL

  • Log an error when OpenGL texture format heuristics fail. By @PolyMeilex in #5266

wgsl-out

  • Learned to generate acceleration structure types. By @JMS55 in #5261

Documentation

  • Fix link in wgpu::Instance::create_surface documentation. By @HexoKnight in #5280.
  • Fix typo in wgpu::CommandEncoder::clear_buffer documentation. By @PWhiddy in #5281.
  • Surface configuration incorrectly claimed that wgpu::Instance::create_surface was unsafe. By @hackaugusto in #5265.

Bug Fixes

General

  • Device lost callbacks are invoked when replaced and when global is dropped. By @bradwerth in #5168
  • Fix performance regression when allocating a large amount of resources of the same type. By @nical in #5229
  • Fix docs.rs wasm32 builds. By @cwfitzgerald in #5310
  • Improve error message when binding count limit hit. By @hackaugusto in #5298
  • Remove an unnecessary clone during GLSL shader injestion. By @a1phyr in #5118.
  • Fix missing validation for Device::clear_buffer where offset + size > buffer.size was not checked when size was omitted. By @ErichDonGubler in #5282.

DX12

  • Fix panic! when dropping Instance without InstanceFlags::VALIDATION. By @hakolao in #5134

OpenGL

  • Fix internal format for the Etc2Rgba8Unorm format. By @andristarr in #5178
  • Try to load libX11.so.6 in addition to libX11.so on linux. #5307
  • Make use of GL_EXT_texture_shadow_lod to support sampling a cube depth texture with an explicit LOD. By @cmrschwarz in #5171.

glsl-in

  • Fix code generation from nested loops. By @cwfitzgerald and @teoxoy in #5311

v0.19.1

3 months ago

This release includes wgpu and wgpu-hal. The rest of the crates are unchanged since 0.19.0.

Bug Fixes

DX12

  • Properly register all swapchain buffers to prevent error on surface present. By @dtzxporter in #5091
  • Check for extra null states when creating resources. By @nical in #5096
  • Fix depth-only and stencil-only views causing crashes. By @teoxoy in #5100

OpenGL

  • In Surface::configure and Surface::present on Windows, fix the current GL context not being unset when releasing the lock that guards access to making the context current. This was causing other threads to panic when trying to make the context current. By @Imberflur in #5087.

WebGPU

  • Improve error message when compiling WebGPU backend on wasm without the web_sys_unstable_apis set. By @rukai in #5104

Documentation

  • Document Wayland specific behavior related to SurfaceTexture::present. By @i509VCB in #5093.

v0.19.0

3 months ago

This release includes:

  • wgpu
  • wgpu-core
  • wgpu-hal
  • wgpu-types
  • wgpu-info
  • naga (skipped from 0.14 to 0.19)
  • naga-cli (skipped from 0.14 to 0.19)
  • d3d12 (skipped from 0.7 to 0.19)

Improved Multithreading through internal use of Reference Counting

Large refactoring of wgpu’s internals aiming at reducing lock contention, and providing better performance when using wgpu on multiple threads.

Check the blog post!

By @gents83 in #3626 and thanks also to @jimblandy, @nical, @Wumpf, @Elabajaba & @cwfitzgerald

All Public Dependencies are Re-Exported

All of wgpu's public dependencies are now re-exported at the top level so that users don't need to take their own dependencies. This includes:

  • wgpu-core
  • wgpu-hal
  • naga
  • raw_window_handle
  • web_sys

Feature Flag Changes

WebGPU & WebGL in the same Binary

Enabling webgl no longer removes the webgpu backend.

Instead, there's a new (default enabled) webgpu feature that allows to explicitly opt-out of webgpu if so desired. If both webgl & webgpu are enabled, wgpu::Instance decides upon creation whether to target wgpu-core/WebGL or WebGPU. This means that adapter selection is not handled as with regular adapters, but still allows to decide at runtime whether webgpu or the webgl backend should be used using a single wasm binary. By @wumpf in #5044

naga-ir Dedicated Feature

The naga-ir feature has been added to allow you to add naga module shaders without guessing about what other features needed to be enabled to get access to it. By @cwfitzgerald in #5063.

expose-ids Feature available unconditionally

This feature allowed you to call global_id on any wgpu opaque handle to get a unique hashable identity for the given resource. This is now available without the feature flag. By @cwfitzgerald in #4841.

dx12 and metal Backend Crate Features

wgpu now exposes backend feature for the Direct3D 12 (dx12) and Metal (metal) backend. These are enabled by default, but don't do anything when not targeting the corresponding OS. By @daxpedda in #4815.

Direct3D 11 Backend Removal

This backend had no functionality, and with the recent support for GL on Desktop, which allows wgpu to run on older devices, there was no need to keep this backend. By @valaphee in #4828.

WGPU_ALLOW_UNDERLYING_NONCOMPLIANT_ADAPTER Environment Variable

This adds a way to allow a Vulkan driver which is non-compliant per VK_KHR_driver_properties to be enumerated. This is intended for testing new Vulkan drivers which are not Vulkan compliant yet. By @i509VCB in #4754.

DeviceExt::create_texture_with_data allows Mip-Major Data

Previously, DeviceExt::create_texture_with_data only allowed data to be provided in layer major order. There is now a order parameter which allows you to specify if the data is in layer major or mip major order.

    let tex = ctx.device.create_texture_with_data(
        &queue,
        &descriptor,
+       wgpu::util::TextureDataOrder::LayerMajor,
        src_data,
    );

By @cwfitzgerald in #4780.

Safe & unified Surface Creation

It is now possible to safely create a wgpu::Surface with wgpu::Instance::create_surface() by letting wgpu::Surface hold a lifetime to window. Passing an owned value window to Surface will return a wgpu::Surface<'static>.

All possible safe variants (owned windows and web canvases) are grouped using wgpu::SurfaceTarget. Conversion to wgpu::SurfaceTarget is automatic for any type implementing raw-window-handle's HasWindowHandle & HasDisplayHandle traits, i.e. most window types. For web canvas types this has to be done explicitly:

let surface: wgpu::Surface<'static> = instance.create_surface(wgpu::SurfaceTarget::Canvas(my_canvas))?;

All unsafe variants are now grouped under wgpu::Instance::create_surface_unsafe which takes the wgpu::SurfaceTargetUnsafe enum and always returns wgpu::Surface<'static>.

In order to create a wgpu::Surface<'static> without passing ownership of the window use wgpu::SurfaceTargetUnsafe::from_window:

let surface = unsafe {
  instance.create_surface_unsafe(wgpu::SurfaceTargetUnsafe::from_window(&my_window))?
};

The easiest way to make this code safe is to use shared ownership:

let window: Arc<winit::Window>;
// ...
let surface = instance.create_surface(my_window.clone())?;

All platform specific surface creation using points have moved into SurfaceTargetUnsafe as well. For example:

Safety by @daxpedda in #4597 Unification by @wumpf in #4984

Add partial Support for WGSL Abstract Types

Abstract types make numeric literals easier to use, by automatically converting literals and other constant expressions from abstract numeric types to concrete types when safe and necessary. For example, to build a vector of floating-point numbers, Naga previously made you write:

vec3<f32>(1.0, 2.0, 3.0)

With this change, you can now simply write:

vec3<f32>(1, 2, 3)

Even though the literals are abstract integers, Naga recognizes that it is safe and necessary to convert them to f32 values in order to build the vector. You can also use abstract values as initializers for global constants and global and local variables, like this:

var unit_x: vec2<f32> = vec2(1, 0);

The literals 1 and 0 are abstract integers, and the expression vec2(1, 0) is an abstract vector. However, Naga recognizes that it can convert that to the concrete type vec2<f32> to satisfy the given type of unit_x. The WGSL specification permits abstract integers and floating-point values in almost all contexts, but Naga's support for this is still incomplete. Many WGSL operators and builtin functions are specified to produce abstract results when applied to abstract inputs, but for now Naga simply concretizes them all before applying the operation. We will expand Naga's abstract type support in subsequent pull requests. As part of this work, the public types naga::ScalarKind and naga::Literal now have new variants, AbstractInt and AbstractFloat.

By @jimblandy in #4743, #4755.

Instance::enumerate_adapters now returns Vec<Adapter> instead of an ExactSizeIterator

This allows us to support WebGPU and WebGL in the same binary.

- let adapters: Vec<Adapter> = instance.enumerate_adapters(wgpu::Backends::all()).collect();
+ let adapters: Vec<Adapter> = instance.enumerate_adapters(wgpu::Backends::all());

By @wumpf in #5044

device.poll() now returns a MaintainResult instead of a bool

This is a forward looking change, as we plan to add more information to the MaintainResult in the future. This enum has the same data as the boolean, but with some useful helper functions.

- let queue_finished: bool = device.poll(wgpu::Maintain::Wait);
+ let queue_finished: bool = device.poll(wgpu::Maintain::Wait).is_queue_empty();

By @cwfitzgerald in #5053

New Features

General

  • Added DownlevelFlags::VERTEX_AND_INSTANCE_INDEX_RESPECTS_RESPECTIVE_FIRST_VALUE_IN_INDIRECT_DRAW to know if @builtin(vertex_index) and @builtin(instance_index) will respect the first_vertex / first_instance in indirect calls. If this is not present, both will always start counting from 0. Currently enabled on all backends except DX12. By @cwfitzgerald in #4722.
  • Added support for the FLOAT32_FILTERABLE feature (web and native, corresponds to WebGPU's float32-filterable). By @almarklein in #4759.
  • GPU buffer memory is released during "lose the device". By @bradwerth in #4851.
  • wgpu and wgpu-core cargo feature flags are now documented on docs.rs. By @wumpf in #4886.
  • DeviceLostClosure is guaranteed to be invoked exactly once. By @bradwerth in #4862.
  • Log vulkan validation layer messages during instance creation and destruction: By @exrook in #4586.
  • TextureFormat::block_size is deprecated, use TextureFormat::block_copy_size instead: By @wumpf in #4647.
  • Rename of DispatchIndirect, DrawIndexedIndirect, and DrawIndirect types in the wgpu::util module to DispatchIndirectArgs, DrawIndexedIndirectArgs, and DrawIndirectArgs. By @cwfitzgerald in #4723.
  • Make the size parameter of encoder.clear_buffer an Option<u64> instead of Option<NonZero<u64>>. By @nical in #4737.
  • Reduce the info log level noise. By @nical in #4769, #4711 and #4772
  • Rename features & limits fields of DeviceDescriptor to required_features & required_limits. By @teoxoy in #4803.
  • SurfaceConfiguration now exposes desired_maximum_frame_latency which was previously hard-coded to 2. By setting it to 1 you can reduce latency under the risk of making GPU & CPU work sequential. Currently, on DX12 this affects the MaximumFrameLatency, on all other backends except OpenGL the size of the swapchain (on OpenGL this has no effect). By @emilk & @wumpf in #4899

OpenGL

  • @builtin(instance_index) now properly reflects the range provided in the draw call instead of always counting from 0. By @cwfitzgerald in #4722.
  • Desktop GL now supports POLYGON_MODE_LINE and POLYGON_MODE_POINT. By @valaphee in #4836.

Naga

  • Naga's WGSL front end now allows operators to produce values with abstract types, rather than concretizing thir operands. By @jimblandy in #4850 and #4870.
  • Naga's WGSL front and back ends now have experimental support for 64-bit floating-point literals: 1.0lf denotes an f64 value. There has been experimental support for an f64 type for a while, but until now there was no syntax for writing literals with that type. As before, Naga module validation rejects f64 values unless naga::valid::Capabilities::FLOAT64 is requested. By @jimblandy in #4747.
  • Naga constant evaluation can now process binary operators whose operands are both vectors. By @jimblandy in #4861.
  • Add --bulk-validate option to Naga CLI. By @jimblandy in #4871.
  • Naga's cargo xtask validate now runs validation jobs in parallel, using the jobserver protocol to limit concurrency, and offers a validate all subcommand, which runs all available validation types. By @jimblandy in #4902.
  • Remove span and validate features. Always fully validate shader modules, and always track source positions for use in error messages. By @teoxoy in #4706.
  • Introduce a new Scalar struct type for use in Naga's IR, and update all frontend, middle, and backend code appropriately. By @jimblandy in #4673.
  • Add more metal keywords. By @fornwall in #4707.
  • Add a new naga::Literal variant, I64, for signed 64-bit literals. #4711.
  • Emit and init struct member padding always. By @ErichDonGubler in #4701.
  • In WGSL output, always include the i suffix on i32 literals. By @jimblandy in #4863.
  • In WGSL output, always include the f suffix on f32 literals. By @jimblandy in #4869.

Bug Fixes

General

  • BufferMappedRange trait is now WasmNotSendSync, i.e. it is Send/Sync if not on wasm or fragile-send-sync-non-atomic-wasm is enabled. By @wumpf in #4818.
  • Align wgpu_types::CompositeAlphaMode serde serialization to spec. By @littledivy in #4940.
  • Fix error message of ConfigureSurfaceError::TooLarge. By @Dinnerbone in #4960.
  • Fix dropping of DeviceLostCallbackC params. By @bradwerth in #5032.
  • Fixed a number of panics. By @nical in #4999, #5014, #5024, #5025, #5026, #5027, #5028 and #5042.
  • No longer validate surfaces against their allowed extent range on configure. This caused warnings that were almost impossible to avoid. As before, the resulting behavior depends on the compositor. By @wumpf in #4796.

DX12

  • Fixed D3D12_SUBRESOURCE_FOOTPRINT calculation for block compressed textures which caused a crash with Queue::write_texture on DX12. By @DTZxPorter in #4990.

Vulkan

  • Use VK_EXT_robustness2 only when not using an outdated intel iGPU driver. By @TheoDulka in #4602.

WebGPU

  • Allow calling BufferSlice::get_mapped_range multiple times on the same buffer slice (instead of throwing a Javascript exception). By @DouglasDwyer in #4726.

WGL

  • Create a hidden window per wgpu::Instance instead of sharing a global one. By @Zoxc in #4603

Naga

  • Make module compaction preserve the module's named types, even if they are unused. By @jimblandy in #4734.
  • Improve algorithm used by module compaction. By @jimblandy in #4662.
  • When reading GLSL, fix the argument types of the double-precision floating-point overloads of the dot, reflect, distance, and ldexp builtin functions. Correct the WGSL generated for constructing 64-bit floating-point matrices. Add tests for all the above. By @jimblandy in #4684.
  • Allow Naga's IR types to represent matrices with elements elements of any scalar kind. This makes it possible for Naga IR types to represent WGSL abstract matrices. By @jimblandy in #4735.
  • Preserve the source spans for constants and expressions correctly across module compaction. By @jimblandy in #4696.
  • Record the names of WGSL alias declarations in Naga IR Types. By @jimblandy in #4733.

Metal

  • Allow the COPY_SRC usage flag in surface configuration. By @Toqozz in #4852.

Examples

  • remove winit dependency from hello-compute example. By @psvri in #4699
  • hello-compute example fix failure with wgpu error: Validation Error if arguments are missing. By @vilcans in #4939.
  • Made the examples page not crash on Chrome on Android, and responsive to screen sizes. By @Dinnerbone in #4958.

v0.18.2

5 months ago

This release includes naga version 0.14.2. The crates wgpu-core, wgpu-hal are still at 0.18.1 and the crates wgpu and wgpu-types are still at 0.18.0.

Bug Fixes

Naga

  • When evaluating const-expressions and generating SPIR-V, properly handle Compose expressions whose operands are Splat expressions. Such expressions are created and marked as constant by the constant evaluator. By @jimblandy in #4695.

v0.18.1

5 months ago

This release includes the crates wgpu-core and wgpu-hal at 0.18.1, and naga at 0.14.1. The crates wgpu and wgpu-types are still at 0.18.0.

Bug Fixes

General

  • Fix panic in Surface::configure in debug builds. By @cwfitzgerald in #4635
  • Fix crash when all the following are true: By @teoxoy in ##4642
    • Passing a naga module directly to Device::create_shader_module.
    • InstanceFlags::DEBUG is enabled.

DX12

  • Always use HLSL 2018 when using DXC to compile HLSL shaders. By @daxpedda in #4629

Metal

  • In Metal Shading Language output, fix issue where local variables were sometimes using variable names from previous functions. By @DJMcNab in #4594

v0.18.0

6 months ago

Desktop OpenGL 3.3+ Support on Windows

We now support OpenGL on Windows! This brings support for a vast majority of the hardware that used to be covered by our DX11 backend. As of this writing we support OpenGL 3.3+, though there are efforts to reduce that further.

This allows us to cover the last 12 years of Intel GPUs (starting with Ivy Bridge; aka 3xxx), and the last 16 years of AMD (starting with Terascale; aka HD 2000) / NVidia GPUs (starting with Tesla; aka GeForce 8xxx).

By @Zoxc in #4248

Timestamp Queries Supported on Metal and OpenGL

Timestamp queries are now supported on both Metal and Desktop OpenGL. On Apple chips on Metal, they only support timestamp queries in command buffers or in the renderpass descriptor, they do not support them inside a pass.

Metal: By @Wumpf in #4008
OpenGL: By @Zoxc in #4267

Render/Compute Pass Query Writes

Addition of the TimestampWrites type to compute and render pass descriptors to allow profiling on tilers which do not support timestamps inside passes.

Added an example to demonstrate the various kinds of timestamps.

Additionally, metal now supports timestamp queries!

By @FL33TW00D & @wumpf in #3636.

Occlusion Queries

We now support binary occlusion queries! This allows you to determine if any of the draw calls within the query drew any pixels.

Use the new occlusion_query_set field on RenderPassDescriptor to give a query set that occlusion queries will write to.

let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
    // ...
+   occlusion_query_set: Some(&my_occlusion_query_set),
});

Within the renderpass do the following to write the occlusion query results to the query set at the given index:

rpass.begin_occlusion_query(index);
rpass.draw(...);
rpass.draw(...);
rpass.end_occlusion_query();

These are binary occlusion queries, so the result will be either 0 or an unspecified non-zero value.

By @Valaphee in #3402

Shader Improvements

// WGSL constant expressions are now supported!
const BLAH: u32 = 1u + 1u;

// `rgb10a2uint` and `bgra8unorm` can now be used as a storage image format.
var image: texture_storage_2d<rgb10a2uint, write>;
var image: texture_storage_2d<bgra8unorm, write>;

// You can now use dual source blending!
struct FragmentOutput{
    @location(0) source1: vec4<f32>,
    @location(0) @second_blend_source source2: vec4<f32>,
}

// `modf`/`frexp` now return structures
let result = modf(1.5);
result.fract == 0.5;
result.whole == 1.0;

let result = frexp(1.5);
result.fract == 0.75;
result.exponent == 2i;

// `modf`/`frexp` are currently disabled on GLSL and SPIR-V input.

Shader Validation Improvements

// Cannot get pointer to a workgroup variable
fn func(p: ptr<workgroup, u32>); // ERROR

// Cannot create Inf/NaN through constant expressions
const INF: f32 = 3.40282347e+38 + 1.0; // ERROR
const NAN: f32 = 0.0 / 0.0; // ERROR

// `outerProduct` function removed

// Error on repeated or missing `@workgroup_size()`
@workgroup_size(1) @workgroup_size(2) // ERROR
fn compute_main() {}

// Error on repeated attributes.
fn fragment_main(@location(0) @location(0) location_0: f32) // ERROR

RenderPass StoreOp is now Enumeration

wgpu::Operations::store used to be an underdocumented boolean value, causing misunderstandings of the effect of setting it to false.

The API now more closely resembles WebGPU which distinguishes between store and discard, see WebGPU spec on GPUStoreOp.

// ...
depth_ops: Some(wgpu::Operations {
    load: wgpu::LoadOp::Clear(1.0),
-   store: false,
+   store: wgpu::StoreOp::Discard,
}),
// ...

By @wumpf in #4147

Instance Descriptor Settings

The instance descriptor grew two more fields: flags and gles_minor_version.

flags allow you to toggle the underlying api validation layers, debug information about shaders and objects in capture programs, and the ability to discard lables

gles_minor_version is a rather niche feature that allows you to force the GLES backend to use a specific minor version, this is useful to get ANGLE to enable more than GLES 3.0.

let instance = wgpu::Instance::new(InstanceDescriptor {
    ...
+   flags: wgpu::InstanceFlags::default()
+   gles_minor_version: wgpu::Gles3MinorVersion::Automatic,
});

gles_minor_version: By @PJB3005 in #3998
flags: By @nical in #4230

Many New Examples!

Revamped Testing Suite

Our testing harness was completely revamped and now automatically runs against all gpus in the system, shows the expected status of every test, and is tolerant to flakes.

Additionally, we have filled out our CI to now run the latest versions of WARP and Mesa. This means we can test even more features on CI than before.

By @cwfitzgerald in #3873

The GLES backend is now optional on macOS

The angle feature flag has to be set for the GLES backend to be enabled on Windows & macOS.

By @teoxoy in #4185

Added/New Features

  • Re-export Naga. By @exrook in #4172
  • Add WinUI 3 SwapChainPanel support. By @ddrboxman in #4191

Changes

General

  • Omit texture store bound checks since they are no-ops if out of bounds on all APIs. By @teoxoy in #3975
  • Validate DownlevelFlags::READ_ONLY_DEPTH_STENCIL. By @teoxoy in #4031
  • Add validation in accordance with WebGPU setViewport valid usage for x, y and this.[[attachment_size]]. By @James2022-rgb in #4058
  • wgpu::CreateSurfaceError and wgpu::RequestDeviceError now give details of the failure, but no longer implement PartialEq and cannot be constructed. By @kpreid in #4066 and #4145
  • Make WGPU_POWER_PREF=none a valid value. By @fornwall in 4076
  • Support dual source blending in OpenGL ES, Metal, Vulkan & DX12. By @freqmod in 4022
  • Add stub support for device destroy and device validity. By @bradwerth in 4163 and in 4212
  • Add trace-level logging for most entry points in wgpu-core By @nical in 4183
  • Add Rgb10a2Uint format. By @teoxoy in 4199
  • Validate that resources are used on the right device. By @nical in 4207
  • Expose instance flags.
  • Add support for the bgra8unorm-storage feature. By @jinleili and @nical in #4228
  • Calls to lost devices now return DeviceError::Lost instead of DeviceError::Invalid. By @bradwerth in #4238
  • Let the "strict_asserts" feature enable check that wgpu-core's lock-ordering tokens are unique per thread. By @jimblandy in #4258
  • Allow filtering labels out before they are passed to GPU drivers by @nical in https://github.com/gfx-rs/wgpu/pull/4246

Vulkan

  • Rename wgpu_hal::vulkan::Instance::required_extensions to desired_extensions. By @jimblandy in #4115
  • Don't bother calling vkFreeCommandBuffers when vkDestroyCommandPool will take care of that for us. By @jimblandy in #4059

DX12

  • Bump gpu-allocator to 0.23. By @Elabajaba in #4198

Documentation

  • Use WGSL for VertexFormat example types. By @ScanMountGoat in #4035
  • Fix description of Features::TEXTURE_COMPRESSION_ASTC_HDR in #4157

Bug Fixes

General

  • Derive storage bindings via naga::StorageAccess instead of naga::GlobalUse. By @teoxoy in #3985.
  • Queue::on_submitted_work_done callbacks will now always be called after all previous BufferSlice::map_async callbacks, even when there are no active submissions. By @cwfitzgerald in #4036.
  • Fix clear texture views being leaked when wgpu::SurfaceTexture is dropped before it is presented. By @rajveermalviya in #4057.
  • Add Feature::SHADER_UNUSED_VERTEX_OUTPUT to allow unused vertex shader outputs. By @Aaron1011 in #4116.
  • Fix a panic in surface_configure. By @nical in #4220 and #4227

Vulkan

  • Fix enabling wgpu::Features::PARTIALLY_BOUND_BINDING_ARRAY not being actually enabled in vulkan backend. By @39ali in#3772.
  • Don't pass vk::InstanceCreateFlags::ENUMERATE_PORTABILITY_KHR unless the VK_KHR_portability_enumeration extension is available. By @jimblandy in#4038.
  • Enhancement of [#4038], using ash's definition instead of hard-coded c_str. By @hybcloud in#4044.
  • Enable vulkan presentation on (Linux) Intel Mesa >= v21.2. By @flukejones in#4110

DX12

  • DX12 doesn't support `Features::POLYGON_MODE_POINT``. By @teoxoy in #4032.
  • Set Features::VERTEX_WRITABLE_STORAGE based on the right feature level. By @teoxoy in #4033.

Metal

  • Ensure that MTLCommandEncoder calls endEncoding before it is deallocated. By @bradwerth in #4023

WebGPU

  • Ensure that limit requests and reporting is done correctly. By @OptimisticPeach in #4107
  • Validate usage of polygon mode. By @teoxoy in #4196

GLES

  • enable/disable blending per attachment only when available (on ES 3.2 or higher). By @teoxoy in #4234

Documentation

  • Add an overview of RenderPass and how render state works. By @kpreid in #4055

Examples

  • Created wgpu-example::utils module to contain misc functions and such that are common code but aren't part of the example framework. Add to it the functions output_image_wasm and output_image_native, both for outputting Vec<u8> RGBA images either to the disc or the web page. By @JustAnotherCodemonkey in #3885.
  • Removed capture example as it had issues (did not run on wasm) and has been replaced by render-to-texture (see above). By @JustAnotherCodemonkey in #3885.

v0.17.2

7 months ago

This release includes the crate wgpu and wgpu-hal only. The crates wgpu-core, and wgpu-types are still at 0.17.1.

Bug Fixes

Vulkan

  • Fix x11 hang while resizing on vulkan. @Azorlogh in #4184.