Skip to content

Commit

Permalink
feat: add Instance::wgsl_language_features
Browse files Browse the repository at this point in the history
Signed-off-by: sagudev <[email protected]>
Co-Authored-By: Erich Gubler <[email protected]>
  • Loading branch information
sagudev and ErichDonGubler committed Jan 10, 2025
1 parent 2743e16 commit 72976f3
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ By @wumpf in [#6849](https://github.com/gfx-rs/wgpu/pull/6849).
- Move raytracing alignments into HAL instead of in core. By @Vecvec in [#6563](https://github.com/gfx-rs/wgpu/pull/6563).
- Allow for statically linking DXC rather than including separate `.dll` files. By @DouglasDwyer in [#6574](https://github.com/gfx-rs/wgpu/pull/6574).
- `DeviceType` and `AdapterInfo` now impl `Hash` by @cwfitzgerald in [#6868](https://github.com/gfx-rs/wgpu/pull/6868)
- Add `wgsl_language_features` for obtaining available WGSL language feature by @sagudev in [#6814](https://github.com/gfx-rs/wgpu/pull/6814)

#### Changes

Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions wgpu/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ optional = true

[dependencies]
arrayvec.workspace = true
bitflags.workspace = true
document-features.workspace = true
log.workspace = true
parking_lot.workspace = true
Expand Down
25 changes: 25 additions & 0 deletions wgpu/src/api/instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@ use crate::{dispatch::InstanceInterface, *};

use std::future::Future;

bitflags::bitflags! {
/// WGSL language extensions.
///
/// WGSL spec.: <https://www.w3.org/TR/WGSL/#language-extensions-sec>
#[derive(Debug, Clone, PartialEq, PartialOrd, Ord, Eq, Hash)]
pub struct WgslLanguageFeatures: u32 {
/// <https://www.w3.org/TR/WGSL/#language_extension-readonly_and_readwrite_storage_textures>
const ReadOnlyAndReadWriteStorageTextures = 1 << 0;
/// <https://www.w3.org/TR/WGSL/#language_extension-packed_4x8_integer_dot_product>
const Packed4x8IntegerDotProduct = 1 << 1;
/// <https://www.w3.org/TR/WGSL/#language_extension-unrestricted_pointer_parameters>
const UnrestrictedPointerParameters = 1 << 2;
/// <https://www.w3.org/TR/WGSL/#language_extension-pointer_composite_access>
const PointerCompositeAccess = 1 << 3;
}
}

/// Context for all other wgpu objects. Instance of wgpu.
///
/// This is the first thing you create when using wgpu.
Expand Down Expand Up @@ -385,4 +402,12 @@ impl Instance {
pub fn generate_report(&self) -> Option<wgc::global::GlobalReport> {
self.inner.as_core_opt().map(|ctx| ctx.generate_report())
}

/// Returns set of supported WGSL language extensions supported by this instance.
///
/// <https://www.w3.org/TR/webgpu/#gpuwgsllanguagefeatures>
#[cfg(feature = "wgsl")]
pub fn wgsl_language_features(&self) -> WgslLanguageFeatures {
self.inner.wgsl_language_features()
}
}
34 changes: 34 additions & 0 deletions wgpu/src/backend/webgpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1562,6 +1562,40 @@ impl dispatch::InstanceInterface for ContextWebGpu {
// Devices are automatically polled.
true
}

#[cfg(feature = "wgsl")]
fn wgsl_language_features(&self) -> crate::WGSLLanguageFeatures {
let mut wgsl_language_features = crate::WGSLLanguageFeatures::empty();
if let Some(gpu) = &self.gpu {
gpu.wgsl_language_features()
.keys()
.into_iter()
.map(|wlf| wlf.expect("`WGSLLanguageFeatures` elements should be valid"))
.map(|wlf| {
wlf.as_string()
.expect("`WGSLLanguageFeatures` should be string set")
})
.filter_map(|wlf| match wlf.as_str() {
"readonly_and_readwrite_storage_textures" => {
Some(crate::WGSLLanguageFeatures::ReadOnlyAndReadWriteStorageTextures)
}
"packed_4x8_integer_dot_product" => {
Some(crate::WGSLLanguageFeatures::Packed4x8IntegerDotProduct)
}
"unrestricted_pointer_parameters" => {
Some(crate::WGSLLanguageFeatures::UnrestrictedPointerParameters)
}
"pointer_composite_access" => {
Some(crate::WGSLLanguageFeatures::PointerCompositeAccess)
}
_ => None,
})
.for_each(|wlf| {
wgsl_language_features |= wlf;
})
}
wgsl_language_features
}
}

impl Drop for ContextWebGpu {
Expand Down
12 changes: 12 additions & 0 deletions wgpu/src/backend/wgpu_core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -851,6 +851,18 @@ impl dispatch::InstanceInterface for ContextWgpuCore {
Err(err) => self.handle_error_fatal(err, "Instance::poll_all_devices"),
}
}

#[cfg(feature = "wgsl")]
fn wgsl_language_features(&self) -> crate::WgslLanguageFeatures {
wgc::naga::front::wgsl::ImplementedLanguageExtension::all()
.iter()
.copied()
.fold(
crate::WgslLanguageFeatures::empty(),
#[allow(unreachable_code)]
|acc, wle| acc | match wle {},
)
}
}

impl dispatch::AdapterInterface for CoreAdapter {
Expand Down
3 changes: 3 additions & 0 deletions wgpu/src/dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ pub trait InstanceInterface: CommonTraits {
) -> Pin<Box<dyn RequestAdapterFuture>>;

fn poll_all_devices(&self, force_wait: bool) -> bool;

#[cfg(feature = "wgsl")]
fn wgsl_language_features(&self) -> crate::WgslLanguageFeatures;
}

pub trait AdapterInterface: CommonTraits {
Expand Down

0 comments on commit 72976f3

Please sign in to comment.