Skip to content

Commit

Permalink
Implement wgsl_language_features in wgpu
Browse files Browse the repository at this point in the history
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
  • Loading branch information
sagudev committed Dec 30, 2024
1 parent 166777c commit e9ab502
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 0 deletions.
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 @@ -2,6 +2,23 @@ use parking_lot::Mutex;

use crate::{dispatch::InstanceInterface, *};

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;
}
}

use std::future::Future;

/// Context for all other wgpu objects. Instance of 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
10 changes: 10 additions & 0 deletions wgpu/src/backend/wgpu_core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,16 @@ 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 {
use wgc::naga::front::wgsl::WGSLLanguageExtension;
let wgsl_language_features = crate::WGSLLanguageFeatures::empty();
WGSLLanguageExtension::all()
.iter()
.for_each(|wle| match *wle {});
wgsl_language_features
}
}

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 e9ab502

Please sign in to comment.