diff --git a/CHANGELOG.md b/CHANGELOG.md index 5678c5760d..f7dc3ba79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -109,6 +109,7 @@ By @SupaMaggie70Incorporated in [#8206](https://github.com/gfx-rs/wgpu/pull/8206 - Added support for transient textures on Vulkan and Metal. By @opstic in [#8247](https://github.com/gfx-rs/wgpu/pull/8247) - Implement shader triangle barycentric coordinate builtins. By @atlv24 in [#8320](https://github.com/gfx-rs/wgpu/pull/8320). +- Added support for binding arrays of storage textures on Metal. By @msvbg in [#8464](https://github.com/gfx-rs/wgpu/pull/8464) ### Changes diff --git a/naga/src/back/msl/writer.rs b/naga/src/back/msl/writer.rs index 484142630d..50f5c86503 100644 --- a/naga/src/back/msl/writer.rs +++ b/naga/src/back/msl/writer.rs @@ -7099,9 +7099,11 @@ template } } crate::ImageClass::Storage { .. } => { - return Err(Error::UnsupportedArrayOf( - "read-write textures".to_string(), - )); + if options.lang_version < (3, 0) { + return Err(Error::UnsupportedArrayOf( + "read-write textures".to_string(), + )); + } } crate::ImageClass::External => { return Err(Error::UnsupportedArrayOf( diff --git a/tests/tests/wgpu-gpu/binding_array/storage_textures.rs b/tests/tests/wgpu-gpu/binding_array/storage_textures.rs index 69cec788c4..e27b9dc2a3 100644 --- a/tests/tests/wgpu-gpu/binding_array/storage_textures.rs +++ b/tests/tests/wgpu-gpu/binding_array/storage_textures.rs @@ -2,8 +2,8 @@ use std::num::NonZeroU32; use wgpu::*; use wgpu_test::{ - gpu_test, image::ReadbackBuffers, FailureCase, GpuTestConfiguration, GpuTestInitializer, - TestParameters, TestingContext, + gpu_test, image::ReadbackBuffers, GpuTestConfiguration, GpuTestInitializer, TestParameters, + TestingContext, }; pub fn all_tests(tests: &mut Vec) { @@ -26,8 +26,7 @@ static BINDING_ARRAY_STORAGE_TEXTURES: GpuTestConfiguration = GpuTestConfigurati .limits(Limits { max_binding_array_elements_per_shader_stage: 17, ..Limits::default() - }) - .expect_fail(FailureCase::backend(Backends::METAL)), + }), ) .run_async(|ctx| async move { binding_array_storage_textures(ctx, false).await }); @@ -45,8 +44,7 @@ static PARTIAL_BINDING_ARRAY_STORAGE_TEXTURES: GpuTestConfiguration = GpuTestCon .limits(Limits { max_binding_array_elements_per_shader_stage: 33, ..Limits::default() - }) - .expect_fail(FailureCase::backend(Backends::METAL)), + }), ) .run_async(|ctx| async move { binding_array_storage_textures(ctx, true).await }); diff --git a/wgpu-hal/src/metal/adapter.rs b/wgpu-hal/src/metal/adapter.rs index fa3d2fa8d4..bc0f8ead25 100644 --- a/wgpu-hal/src/metal/adapter.rs +++ b/wgpu-hal/src/metal/adapter.rs @@ -985,6 +985,13 @@ impl super::PrivateCapabilities { && self.supports_arrays_of_textures && self.argument_buffers as u64 >= MTLArgumentBuffersTier::Tier2 as u64, ); + features.set( + F::STORAGE_RESOURCE_BINDING_ARRAY, + self.msl_version >= MTLLanguageVersion::V3_0 + && self.supports_arrays_of_textures + && self.supports_arrays_of_textures_write + && self.argument_buffers as u64 >= MTLArgumentBuffersTier::Tier2 as u64, + ); features.set( F::SHADER_INT64, self.int64 && self.msl_version >= MTLLanguageVersion::V2_3,