Releases: gfx-rs/wgpu
v0.16.3
This release includes the crate wgpu. The crate wgpu-core is still at 0.16.1, wgpu-types and wgpu-hal are still at 0.16.2.
Changes
General
- Make the
Idtype that is exposed when using theexpose-idsfeature implementSendandSyncagain. This was unintentionally changed by the v0.16.0 release and is now fixed.
v0.16.2
This release includes wgpu, wgpu-hal, and wgpu-types. The crate wgpu-core are still at 0.16.1.
Changes
DX12
- Increase the
max_storage_buffers_per_shader_stageandmax_storage_textures_per_shader_stagelimits based on what the hardware supports. by @Elabajaba in [#3798]#3798
v0.16.1
This release includes wgpu, wgpu-core, and wgpu-hal. The crate wgpu-types are still at 0.16.0.
General
- Fix crash on dropping
wgpu::CommandBuffer. By @Wumpf in #3726. - Use
u32s internally for bind group indices, rather thanu8. By @ErichDonGubler in #3743.
GLES
WebGPU
v0.16.0
Major changes
Shader Changes
type has been replaced with alias to match with upstream WebGPU.
- type MyType = vec4<u32>;
+ alias MyType = vec4<u32>;TextureFormat info API
The TextureFormat::describe function was removed in favor of separate functions: block_dimensions, is_compressed, is_srgb, required_features, guaranteed_format_features, sample_type and block_size.
- let block_dimensions = format.describe().block_dimensions;
+ let block_dimensions = format.block_dimensions();
- let is_compressed = format.describe().is_compressed();
+ let is_compressed = format.is_compressed();
- let is_srgb = format.describe().srgb;
+ let is_srgb = format.is_srgb();
- let required_features = format.describe().required_features;
+ let required_features = format.required_features();Additionally guaranteed_format_features now takes a set of features to assume are enabled.
- let guaranteed_format_features = format.describe().guaranteed_format_features;
+ let guaranteed_format_features = format.guaranteed_format_features(device.features());Additionally sample_type and block_size now take an optional TextureAspect and return Options.
- let sample_type = format.describe().sample_type;
+ let sample_type = format.sample_type(None).expect("combined depth-stencil format requires specifying a TextureAspect");
- let block_size = format.describe().block_size;
+ let block_size = format.block_size(None).expect("combined depth-stencil format requires specifying a TextureAspect");BufferUsages::QUERY_RESOLVE
Buffers used as the destination argument of CommandEncoder::resolve_query_set now have to contain the QUERY_RESOLVE usage instead of the COPY_DST usage.
let destination = device.create_buffer(&wgpu::BufferDescriptor {
// ...
- usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ,
+ usage: wgpu::BufferUsages::QUERY_RESOLVE | wgpu::BufferUsages::MAP_READ,
mapped_at_creation: false,
});
command_encoder.resolve_query_set(&query_set, query_range, &destination, destination_offset);By @JolifantoBambla in #3489
Renamed features
The following Features have been renamed.
SHADER_FLOAT16->SHADER_F16SHADER_FLOAT64->SHADER_F64SHADER_INT16->SHADER_I16TEXTURE_COMPRESSION_ASTC_LDR->TEXTURE_COMPRESSION_ASTCWRITE_TIMESTAMP_INSIDE_PASSES->TIMESTAMP_QUERY_INSIDE_PASSES
Anisotropic Filtering
Anisotropic filtering has been brought in line with the spec. The anisotropic clamp is now a u16 (was a Option<u8>) which must be at least 1.
If the anisotropy clamp is not 1, all the filters in a sampler must be Linear.
SamplerDescriptor {
- anisotropic_clamp: None,
+ anisotropic_clamp: 1,
}By @cwfitzgerald in #3610.
TextureFormat Names
Some texture format names have changed to get back in line with the spec.
- TextureFormat::Bc6hRgbSfloat
+ TextureFormat::Bc6hRgbFloatBy @cwfitzgerald in #3671.
Misc Breaking Changes
- Change type of
mip_level_countandarray_layer_count(members ofTextureViewDescriptorandImageSubresourceRange) fromOption<NonZeroU32>toOption<u32>. By @teoxoy in #3445 - Change type of
bytes_per_rowandrows_per_image(members ofImageDataLayout) fromOption<NonZeroU32>toOption<u32>. By @teoxoy in #3529 - On Web,
Instance::create_surface_from_canvas()andcreate_surface_from_offscreen_canvas()now take the canvas by value. By @daxpedda in #3690
Changes
General
- Added
TextureFormatFeatureFlags::MULTISAMPLE_X16. By @Dinnerbone in #3454 - Added
BufferUsages::QUERY_RESOLVE. By @JolifantoBambla in #3489 - Support stencil-only views and copying to/from combined depth-stencil textures. By @teoxoy in #3436
- Added
Features::SHADER_EARLY_DEPTH_TEST. By @teoxoy in #3494 - All
fxhashdependencies have been replaced withrustc-hash. By @james7132 in #3502 - Allow copying of textures with copy-compatible formats. By @teoxoy in #3528
- Improve attachment related errors. By @cwfitzgerald in #3549
- Make error descriptions all upper case. By @cwfitzgerald in #3549
- Don't include ANSI terminal color escape sequences in shader module validation error messages. By @jimblandy in #3591
- Report error messages from DXC compile. By @Davidster in #3632
- Error in native when using a filterable
TextureSampleType::Floaton a multisampleBindingType::Texture. By @mockersf in #3686 - On Web, the size of the canvas is adjusted when using
Surface::configure(). If the canvas was given an explicit size (via CSS), this will not affect the visual size of the canvas. By @daxpedda in #3690
WebGPU
- Implement the new checks for readonly stencils. By @JCapucho in #3443
- Reimplement
adapter|device_features. By @jinleili in #3428 - Implement
command_encoder_resolve_query_set. By @JolifantoBambla in #3489 - Add support for
Features::RG11B10UFLOAT_RENDERABLE. By @mockersf in #3689
Vulkan
- Set
max_memory_allocation_sizeviaPhysicalDeviceMaintenance3Properties. By @jinleili in #3567 - Silence false-positive validation error about surface resizing. By @seabassjh in #3627
Bug Fixes
General
copyTextureToTexturesrc/dst aspects must both refer to all aspects of src/dst format. By @teoxoy in #3431- Validate before extracting texture selectors. By @teoxoy in #3487
- Fix fatal errors (those which panic even if an error handler is set) not including all of the details. By @kpreid in #3563
- Validate shader location clashes. By @emilk in #3613
- Fix surfaces not being dropped until exit. By @BenjaminSchaaf in #3647
WebGPU
- Fix handling of
Nonevalues fordepth_opsandstencil_opsinRenderPassDescriptor::depth_stencil_attachment. By @niklaskorz in #3660 - Avoid using
WasmAbifunctions for WebGPU backend. By @grovesNL in #3657
DX12
GLES
- Set FORCE_POINT_SIZE if it is vertex shader with mesh consist of point list. By @REASY in 3440
- Remove unwraps inside
surface.configure. By @cwfitzgerald in #3585 - Fix
copy_external_image_to_texture,copy_texture_to_textureandcopy_buffer_to_texturenot taking the specified index into account if the target texture is a cube map, 2D texture array or cube map array. By @daxpedda #3641 - Fix disabling of vertex attributes with non-consecutive locations. By @Azorlogh in #3706
Metal
- Fix metal erroring on an
array_strideof 0. By @teoxoy in #3538 create_texturereturns an error ifnew_texturereturns NULL. By @jinleili in #3554- Fix shader bounds checking being ignored. By @FL33TW00D in #3603
Vulkan
- Treat
VK_SUBOPTIMAL_KHRasVK_SUCCESSon Android due to rotation issues. By @James2022-rgb in #3525
Examples
- Use
BufferUsages::QUERY_RESOLVEinstead ofBufferUsages::COPY_DSTfor buffers used inCommandEncoder::resolve_query_setcalls inmipmapexample. By @JolifantoBambla in #3489
v0.15.3
This was released as wgpu-hal version 0.15.4 due to a previous publishing issue. All other crates remain unbumped
Bug Fixes
Metal
- Fix incorrect mipmap being sampled when using
MinLod <= 0.0andMaxLod >= 32.0or when the fragment shader samples different Lods in the same quad. By @cwfitzgerald in #3610.
GLES
- Fix
Vertex buffer is not big enough for the draw call.for ANGLE/Web when rendering with instance attributes on a single instance. By @Wumpf in #3596 - Reset all queue state between command buffers in a submit. By @jleibs #3589
- Reset the state of
SAMPLE_ALPHA_TO_COVERAGEon queue reset. By @jleibs #3589
v0.15.2
Bug Fixes
Metal
GLES
- Enable
WEBGL_debug_renderer_infobefore querying unmasked vendor/renderer to avoid crashing on emscripten by @coderedart in #3519
v0.15.1
Changes
General
Vulkan
DX12
- Update gpu allocator to 0.22. By @Elabajaba in #3447
WebGPU
- Implement
CommandEncoder::clear_buffer. By @raphlinus in #3426
Bug Fixes
General
- Re-sort supported surface formats based on srgb-ness. By @cwfitzgerald in #3444
Vulkan
DX12
- Fix DXC validation issues when using a custom
dxil_path. By @Elabajaba in #3434
GLES
- Unbind vertex buffers at end of renderpass. By @cwfitzgerald in #3459
WebGPU
Documentation
General
v0.15.0
Major Changes
WGSL Top-Level let is now const
All top level constants are now declared with const, catching up with the wgsl spec.
let is no longer allowed at the global scope, only within functions.
-let SOME_CONSTANT = 12.0;
+const SOME_CONSTANT = 12.0;See https://github.com/gfx-rs/naga/blob/master/CHANGELOG.md#v011-2023-01-25 for smaller shader improvements.
Surface Capabilities API
The various surface capability functions were combined into a single call that gives you all the capabilities.
- let formats = surface.get_supported_formats(&adapter);
- let present_modes = surface.get_supported_present_modes(&adapter);
- let alpha_modes = surface.get_supported_alpha_modes(&adapter);
+ let caps = surface.get_capabilities(&adapter);
+ let formats = caps.formats;
+ let present_modes = caps.present_modes;
+ let alpha_modes = caps.alpha_modes;Additionally Surface::get_default_config now returns an Option and returns None if the surface isn't supported by the adapter.
- let config = surface.get_default_config(&adapter);
+ let config = surface.get_default_config(&adapter).expect("Surface unsupported by adapter");Fallible surface creation
Instance::create_surface() now returns Result<Surface, CreateSurfaceError> instead of Surface. This allows an error to be returned if the given window is a HTML canvas and obtaining a WebGPU or WebGL 2 context fails. (No other platforms currently report any errors through this path.) By @kpreid in #3052
Queue::copy_external_image_to_texture on WebAssembly
A new api, Queue::copy_external_image_to_texture, allows you to create wgpu textures from various web image primitives. Specificically from HtmlVideoElement, HtmlCanvasElement, OffscreenCanvas, and ImageBitmap. This provides multiple low-copy ways of interacting with the browser. WebGL is also supported, though WebGL has some additional restrictions, represented by the UNRESTRICTED_EXTERNAL_IMAGE_COPIES downlevel flag. By @cwfitzgerald in #3288
Instance creation now takes InstanceDescriptor instead of Backends
Instance::new() and hub::Global::new() now take an InstanceDescriptor struct which cointains both the existing Backends selection as well as a new Dx12Compiler field for selecting which Dx12 shader compiler to use.
- let instance = Instance::new(wgpu::Backends::all());
+ let instance = Instance::new(wgpu::InstanceDescriptor {
+ backends: wgpu::Backends::all(),
+ dx12_shader_compiler: wgpu::Dx12Compiler::Fxc,
+ });Instance now also also implements Default, which uses wgpu::Backends::all() and wgpu::Dx12Compiler::Fxc for InstanceDescriptor
- let instance = Instance::new(wgpu::InstanceDescriptor {
- backends: wgpu::Backends::all(),
- dx12_shader_compiler: wgpu::Dx12Compiler::Fxc,
- });
+ let instance = Instance::default();By @Elabajaba in #3356
Texture Format Reinterpretation
The new view_formats field in the TextureDescriptor is used to specify a list of formats the texture can be re-interpreted to in a texture view. Currently only changing srgb-ness is allowed (ex. Rgba8Unorm <=> Rgba8UnormSrgb).
let texture = device.create_texture(&wgpu::TextureDescriptor {
// ...
format: TextureFormat::Rgba8UnormSrgb,
+ view_formats: &[TextureFormat::Rgba8Unorm],
});let config = wgpu::SurfaceConfiguration {
// ...
format: TextureFormat::Rgba8Unorm,
+ view_formats: vec![wgpu::TextureFormat::Rgba8UnormSrgb],
};
surface.configure(&device, &config);MSAA x2 and x8 Support
Via the TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES feature, MSAA x2 and x8 are now supported on textures. To query for x2 or x8 support, enable the feature and look at the texture format flags for the texture format of your choice.
DXC Shader Compiler Support for DX12
You can now choose to use the DXC compiler for DX12 instead of FXC. The DXC compiler is faster, less buggy, and allows for new features compared to the old, unmaintained FXC compiler.
You can choose which compiler to use at Instance creation using the dx12_shader_compiler field in the InstanceDescriptor struct. Note that DXC requires both dxcompiler.dll and dxil.dll, which can be downloaded from https://github.com/microsoft/DirectXShaderCompiler/releases. Both .dlls need to be shipped with your application when targeting DX12 and using the DXC compiler. If the .dlls can't be loaded, then it will fall back to the FXC compiler. By @39ali and @Elabajaba in #3356
Suballocate DX12 buffers and textures
The DX12 backend can now suballocate buffers and textures from larger chunks of memory, which can give a significant increase in performance (in testing a 100x improvement has been seen in a simple scene with 200 write_buffer calls per frame, and a 1.4x improvement in Bistro using Bevy).
Previously wgpu-hal's DX12 backend created a new heap on the GPU every time you called write_buffer (by calling CreateCommittedResource), whereas now it uses gpu_allocator to manage GPU memory (and calls CreatePlacedResource with a suballocated heap). By @Elabajaba in #3163
Backend selection by features in wgpu-core
Whereas wgpu-core used to automatically select backends to enable
based on the target OS and architecture, it now has separate features
to enable each backend:
- "metal", for the Metal API on macOS and iOS
- "vulkan", for the Vulkan API (Linux, some Android, and occasionally Windows)
- "dx12", for Microsoft's Direct3D 12 API
- "gles", OpenGL ES, available on many systems
- "dx11", for Microsoft's Direct3D 11 API
None are enabled by default, but the wgpu crate automatically
selects these features based on the target operating system and
architecture, using the same rules that wgpu-core used to, so users
of wgpu should be unaffected by this change. However, other crates
using wgpu-core directly will need to copy wgpu's logic or write
their own. See the [target] section of wgpu/Cargo.toml for
details.
Similarly, wgpu-core now has emscripten and renderdoc features
that wgpu enables on appropriate platforms.
In previous releases, the wgpu-core crate decided which backends to
support. However, this left wgpu-core's users with no way to
override those choices. (Firefox doesn't want the GLES back end, for
example.) There doesn't seem to be any way to have a crate select
backends based on target OS and architecture that users of that crate
can still override. Default features can't be selected based on the
target, for example. That implies that we should do the selection as
late in the dependency DAG as feasible. Having wgpu (and
wgpu-core's other dependents) choose backends seems like the best
option.
By @jimblandy in #3254.
Changes
General
- Convert all
DefaultImplementations on Enums toderive(Default) - Implement
DefaultforCompositeAlphaMode - New downlevel feature
UNRESTRICTED_INDEX_BUFFERto indicate support for usingINDEXtogether with other non-copy/map usages (unsupported on WebGL). By @Wumpf in #3157 - Add missing
DEPTH_BIAS_CLAMPandFULL_DRAW_INDEX_UINT32downlevel flags. By @teoxoy in #3316 - Combine
Surface::get_supported_formats,Surface::get_supported_present_modes, andSurface::get_supported_alpha_modesintoSurface::get_capabilitiesandSurfaceCapabilities. By @cwfitzgerald in #3157 - Make
Surface::get_default_configreturn an Option to prevent panics. By @cwfitzgerald in #3157 - Lower the
max_buffer_sizelimit value for compatibility with Apple2 and WebGPU compliance. By @jinleili in #3255 - Limits
min_uniform_buffer_offset_alignmentandmin_storage_buffer_offset_alignmentis now always at least 32. By @Wumpf #3262 - Dereferencing a buffer view is now marked inline. By @Wumpf in #3307
- The
strict_assertfamily of macros was moved towgpu-types. By @i509VCB in #3051 - Make
ObjectIdstructure and invariants idiomatic. By @teoxoy in #3347 - Add validation in accordance with WebGPU
GPUSamplerDescriptorvalid usage forlodMinClampandlodMaxClamp. By @James2022-rgb in #3353 - Remove panics in
Derefimplementations forQueueWriteBufferViewandBufferViewMut. Instead, warnings are logged, since reading from these types is not recommended. By @botahamec in [#3336] - Implement
view_formatsin the TextureDescriptor to match the WebGPU spec. By @jinleili in #3237 - Show more information in error message for non-aligned buffer bindings in WebGL #3414
- Update
TextureViewvalidation according to the WebGPU spec. By @teoxoy in #3410 - Implement
view_formatsin the SurfaceConfiguration to match the WebGPU spec. By @jinleili in #3409
Vulkan
- Set `WE...
v0.14.2
v0.14.1
This release includes wgpu-hal, and wgpu-types. The crates wgpu and wgpu-core are still at 0.14.0.
Bug Fixes
- Make
wgpu::TextureFormat::Depth24PlusStencil8available on all backends by making the feature unconditionally available and the feature unneeded to use the format. By @Healthire and @cwfitzgerald in #3165